MASTG-TEST-0282 安全でないカスタムトラスト評価 (Unsafe Custom Trust Evaluation)

概要

このテストは、Android アプリがカスタム TrustManager の一部として checkServerTrusted(...)arrow-up-right安全でない方法でarrow-up-right 使用し、その TrustManager を使用するように構成された接続で証明書バリデーションをスキップするかどうかを評価します。

このような安全でない実装は、攻撃者が有効な (または自己署名された) 証明書で MITM 攻撃 を実行し、アプリのトラフィックを傍受または改竄することを可能にします。

手順

  1. アプリをリバースエンジニアします (Java コードの逆コンパイル (Decompiling Java Code)arrow-up-right)。

  2. アプリに対して静的解析 (Android での静的解析 (Static Analysis on Android)arrow-up-right) ツールを実行し、checkServerTrusted(...) のすべての使用箇所を探します。

結果

出力には checkServerTrusted(...) が使用されている場所のリストを含みます。

評価

checkServerTrusted(...) がカスタム X509TrustManager に実装されており、サーバー証明書を正しく検証 しない 場合、そのテストは不合格です。

これには以下のようなケースを含みます。

  • NSC で十分であるのに、エラーが発生しやすい checkServerTrusted(...) を使用すること

  • 何もしないトラストマネージャ: checkServerTrusted(...) をオーバーライドして、たとえば証明書チェーンを検証せずにすぐに返したり、常に true を返すことで、バリデーションなしですべての証明書を受け入れます。

  • エラーを無視すること: バリデーションの失敗時に 適切な例外をスローarrow-up-right (例: CertificateExceptionarrow-up-rightIllegalArgumentExceptionarrow-up-right) することに失敗するか、それらをキャッチして抑制しています。

  • 完全なバリデーションの代わりに checkValidity()arrow-up-right を使用すること: checkValidity() のみに依存すると、証明書が有効期限切れか、まだ有効でないかをチェックしますが、トラストやホスト名の一致は検証 しません

  • 明示的にトラストを緩めること: 開発時やテスト時の利便性のために、トラストチェックを無効にして、自己署名証明書や信頼されていない証明書を受け入れます。

  • getAcceptedIssuers()arrow-up-right の誤用: 適切な処理を行わずに null または空の配列を返すと、発行者バリデーションを事実上無効になる可能性があります。

自動化ツールを使用してテストする場合、リバースエンジニアされたコードで報告されたすべての場所を検査して、正しくない実装を確認する必要があります (逆コンパイルされた Java コードのレビュー (Reviewing Decompiled Java Code)arrow-up-right)。

Last updated

Was this helpful?