DocBit Notes チュートリアル

CharlesによるBinanceアプリのパケットキャプチャ失敗:証明書Pinningの解説

技術研究者やセキュリティ監査員が Charles や mitmproxy を使用して Binance アプリの HTTPS トラフィックをキャプチャ(傍受)しようとすると、アプリが接続を直接拒否するか、SSL エラーを報告することに気づくでしょう。これは、Binance が証明書 Pinning(SSL Pinning)を実装しているためです。このノートでは、このメカニズムを技術的な観点から説明します。アプリをダウンロードする場合は Binance公式サイト または Binance公式アプリ から進めてください。iPhone へのインストールについては iOSインストールチュートリアル を参照してください。

証明書 Pinning とは何か

通常の HTTPS 検証プロセス:

  1. アプリが接続を開始する
  2. サーバーが証明書を返す
  3. アプリは、その証明書がシステムで信頼されている認証局(CA)によって署名されているかを確認する
  4. 信頼されている CA が署名したものであれば受け入れる

証明書 Pinning は、これより厳格なチェックを行います:

  1. アプリの内部に「期待される証明書のフィンガープリント」をあらかじめ組み込んでおく
  2. サーバーが証明書を返した後、アプリは CA だけでなく、組み込まれたフィンガープリントと一致するかも確認する
  3. 一致しない場合 → 接続を拒否する

なぜ金融系アプリは Pinning を行うのか

中間者攻撃(Man-in-the-Middle Attack)を防ぐためです:

  • 攻撃者はユーザーを騙して自身のルート証明書をインストールさせる可能性がある
  • その後、自身の証明書を使用してトラフィックをハイジャックする
  • 通常の HTTPS 検証は(ルート証明書がホワイトリスト化されているため)通過してしまう
  • しかし、Pinning は(フィンガープリントが一致しないため)拒否する

Binance、銀行、PayPal などの金融系アプリは、一般的に Pinning を実装しています。

Charles / mitmproxy の動作メカニズム

Charles で HTTPS パケットをキャプチャする手順:

  1. デバイスに Charles のルート証明書をインストールし、信頼する
  2. プロキシ設定を Charles に向ける
  3. アプリがリクエストを送信する → Charles は自身の証明書を使用してターゲットを偽装する
  4. アプリが検証する:CA は信頼されている(Charles の証明書がインストールされているため)
  5. 通常のアプリは受け入れる → キャプチャ成功

しかし、Binance アプリはステップ 4 でもう一つのチェックを行います:

5'. 証明書のフィンガープリントを確認する → 一致しない → 拒否する

そのため、パケットキャプチャは失敗します。

パケットキャプチャ失敗の具体的な症状

現象 原因
アプリ起動後にローディングアイコンが回り続ける TLS ハンドシェイクが拒否された
チャート画面が空白になる WebSocket 接続が拒否された
API が接続エラーを返す 証明書の検証に失敗した
Charles に SSL Handshake Error が表示される 同上
アプリが直ちにクラッシュする(まれ) 例外処理が捕捉されていない

Pinning を回避するいくつかの方法

研究者は以下のような手法を用いることがあります:

  • Frida スクリプト:アプリ内の証明書検証ロジックを動的に置き換える
  • LSPosed / Magisk モジュール:変更を加えたコードを注入する
  • APK を逆コンパイルして dex を修正し、再パッケージ化する
  • PIN-SSL 修正ツールを使用する

これらはすべて root 化されたデバイスを必要とし、アプリの利用規約に違反します。Binance アプリのセキュリティメカニズムは、これらのツールを検知する可能性もあります。

一般ユーザーがこの問題に遭遇する理由

大多数のユーザーはパケットキャプチャを行うことはありませんが、いくつかの予期せぬ状況で遭遇することがあります:

シーン1 · 社内ネットワークで SSL インターセプトを行っている 企業がルーターレベルで HTTPS トラフィックを復号化し、監視を行っている場合:

  • 企業のルート証明書をすべての従業員デバイスにインストールする
  • トラフィックが復号化される
  • Binance アプリが接続を拒否する(フィンガープリントが異なるため)

判断方法:HTTPS 通信を必要とする他のアプリや銀行系アプリも繋がらないかどうかを確認します。

シーン2 · セキュリティソフトの HTTPS スキャン Kaspersky や Avast などのセキュリティソフトは、HTTPS トラフィックをスキャンすることがあります:

  • 中間者攻撃と似た仕組みを使用する
  • Binance アプリが拒否する可能性がある

対処法:セキュリティソフトの HTTPS スキャンを一時的に無効にします。

シーン3 · 「ネットワークアクセラレータ(加速器)」をインストールしている 一部の「アクセラレータ」は、実際にはトラフィックのプロキシとして機能しています:

  • ユーザーが知らないうちにルート証明書をインストールされている
  • パケットを傍受し、最適化(加速)する
  • Binance はこれを拒否する

対処法:出所の不明なアクセラレータをアンインストールします。

Pinning の更新メカニズム

証明書 Pinning のフィンガープリントは(Binance が証明書を更新する際に)変更されます:

  • 通常、アプリには複数のフィンガープリントが組み込まれている
  • 1つが無効になっても接続に影響はない
  • アプリのアップデート時に同期して更新される

長期間アプリをアップデートしないと、ある日 Pinning のフィンガープリントとサーバー証明書の両方が変更され、接続できなくなる可能性があります。

各クライアントの実装の違い

Binance の各プラットフォームにおける Pinning の厳格さ:

クライアント Pinning の厳格さ
Android アプリ 厳格
iOS アプリ 厳格
デスクトップクライアント 厳格
ブラウザ 実装なし(OSの信頼リストに依存)

ブラウザには Pinning がありません(これが、ブラウザでは中間者攻撃が可能であり、アプリでは不可能な理由です)。

キャプチャの代替手段

技術研究のための代替手段:

  • Binance 公式 API ドキュメントを使用する(公開されている)
  • SDK が提供するインターフェースを使用する
  • Web 版でキャプチャする(ブラウザの開発者ツール)
  • ネットワーク層でのキャプチャ(Wireshark。ただし暗号文しか見えない)

これらの方法は、いずれもアプリのセキュリティメカニズムを破壊する必要がありません。

セキュリティアドバイス

  • 出所の不明なルート証明書はインストールしない
  • 企業や公共の Wi-Fi で Binance アプリを使用する際は慎重に
  • セキュリティソフトの HTTPS スキャンと Binance が共存する場合、Binance をホワイトリストに追加する
  • 普段使用しているデバイスを root 化しない

FAQ

Q:Charles は Binance Web 版のパケットをキャプチャできますか? A:可能です(ブラウザには Pinning がないため)。ただし、見えるのは Web トラフィックのみで、アプリのものではありません。

Q:mitmproxy だけで Binance アプリの Pinning を無効にすることはできますか? A:mitmproxy 単独では不可能です。Frida などのツールと組み合わせる必要があります。

Q:iOS にエンタープライズ(企業用)ルート証明書をインストールした後、Binance はブロックされますか? A:その可能性があります。具体的な証明書が信頼チェーンに組み込まれているかどうかに依存します。

Q:root 化された Android でパケットキャプチャは可能ですか? A:Frida などのツールを使えば理論上は可能ですが、アプリの利用規約違反となります。

関連記事