MASTG-TEST-0022 カスタム証明書ストアおよび証明書ピン留めのテスト (Testing Custom Certificate Stores and Certificate Pinning)

概要

静的解析

Network Security Configuration

Network Security Configuration を調べて <pin-set> 要素を探します。 expiration の日付がないか調べます。有効期限が切れると、影響を受けるドメインでは証明書ピン留めが無効になります。

テストのヒント: 証明書ピン留めバリデーションチェックが失敗した場合、以下のイベントがシステムログ (システムログの監視 (Monitoring System Logs) を参照) にログ記録されるはずです。

I/X509Util: Failed to validate the certificate chain, error: Pin verification failed

TrustManager

証明書ピン留めの実装には主に三つのステップがあります。

  • 目的のホストの証明書を取得します。

  • 証明書が .bks フォーマットであることを確認します。

  • 証明書をデフォルトの Apache Httpclient のインスタンスにピン留めします。

証明書ピン留めの正しい実装を解析するには、HTTP クライアントがキーストアをロードする必要があります。

InputStream in = resources.openRawResource(certificateRawResource);
keyStore = KeyStore.getInstance("BKS");
keyStore.load(resourceStream, password);

キーストアがロードされると、キーストアの CA を信頼する TrustManager を使用できます。

アプリの実装は証明書の公開鍵のみに対してピン留め、証明書全体に対して、証明書チェーン全体に対してとさまざまです。

ネットワークライブラリと WebView

サードパーティーネットワークライブラリを使用するアプリケーションはライブラリの証明書ピン留め機能を利用できます。例えば、okhttp では CertificatePinner を使用して以下のようにセットアップできます。

WebView コンポーネントを使用するアプリケーションは WebViewClient のイベントハンドラを利用して、ターゲットリソースがロードされる前に各リクエストの何かしらの「証明書ピン留め」を行います。以下のコードは検証例を示しています。

あるいは、ピンが設定された OkHttpClient を使用し、それを WebViewClientshouldInterceptRequest をオーバーライドするプロキシとして機能させるのがよいでしょう。

Xamarin アプリケーション

Xamarin で開発されたアプリケーションは一般的に ServicePointManager を使用してピン留めを実装します。

通常、証明書をチェックする関数を作成し、 ServerCertificateValidationCallback メソッドにブール値を返します。

この例では証明書チェーンの中間 CA をピン留めしています。HTTP レスポンスの出力はシステムログにあります。

前述の例のサンプル Xamarin アプリは MASTG リポジトリ から入手できます。

APK ファイルを展開した後、dotPeak, ILSpy, dnSpy などの .NET 逆コンパイラを使用して、'Assemblies' フォルダ内に格納されているアプリ dll を逆コンパイルし、ServicePointManager の使用箇所を確認します。

詳しくはこちら。

Cordova アプリケーション

Cordova ベースのハイブリッドアプリケーションはネイティブに証明書ピン留めをサポートしていないため、プラグインを使用してこれを達成します。 もっとも一般的なものは PhoneGap SSL Certificate Checker です。check メソッドを使用してフィンガープリントを確認し、コールバックが次のステップを決定します。

APK ファイルを展開した後、Cordova/Phonegap ファイルは /assets/www フォルダに置かれます。'plugins' フォルダに使用するプラグインがあります。アプリケーションの JavaScript コードでこのメソッドを検索して、その使用箇所を確認する必要があります。

動的解析

エンドポイント同一性検証のテスト (Testing Endpoint Identify Verification) の指示に従います。これを行ってもトラフィックがプロキシされない場合、証明書ピン留めが実際に実装され、すべてのセキュリティ対策が実施されていることを意味しているかもしれません。すべてのドメインで同じことが起こるでしょうか?

簡単なスモークテストとしては、証明書ピン留めのバイパス (Bypassing Certificate Pinning) で説明しているように objection を使用して証明書ピン留めをバイパスしてみることができます。objection によってフックされているピン留め関連の API は objection の出力に表示されるはずです。

ただし、以下に注意してください。

  • API は完全ではないかもしれません。

  • 何もフックされていないとしても、必ずしもアプリがピン留めを実装していないとは限りません。

いずれの場合にも、アプリやそのコンポーネントの一部が objection でサポートされている 方法でカスタムピン留めを実装している可能性があります。具体的なピン留めの指標やより詳細なテストについては静的解析のセクションをご確認ください。

Last updated

Was this helpful?