いわゆる MITM (man-in-the-middle attack) と呼ばれる攻撃手法を応用してアプリのデバッグに使う
主に(Web)デバッギングプロキシというソフトウェアを使う方法論になる
- アプリやOSの HTTP(S) 通信を デバッギングProxy ソフトウェアを通るように設定する
- デバッギングProxy ソフトウェアで HTTPS を復号出来る様に自前のCAをOSにインストールする
- デバッギングProxy ソフトウェアで通信を覗く。必要に応じてリクエスト・レスポンスを改ざんする
Android は Wi-Fi 設定画面から Proxy を設定することが出来る。
ただし、この設定 Android 11 時点で Webブラウザや標準ライブラリなどにしか適用されない
Android バージョンに寄らず、3rdライブラリを用いて通信する場合も、アプリ側で参照しない限り使われない事が想定される
この為、透過型 Proxy (Transparent proxy)を用いて通信をデバッギングプロキシに向ける必要がある
この説明は mitm proxy のドキュメントが詳しい。
https://docs.mitmproxy.org/stable/howto-transparent/
macOS / Linux では OS のパケットフィルターを用いる。
Windows は標準機能でないので主に有償のプロプライエタリなソフトウェアを用いる。
補足として、デバッギングProxy側でも透過プロキシに対応したモードが必要。
デバッギングProxy で HTTPSの通信を復号する場合、通常以下の様な処理を行っている。
- 通信先サーバーからのHTTPS通信はデバッギングProxyで一端終端する(通常のHTTPS通信)
- デバッギングProxy内で通信内容を表示・改ざんする
- デバッギングProxyが通信先サーバーのドメイン名を詐称し、再暗号化した上でクライアントと通信する(ここでHTTPSの証明書が偽物になる)
デバッギングProxyでは通常正規の証明書は用意できないため、証明書エラーを握り潰す行儀の悪いアプリ以外では通信エラーとなる。
クライアントで偽証明書を信用させるため、デバッギングProxyが用意するCA証明書をインストールする必要がある。
Android アプリでの証明書の扱いは以下のドキュメントが詳しい。
https://developer.android.com/training/articles/security-config?hl=ja
Android 6 までであれば通常の手順で証明書をユーザCAとしてインストールをすると、全アプリで信用される。
Android 7 以降でアプリ設定無しで信用させるには、root 権限でシステムCAとしてインストールする必要がある
Android 7 以降でもアプリ側で network-security-config を設定することでユーザーCAを信用するようになる
設定例
<network-security-config>
<debug-overrides>
<trust-anchors>
<certificates src="system"/>
<certificates src="user"/> <!-- ユーザーCA を信用する -->
</trust-anchors>
</debug-overrides>
</network-security-config>
結論。 Android 6 環境を用意するか、network-security-config を設定しろ。
各デバッギングProxy ソフトウェアのドキュメントを参考のこと。
How to: Capture Android Traffic with Fiddler
https://www.telerik.com/blogs/how-to-capture-android-traffic-with-fiddler