Skip to content
This repository has been archived by the owner on Apr 12, 2023. It is now read-only.

OSのプロキシ設定を無視したHTTP接続を行っている #95

Closed
Guest126 opened this issue Mar 31, 2021 · 18 comments
Closed

OSのプロキシ設定を無視したHTTP接続を行っている #95

Guest126 opened this issue Mar 31, 2021 · 18 comments
Assignees
Labels
enhancement 新しい機能や改善のリクエスト released リリースが完了したもの

Comments

@Guest126
Copy link

Guest126 commented Mar 31, 2021

不具合の内容 / Describe the bug

COCOA は一部の WebView 表示(規約関係)を除き、OS のプロキシ設定を無視し、直接のインターネット接続を行っています。

組織によってはセキュリティ上の理由から、直接のインターネット接続を遮断し、端末のインターネット接続をすべてフォワードプロキシ経由で行っているケースがあります(IPAによる模式図)。このような環境下で COCOA は利用者の意図に反してプロキシを経由しないため、診断キーサーバーとの通信が遮断され、濃厚接触を判定・通知できないと思われます。

再現手順 / Steps to reproduce

  1. OWASP ZAP や mitimproxy といった診断用ローカルプロキシを PC で設定する
  2. COCOA インストール端末でプロキシへの接続設定を行う
  3. プロキシの root 証明書を端末にインストールする
  4. COCOA を起動し、一通りの画面遷移を行う
  5. プロキシに記録された HTTP 接続を確認する

期待される挙動 / Expected behavior

OSのプロキシ設定に準じたHTTP接続を行う

またはアプリ自体にプロキシ設定機能を持たせる

スクリーンショット / Screenshots

N/A

動作環境 / Environments

  • デバイス:NoxPlayer
  • OS:Android OS 7.1.2
  • バージョン:1.2.2

その他 / Additional context

OWASP モバイルセキュリティテストガイドによると、これは Xamarin アプリの標準仕様のようです。

Xamarin アプリをテストするときに Wi-Fi 設定でシステムプロキシを設定しようとすると、傍受プロキシで HTTP リクエストを見ることができなくなります。Xamarin により作成されたアプリはスマホのローカルプロキシ設定を使用しないためです。これを解決する方法は三つあります。

iOS でも同様の可能性がありますが、実機でどうなるかまでは確認していません。

この仕様があり #85 の再現テストが難しくなっています。


Internal Tracking ID: PRODUCT BACKLOG ITEM 1785

@keiji
Copy link
Collaborator

keiji commented Mar 31, 2021

接触確認APIは、プライバシーに密接に関わる情報を取り扱うという性質上、プロキシーを使うことで通信が傍受できてしまうことの方が問題であるとぼくは認識しています。

ご指摘の内容はCOCOAの正常動作であると考えます。

@heykuro @halsk
何かあれば補足をお願いします。

@ghost
Copy link

ghost commented Mar 31, 2021

@keiji
プロキシを使うことと、ユーザCA を信頼するかどうかの問題とが混同されていないでしょうか。

正しくあるべきなのは、プロキシ設定は有効であるけれどもユーザCA は信頼しない
(network-security-config の設定に従う)というのが Android でのセキュリティモデルではないかと思います。
この場合は、プロキシサーバ上では暗号化された通信が単に中継されるだけなので
内容を解読することはできません。

iOS はたぶんそういう機能がないのでユーザCAをインストールできる環境では傍受できてしまいますが
それは一次的には OS 側の機能不足かと考えます
(別途 SSL Pinning などで防ぐことはできますが別のレイヤの話です)

@keiji
Copy link
Collaborator

keiji commented Mar 31, 2021

話を整理したいのですが、descriptionでは「傍受プロキシが使えないのでデバッグが難しくなっている」と言う趣旨で結んであるのですが、大事なのはタイトルにあるシステムのプロキシをアプリが使わない(無視する)と言うことでしょうか。

積極的に通信の傍受をしなかったとしても、プロキシサーバー経由して通信をしたときに、宛先サーバーや通信量、ネットワークへの接続時間帯から接触者であることが類推できる可能性があることが知られています。Googleのリファレンスサーバーではダミー(チャフ)リクエストを出すという方法が提案されていますね。

COCOAではプライバシーは一丁目一番地です。プロキシサーバーが使える利便性よりもユーザープライバシー保護を優先すべきかとぼくは考えます。

一方、プロキシサーバーを介しては通信できないよと周知することは重要であることはぼくも個人的に同意するところです。
そちらは運営に関する話になりますので、厚生労働省の所定の窓口にご連絡ください。

@heykuro @halsk
ぼく個人の見解は述べたとおりです。なにか相違などあれば補足をお願いします。

@ghost
Copy link

ghost commented Mar 31, 2021

比べるとしたら、リファレンスサーバの話よりは、Google / Apple のサンプルアプリの方で
proxy を拒否しているかどうかとか、iOS 版の EN Express の動作とかをみてみるべきなのかなとは
思いました。

個人的に困ってはいないですが、例えば感染者が入院先の病院の WiFi に接続した場合に
陽性者登録できないなどの問題が起きないかという懸念はあるわけなので、アナウンスはいると思います。

@tmurakami
Copy link

通信内容が傍受できてしまう件については、急ぎ issue を上げました。
ご確認下さい。

@Guest126
Copy link
Author

@b-wind さん

この状態で Android Emulator の設定から Proxy を指定すると Xamarin の通信のみHTTPSでも復号して見られます。

Android OS よりも下のレイヤーでプロキシ設定することで #85 の再現テストは可能ということですね。参考にします。

@keiji さん

接触確認APIは、プライバシーに密接に関わる情報を取り扱うという性質上、プロキシーを使うことで通信が傍受できてしまうことの方が問題であるとぼくは認識しています。

概念実証のために通信傍受用のプロキシを再現手順に起用したためそのように思われてしまったのかもしれませんが、その認識は事実とは異なります。通信傍受用のプロキシは標準で SSL/TLS を終端し HTTPS のサーバ証明書を書き換えてしまうので root 証明書をインストールする手順を入れていますが、サーバ証明書を書き換えずにパケットを転送する設定にすれば root 証明書をインストールする必要はありませんし、root 証明書をインストールしていなければ HTTPS 通信を解読されることはありません。

たとえプロキシを使わずとも、直接インターネットに繋がっているゲートウェイルータの方で通信をいくらでも傍受・類推できてしまいますので、プロキシの話と通信傍受の話は別物として切り離して考えてください。プロキシサーバを通過しないからといってプライバシーが保護されるということはありません。

話を整理したいのですが、descriptionでは「傍受プロキシが使えないのでデバッグが難しくなっている」と言う趣旨で結んであるのですが、大事なのはタイトルにあるシステムのプロキシをアプリが使わない(無視する)と言うことでしょうか。

デバッグについては「その他」のコンテキストですので重要ではありません。大事なのは、大企業や官公庁、教育機関等で採用されているであろうネットワーク構成で COCOA が機能しない可能性があるということです。こうした企業がどの程度あるのか客観的な数値は把握していませんが、昔から聞く話ですので、珍しくはないと考えています。

一方、プロキシサーバーを介しては通信できないよと周知することは重要であることはぼくも個人的に同意するところです。
そちらは運営に関する話になりますので、厚生労働省の所定の窓口にご連絡ください。

そうですね。現時点では本 Issue がどう着地するか分からないので、あとで連絡します。

@zipperpull さん

iOS はたぶんそういう機能がないのでユーザCAをインストールできる環境では傍受できてしまいますが

私の認識では Android OS も iOS も機能的には変わりないです。iOS でもプロキシの構成プロファイルと root 証明書(ユーザCA)の構成プロファイルは別個にインストールできるので、「プロキシ設定は有効であるけれどもユーザCA は信頼しない」ということは可能だと思います。

@ghost
Copy link

ghost commented Mar 31, 2021

@Guest126 さん
私の iOS 側の知識不足かもしれないです。すみません。

一応確認なのですが、iOS でルート証明書を追加した場合、OS設定で
証明書を自分で信頼する操作が必要になったところまでは認識しています。
https://support.apple.com/ja-jp/HT204477

iOS 9以前では、ネットワーク管理者が不明な場合や悪意がある場合にも
ルート証明書が自動的に信頼されてしまうために、意図しない傍受が可能だったのが、
この設定が追加されたことによって防げるようになったと思われます。

ですが、この機能でも、mitmproxy などで意図的にユーザが傍受したい場合には
信頼する設定をすることで傍受できてしまい、このユーザ証明書を信頼する操作を
アプリ側のコードでは拒否することができないのでは、という認識でいるため、

iOS はたぶんそういう機能がない

という記載としました(いずれにしても省きすぎていてわかりづらかったのはすみません)。

iOS の新しい機能で別途そういう機能があるのかもしれないのでもしご存知なら
リンクだけでも教えていただければありがたいです(自分でも調べてはみます)

追記: この話は #96 に書いた方がよかったですね。すみません

@keiji
Copy link
Collaborator

keiji commented Mar 31, 2021

@Guest126 さん
ぼくはこういうケースでは、ネットワークの経由は少ない方がいいと考えています。

「ゲートウェイで見る方法もあるのだからプロキシを制限する理由にはならない」と言う話であれば(もし違っていたらご指摘ください)、それはプロキシサーバーの制限を外す理由にはならないと考えています。

その上で、セキュリティ利便性を向上させることができるのは素晴らしいと思うので、両立できる案があれば、是非検討していきたいです。

デバッグについては @b-wind さんの手法で足りるでしょうか。

@Guest126
Copy link
Author

@zipperpull

ごめんなさい。私が一方的に勘違いしていました。OS 側でどの証明書を信頼するかではなく、アプリ側でどの証明書を信頼するか制御する機能が iOS にはないということですね。

@ghost
Copy link

ghost commented Mar 31, 2021

@keiji さん
私の認識では、

プロキシサーバーの制限を外す

というのが違っていて、そもそも Xamarin がデフォルトでは古い apache http client を使っているために

  • OS のプロキシ設定を無視している
  • ユーザCA証明書はデフォルトで全て信頼してしまう

という問題を引き起こしています。 @tmurakami さんがおっしゃる方法で HttpURLConnection を使うように
修正した場合、上記の逆で

  • OS のプロキシ設定が有効になる
  • ユーザCA証明書は信頼しない

という実装になるのが自然なのですが、あえてプロキシ設定されていても無視するように
実装するべきという意見がありますか?

@Guest126
Copy link
Author

@keiji さん

ぼくはこういうケースでは、ネットワークの経由は少ない方がいいと考えています。

例えば未だに COCOA が平文の HTTP 接続を用いているとかであればそういう考えもあると思うんですが、私が確認する限りではすべて暗号化された HTTPS 接続になっている上に、プロキシ設定は利用者が自ら設定するものですから、杞憂であると思います。

そこまでならプロキシを制限する理由も、あえてプロキシの制限を外す理由もないといったところだと思いますが、なにぶんプロキシ環境下で濃厚接触を判定・通知できないというリスクが大きすぎるので、制限を外す方向に持っていくのが望ましいと考えています。

@keiji
Copy link
Collaborator

keiji commented Mar 31, 2021

@Guest126 さんとしてはプロキシの制限は外すことが望ましいとのこと、@zipperpull さんはプロキシの設定を無視していることに特段の理由がなければ、よりモダンな通信ライブラリ(HttpURLConnection)に差し替えようという提案ですね。

プロキシの設定について制約を続けるにせよ、解除するにせよ、Apache HttpClientを廃止するのは、これは積極的に進めたいですね!

プロキシサーバーについては @heykuro @halsk にもお願いして確認してみます。しばらくお時間をください。

@keiji keiji added enhancement 新しい機能や改善のリクエスト waiting-for-confirmation 関係者に確認中のもの labels Mar 31, 2021
@Guest126
Copy link
Author

Guest126 commented Apr 1, 2021

@b-wind さん

1.i と 2.i は問題ないとして、1.ii は自己責任ですし、2.ii のケースは権利の侵害に関わる法的な論争になるので、一アプリ側で考慮すべき話ではないと考えています。

接触確認APIは、プライバシーに密接に関わる情報を取り扱うという性質上、プロキシーを使うことで通信が傍受できてしまうことの方が問題であるとぼくは認識しています。

という元々の発言自体に理論的な誤謬があるのは上で散々指摘されている通りで、それを前提にした検討は混乱のもとになります。

そもそも明確なポリシーがあって COCOA がプロキシを無視しているわけではなく、現在でも WebView を使った通信はプロキシを通っていることからも、これが COCOA の正常動作などではないことは明らかです。

@heykuro @halsk さんらの見解はどうなのでしょうか。@keiji さんの「やらない理由探し」に対してコミュニティで総ツッコミするパターンはコミュニティを疲弊させるだけで有意義な議論でも何でもないので有識者のコメントが欲しいのですが、それも難しいでしょうか。

@keiji
Copy link
Collaborator

keiji commented Apr 1, 2021

「やらない理由探し」というのは不本意ではありますが、そのように見えてしまっているのであれば改善したいと思います。

基本的にぼくは、それをする目的や、検討の過程にある不明点を明らかにしたいと考えて発言しています。

たとえば今回も「再現テストが難しい」とあったので、その目的でプロキシーを使うのであれば、プライバシー保護の目的にかなわないのではないかと述べています。もちろん、その後、プロキシーを使わないことがプライバシー保護の目的にかなわないと言うことは他の方からも指摘されているわけで、コミュニティの議論そのものは健全に機能しているなという認識でいました。

さて、これは @Guest126 さんに申し上げます。

別のIssueでも言っているのですが、ぼくはこのGitHubコミュニティを「認識に誤りがある」とか「技術的に間違ったことを言う」ことで責めを受けるような場所にするつもりはありませんし、そんなものはコミュニティではないと思っています。そういうことは会社とかでやればいいことです。

動く量の多い人間が、さまざまな方面から指摘を受けることは当然です。もし失敗をしないことが主眼になれば、それは何もしないことが第一選択肢となりますし、誰かから承認を得たり、指示を受けることでしか動かないことがもっとも安全です。

ぼくは以前、「日本Androidの会」というコミュニティで幹事(後の運営委員)をやっていました。その頃はどちらかというと @Guest126 さんのような立ち位置で、他の運営委員のやったことの間違いを指摘したり、トラブルの原因を探したりして、今のGuest126さんのように「彼のせいでコミュニティが疲弊する」といったような「個人 vs コミュニティ」という論戦を引いたこともあります。

周りからは強く「正しいことを言う」論客に見えていたのかもしれません。自分と意を同じくする人たちとTwitterで対立する運営に対する皮肉めいたことをツイートして、親しい人から窘められたこともあります。

今振り返ってみれば、当時の僕のやったことは大きな間違いだったと思います。そのときにぼくが起こしていた争いこそが、コミュニティを疲弊させる要因になっていたことに気づいたのは、ずいぶん後になってからのことです。このことを公の場で話したことはありませんが、ぼくの人生のなかで大きな反省点となっています。

根本的なことですが、コミュニティとは有志の集まりであり参加も離れることも自由です。
コミュニティというものは徹頭徹尾、そういうものだと考えています。

つまるところ、 @Guest126 さんにも他の方も、好きに参加して、自分にできることがあればそれをやり、だめだと思えば離れることができる。皆さんにはその自由があります。ぼくと応対することで疲弊するというのであれば、コミュニティを離れるという選択をされるのがよいと思います。もちろん、またやりたいと思えば戻ってきてください。喜んで歓迎します。

@Guest126
Copy link
Author

Guest126 commented Apr 2, 2021

@keiji さんの本音が聞けて嬉しいですが、本 Issue と関係ない話を続けても迷惑だと思うので、いったん無視しますね。

@Guest126
Copy link
Author

Guest126 commented Apr 2, 2021

本 Issue を進めるうえで @keiji さんにお願いしたいのは、当初の見解を堅持するのか、取り下げるのか、はっきりして欲しいということです。別に謝罪しろということではなく、もし認識を新たにしたのであればそのことをしっかり言ってもらわないと、しなくてもいい議論を繰り返すことになります。

@keiji
Copy link
Collaborator

keiji commented Apr 4, 2021

一連の検討を理解した上で、ぼくの見解をお伝えします。

現在のAndroid版のCOCOAは、プロキシサーバーの設定が反映されずに通信を行います。
そのため、プロキシサーバー経由でしか通信をできない環境では診断キーのダウンロードや陽性登録ができず、ユーザーに不利益が生じる可能性があります。

プロキシサーバーの設定が反映されない原因は、通信にApache HttpClientを利用していることにあります。
これはすでにdeprecatedになったライブラリで、AndroidManifest.xmlで利用を宣言しなければ原則、使うことができない(deprecatedよりも一段重い扱いの)ものです。

Apache HttpClientは、速やかにURLConnectionに置き換えるべきだとぼくは考えます。
そして、それによってプロキシサーバーの設定が有効になるのであれば、それはCOCOAにとっての改善であり、当初ぼくが示したプライバシー上の懸念には結びかないと考えます。

状況については #95 (comment) にあるとおりです。
確認が取れ次第、共有しますので今しばらくお待ちください。

@keiji keiji removed the waiting-for-confirmation 関係者に確認中のもの label Apr 5, 2021
@keiji
Copy link
Collaborator

keiji commented Apr 5, 2021

開発チームに確認した結果、課題を解決するため AndroidClientHandler へ切り替える方針となりました。

AndroidClientHandler への切り替えで、システムプロキシ設定の反映(本Issueの解決)とTLS 1.2以降への対応が可能になる見込みです。
なお、 #96 については引き続き検討していきますので、よろしくお願いします。

@keiji keiji added this to 陽性情報登録関連 / Positive Diagnosis in v1.2.4 - 202106 Apr 12, 2021
@keiji keiji moved this from 陽性情報登録関連 / Positive Diagnosis to リファクタリング / Refactoring in v1.2.4 - 202106 Apr 12, 2021
@keiji keiji added the ready-for-release マージが済み、リリース準備が完了しているもの label May 17, 2021
@keiji keiji added released リリースが完了したもの and removed ready-for-release マージが済み、リリース準備が完了しているもの labels Jun 7, 2021
@keiji keiji closed this as completed Jun 10, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
enhancement 新しい機能や改善のリクエスト released リリースが完了したもの
Projects
No open projects
v1.2.4 - 202106
リファクタリング / Refactoring
Development

No branches or pull requests

4 participants