MASTG-TEST-0019 ネットワーク上のデータ暗号化のテスト (Testing Data Encryption on the Network)
概要
静的解析
セキュアプロトコルでのネットワークリクエストのテスト
まず、ソースコード内のすべてのネットワークリクエストを特定し、プレーンな HTTP URL が使用されていないことを確認する必要があります。機密情報は HttpsURLConnection
または SSLSocket
(TLS を使用したソケットレベル通信用) を使用して、セキュアチャネル上で送信されていることを確認します。
ネットワーク API 使用箇所のテスト
次に、セキュアな接続を行うはずである低レベル API (SSLSocket
など) を使用している場合でも、セキュアな実装が必要であることに注意してください。たとえば、SSLSocket
はホスト名を検証 しません 。ホスト名を検証するには getDefaultHostnameVerifier
を使用します。Android 開発者ドキュメントに コード例 があります。
クリアテキストトラフィックのテスト
次に、アプリがクリアテキスト HTTP トラフィックを許可していないことを確認する必要があります。Android 9 (API レベル 28) 以降、クリアテキスト HTTP トラフィックはデフォルトでブロックされます (デフォルトの Network Security Configuration のおかげで) が、アプリケーションがクリアテキストを送信できる方法はまだいくつかあります。
AndroidManifest.xml ファイルの
<application>
タグのandroid:usesCleartextTraffic
属性を設定します。なお Network Security Configuration を設定している場合、このフラグは無視されることに注意してください。Network Security Configuration を設定して、
<domain-config>
要素のcleartextTrafficPermitted
属性を true に設定することでクリアテキストトラフィックを有効にします。低レベル API (
Socket
など) を使用して、カスタム HTTP 接続をセットアップします。クロスプラットフォームフレームワーク (Flutter, Xamarin など) を使用します。これらは一般的に HTTP ライブラリ用の独自の実装を持っているためです。
上記のすべてのケースは全体として慎重に分析しなければなりません。たとえば、アプリが Android Manifest や Network Security Configuration でクリアテキストトラフィックを許可していなくても、実際にはまだ HTTP トラフィックを送信している可能性があります。低レベル API (Network Security Configuration が無視される) を使用している場合やクロスプラットフォームフレームワークが適切に設定されていない場合がそれにあたります。
詳細については記事 "Security with HTTPS and SSL" を参照してください。
動的解析
テスト対象アプリの送受信ネットワークトラフィックを傍受し、このトラフィックが暗号化されていることを確認します。以下のいずれかの方法でネットワークトラフィックを傍受できます。
ZAP や Burp Suite などの傍受プロキシですべての HTTP(S) と Websocket トラフィックをキャプチャし、すべてのリクエストが HTTP ではなく HTTPS を介して行われていることを確認します。
Burp や ZAP などの傍受プロキシは、主にウェブ関連のトラフィック (HTTP(S), Web Sockets, gRPC など) を表示します。しかし、Burp-non-HTTP-Extension などの Burp プラグインや mitm-relay というツールを使用して、XMPP やその他のプロトコルによる通信をデコードおよび可視化できます。
アプリケーションによっては証明書ピン留めのため Burp や ZAP などのプロキシで動作しないことがあります。このようなシナリオでは、 カスタム証明書ストアおよび証明書ピン留めのテスト (Testing Custom Certificate Stores and Certificate Pinning) をチェックしてください。
詳細については以下を参照してください。
Last updated
Was this helpful?