以下の内容はhttps://cysec148.hatenablog.com/entry/2025/09/02/060709より取得しました。


第52回:SSLピンニングを解除して診断する方法

Hello there, ('ω')ノ

🛡 SSLピンニングとは?

SSLピンニング(Certificate Pinning)とは、アプリが通信時に接続先のサーバー証明書を検証する際、「特定の証明書や公開鍵と一致していないと接続しない」というセキュリティ機構です。

これにより、たとえ端末が信頼する証明書(=Burp Suiteなどのプロキシ証明書)を使っていても、アプリが“偽物”と判断して通信を拒否してしまいます。

✋ つまり、通信の盗聴・復号を防ぐための重要な防衛策なんですね。


🤔 なぜ診断で解除が必要なの?

セキュリティ診断の目的は、アプリがどんなデータを送受信しているかを確認し、脆弱な通信がないかをチェックすることです。

しかしSSLピンニングが有効だと、Burp Suiteなどを使っても通信内容を可視化できません

そこで、安全な検証環境下に限り、一時的にこのピン留め処理を解除(バイパス)して調査する必要があるのです。


🛠 方法:Fridaを使ってSSLピンニングを回避する

✅ 準備

  • Root化端末 または Fridaを使える非Root環境(仮想端末可)
  • Burp Suiteなどのプロキシ設定済み
  • Fridaサーバーが起動している

✏️ Fridaスクリプトの例(基本パターン)

Java.perform(function () {
    var X509TrustManager = Java.use("javax.net.ssl.X509TrustManager");
    var SSLContext = Java.use("javax.net.ssl.SSLContext");

    var TrustManager = Java.registerClass({
        name: "org.owasp.trust.TrustAllManager",
        implements: [X509TrustManager],
        methods: {
            checkClientTrusted: function (chain, authType) {},
            checkServerTrusted: function (chain, authType) {},
            getAcceptedIssuers: function () { return []; }
        }
    });

    var TrustManagers = [TrustManager.$new()];
    var SSLContextInit = SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom");

    SSLContextInit.implementation = function (keyManager, trustManager, secureRandom) {
        console.log("Bypassing SSL Pinning");
        SSLContextInit.call(this, keyManager, TrustManagers, secureRandom);
    };
});

▶️ 実行方法

frida -U -n com.example.targetapp -l ssl-bypass.js

実行後、アプリを操作すると通信内容がBurp Suiteで確認できるようになります。


🔁 他にもあるバイパス方法

✔️ 1. Frida用ユーティリティ「Objection」

objection -g com.example.targetapp explore
android sslpinning disable

→ ワンコマンドで代表的なSSLピンニング処理を無効化できます。


✔️ 2. Fridaで特定のピンチェック関数を上書き(OkHttp例)

Java.perform(function () {
    var PinningClass = Java.use("okhttp3.CertificatePinner");

    PinningClass.check.overload("java.lang.String", "java.util.List").implementation = function (host, peerCertificates) {
        console.log("[+] Bypassing SSL pinning for " + host);
    };
});

CertificatePinner を使ったSSLピンニングの処理を無効化します。


🧪 成功したかどうかの確認ポイント

  • アプリで特定の通信操作(ログイン、取得APIなど)を実行する
  • Burp Suiteの「HTTP history」タブにリクエスト・レスポンスが表示される
  • javax.net.ssl.SSLHandshakeException発生しない

✅ まとめ

  • SSLピンニングは、診断者から見た「暗号の壁」
  • 通信内容の安全性を評価するには、この壁を一時的に回避する必要がある
  • FridaやObjectionを使えば、Javaクラスやネイティブコードの中でピン留め処理を上書き可能
  • バイパスはあくまで**“診断用の安全な環境”でのみ実施する**こと!

🚫 注意:悪用は絶対にNG

この技術は非常に強力ですが、当然ながら不正アクセスやアプリ改ざんを目的とした使用は法律違反になります。

  • 対象アプリの許可を得た上で
  • 検証専用の端末と環境で
  • 脆弱性診断やセキュリティテストの目的でのみ使用しましょう

Best regards, (^^ゞ




以上の内容はhttps://cysec148.hatenablog.com/entry/2025/09/02/060709より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14