AndroidアプリからセキュリティをテストするためにSSLトラフィックをインターセプトしようとしています。ユーザーが覗き見できないように証明書のピン留めを使用しています。トラフィックをルーティングするようにProxyDroidを構成してテストしました私のプロキシでは、FiddlerとCharlesの両方を使用しましたが、2つのプロキシサーバーソフトウェアで異なる結果が得られました。
Fiddlerを使用すると、トラフィックをインターセプトできず、アプリがサーバーに接続できません。 Fiddlerのルート証明書を手動で/ system/etc/security/cacertsにインポートして、システムのトラストストアに表示されることを確認しましたが、それでもアプリは正常に動作します。
ただし、Charlesを使用すると、ルート証明書をAndroid電話にインポートする必要さえありませんでした。そのまま、アプリとサーバー間のすべてのSSLトラフィックをインターセプトすることができました。
だから私の質問は、フィドラーができなくても、チャールズがこれをどのようにして達成できるのでしょうか?
CharlesプロキシがSSL/TLSトラフィックを傍受できる場合、証明書の検証は失敗しています。これは、モバイルデバイスがサーバーの証明書を適切に検証していないことを示しています。
モバイルセキュリティ評価では、プラットフォームのSSL/TLS実装をフックし、証明書の検証方法を変更することで、証明書のピン留めを無効にすることができます。この攻撃の例は Android SSLバイパス または iOS SSL killswitch です。
ほとんどの場合、アプリケーションの証明書ピン留めを実装している場合でもアプリケーショントラフィックを傍受することは可能ですが、Charlesプロキシを使用して傍受した場合はリクエストを暗号化する必要があります。ただし、Burpなどのプロキシを使用して、SSLBypass、SSL Trust Killer、iOS SSL Kill Switchを使用してトラフィックを傍受することは可能です。
アプリ用に作成した証明書固定コードに欠陥があるはずです。
証明書のピン留めが正しく行われた場合、アプリケーションを改ざんしていないと想定して、プロキシはトラフィックを傍受できません。
証明書のピン留めを実装する方法について、いくつかの優れた例を確認することをお勧めします here 。