MetaのMessengerの証明書ピンニングを破る(macOS)
- MetaのmacOS向けMessengerアプリケーションは、スタンドアロンのデスクトップアプリケーションであるTexts.comのモデルに似ている。
- Texts.comでMetaプラットフォームのプロジェクトを率いるBatuhan İçözは、ネットワークリクエストを傍受することが最初の重要な段階だと考えた。
- Metaは証明書ピンニングを適用してセキュリティを強化し、MITM(中間者)攻撃によるサーバーリクエストの分析を防いでいる。
証明書ピンニングとは?
- プロキシクライアントを設定する際には、「認証局」を信頼するよう構成する必要がある。
- 認証局が発行した証明書を使って、リクエストに関する情報を傍受して復号できる。
- サービスが証明書ピンニングを実装すると、特定の認証局が発行した証明書だけを受け入れるため、ユーザー側の認証局が発行した証明書は使えなくなる。
基本動作
- 証明書ピンニングを無効化しない限り、すべてのリクエストは「内部エラー」として返され、プロキシソフトウェアには「SSLハンドシェイク失敗」と表示される。
- リクエストがライフサイクルを完了できないため、リクエストに関する情報を推測できない。
望ましい動作
- MITM攻撃を使って、ネットワークデバッグツールでリクエスト、レスポンス、ヘッダーを正常に読み取れるようにする。
可能なアプローチ
- 以前に機能した方法の1つは、バイナリ内のURL文字列を、TLSを実装していない安全でないセルフホストのエンドポイントに変更することだった。
- Fridaのような動的計測ライブラリを使うこともできるが、Messengerは特にフック時にクラッシュしやすい。
- Fridaを使うには複雑なデプロイ手順が伴う。
アプローチ
- MessengerをダウンロードしてApplicationsフォルダに移動した後、HopperにARMバイナリを取り込む。
- Hopperを使うと、バイナリの逆アセンブル、デコンパイル、再コンパイル、デバッグ、可視化ができる。
- 「SSLピンニング検証失敗」のような文字列を探し、修正を最小限に抑えようとする。
- 「Using custom sandbox -> turn off SSL verification」という文字列を見つけ、関連する関数を探して修正する。
- IsUsingSandbox関数が常にtrueを返すように設定して、証明書ピンニングを無効化する。
結果
- 新しい実行ファイルをエクスポートして署名を外した後、元のMessengerバイナリを新しいバイナリに置き換える。
- Messengerを再起動すると、プロキシツールにヘッダー、レスポンス本文、すべてのリクエスト情報が表示される。
- バイナリ97,477,728バイトのうち、わずか4バイトだけを修正してリクエストの傍受に成功した。
デプロイ
- バイナリをコンパイルした後、Batuhanに送る。
- Batuhanは署名証明書を受け取ってインストールし、アプリケーションに署名する。
- 署名が完了すると、自分のシステム上でそのバイナリを使って自分のリクエストを確認できる。
GN⁺の見解
- この記事は、セキュリティ研究者がMetaのMessengerアプリでどのように証明書ピンニングを回避するかについて、興味深い事例を提供している。
- 証明書ピンニングは中間者攻撃を防ぐ重要なセキュリティ機能だが、研究者がこれを回避する方法を見つけることは、セキュリティコミュニティに重要な洞察を与える。
- この技術は、開発者が自分のアプリやサービスのセキュリティを強化するのに役立つ可能性があり、セキュリティ脆弱性の発見と解決にも貢献しうる。
- ただし、このような研究が悪意ある目的に利用される可能性もあるため、研究結果を共有する際には慎重であるべきだ。
- 類似の機能を提供する他のツールとしては、WiresharkやBurp Suiteのようなネットワーク分析ツールがあり、これらはネットワークトラフィックの監視と分析に広く使われている。
1件のコメント
Hacker Newsの意見
法的側面への疑問
デコンパイルと再コンパイルの試み、そしてその献身
過去の技術の喪失
Meta の RE 防御に関する観察
IsUsingSandbox()を取り除くのは簡単だろうと述べている。サンドボックスモードでの証明書ピンニング
ランタイムバイナリチェックサムの有用性
プロキシツールの使用に関する質問
大企業アプリケーションのセキュリティ
Meta アプリのトラフィック傍受の可能性
トラフィック監視の重要性