MASTG-TEST-0282 安全でないカスタムトラスト評価 (Unsafe Custom Trust Evaluation)
概要
このテストは、Android アプリがカスタム TrustManager
の一部として checkServerTrusted(...)
を 安全でない方法で 使用し、その TrustManager
を使用するように構成された接続で証明書バリデーションをスキップするかどうかを評価します。
このような安全でない実装は、攻撃者が有効な (または自己署名された) 証明書で MITM 攻撃 を実行し、アプリのトラフィックを傍受または改竄することを可能にします。
手順
アプリをリバースエンジニアします (Java コードの逆コンパイル (Decompiling Java Code))。
アプリに対して静的解析 (Android での静的解析 (Static Analysis on Android)) ツールを実行し、
checkServerTrusted(...)
のすべての使用箇所を探します。
結果
出力には checkServerTrusted(...)
が使用されている場所のリストを含みます。
評価
checkServerTrusted(...)
がカスタム X509TrustManager
に実装されており、サーバー証明書を正しく検証 しない 場合、そのテストは不合格です。
これには以下のようなケースを含みます。
NSC で十分であるのに、エラーが発生しやすい
checkServerTrusted(...)
を使用すること。何もしないトラストマネージャ:
checkServerTrusted(...)
をオーバーライドして、たとえば証明書チェーンを検証せずにすぐに返したり、常にtrue
を返すことで、バリデーションなしですべての証明書を受け入れます。エラーを無視すること: バリデーションの失敗時に 適切な例外をスロー (例:
CertificateException
やIllegalArgumentException
) することに失敗するか、それらをキャッチして抑制しています。完全なバリデーションの代わりに
checkValidity()
を使用すること:checkValidity()
のみに依存すると、証明書が有効期限切れか、まだ有効でないかをチェックしますが、トラストやホスト名の一致は検証 しません。明示的にトラストを緩めること: 開発時やテスト時の利便性のために、トラストチェックを無効にして、自己署名証明書や信頼されていない証明書を受け入れます。
getAcceptedIssuers()
の誤用: 適切な処理を行わずにnull
または空の配列を返すと、発行者バリデーションを事実上無効になる可能性があります。
自動化ツールを使用してテストする場合、リバースエンジニアされたコードで報告されたすべての場所を検査して、正しくない実装を確認する必要があります (逆コンパイルされた Java コードのレビュー (Reviewing Decompiled Java Code))。
Last updated
Was this helpful?