universal-flutter-ssl-pinning
PyGhidra を使用して libflutter.so をリバースエンジニアリングし、SSL 証明書検証関数の位置を特定した後、Frida と Renef の両方に対応したすぐに使えるバイパススクリプトを生成します。
仕組み
- PyGhidra が
libflutter.so をヘッドレスで読み込み、定義されたすべての文字列から ssl_client をスキャンします。
- その文字列からのクロスリファレンスを解決し、それらを含む関数を特定します。
- 各関数をデコンパイルし、正確なパラメーター数を取得します。
- 3 パラメーターの関数が選択されます。これが
ssl_crypto_x509_session_verify_cert_chain です。
- その RVA を以下のスクリプトに埋め込みます:
- Frida スクリプト (
flutter_ssl_pinning.js) — 実行時に戻り値を ptr(1) (SSL_VERIFY_OK) にパッチします。
- Renef スクリプト (
flutter_ssl_pinning.lua) — Memory.patch を使用して関数エントリを MOV X0, #1 ; RET (ARM64) で上書きします。
必要条件
- Ghidra —
brew install ghidra
- pyghidra —
pip install pyghidra
- Frida —
pip install frida-tools または Renef — renef.io
環境変数 GHIDRA_INSTALL_DIR を設定するか、--ghidra-install-dir を指定してください。
使い方
# libflutter.so を解析し、両方のスクリプトを生成
python3 flutter_ssl_pinning.py libflutter.so
# Frida で実行
frida -U -f com.example.app -l flutter_ssl_pinning.js
# Renef で実行
renef -s com.example.app -l flutter_ssl_pinning.lua
オプション
出力ファイル
| ファイル | ツール | 仕組み |
|---|
flutter_ssl_pinning.js | Frida | + |
生成された出力のサンプルは example/ ディレクトリを参照してください。
動作確認環境
| ターゲット | 状態 |
|---|
| Google Flutter の (arm64-v8a) |
Google Flutter と Shorebird はどちらも同じ libflutter.so SSL エンジンを使用しています。
同じ Flutter エンジンバージョンでは、ビルドタイプに関係なく自動検出される RVA は同一です。
高速トラフィックキャプチャ(プロキシ不要)
プロキシベースの MITM のためにピンニングをバイパスするだけでなく、自己完結型の flutter_http_monitor.py を使用して、Frida 内で直接 復号化された HTTP トラフィックをキャプチャできます。
これは BoringSSL の SSL_write/SSL_read を libflutter.so (任意の Flutter バージョン、arm64) 内で自動的に特定し、平文のリクエストとレスポンス(再構築、チャンク解除、gzip 展開、JSON 整形済み)を出力する Frida スクリプトを生成します。
pip install capstone pyelftools
# バイナリをスキャンしてモニターを生成(.apk を渡すことも可能)
python3 flutter_http_monitor.py path/to/libflutter.so -o monitor.js
# アプリに対して実行
frida -U -f com.target.app -l monitor.js
オプションとして、Frida の REPL 内で addScope('api.example.com') を使用すると、特定のホストのみを監視できます(Burp スタイルのスコープ)。単一ファイルで、他に配布するものはありません。
免責事項
このツールは許可されたセキュリティ研究および侵入テストのみを目的としています。
自分が所有していない、または明示的な書面によるテスト許可を得ていないアプリに対しては使用しないでください。