Flutter
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Flutterは、開発者が単一のDartコードベースを書き、それをEngine(ネイティブC/C++)がAndroidおよびiOS向けのプラットフォーム固有の機械語に変換する、GoogleのクロスプラットフォームUIツールキットです。
EngineはDart VM、BoringSSL、Skiaなどをバンドルしており、共有ライブラリとしてlibflutter.so(Android)またはFlutter.framework(iOS)で配布されます。実際のネットワーキング(DNS、ソケット、TLS)はすべてこのライブラリ内で行われ、通常の Java/Kotlin や Swift/Obj-C レイヤーではありません。このサイロ化された設計が、通常のJavaレベルのFridaフックがFlutterアプリで失敗する理由です。
FlutterでのHTTPSトラフィックの傍受
これはこのblog postの要約です。
なぜFlutterでのHTTPS傍受は難しいのか
- SSL/TLS verification lives two layers down が BoringSSL 内にあり、JavaのSSL-pinning回避はこれに届きません。
- BoringSSL uses its own CA store が libflutter.so 内にあり、Burp/ZAP の CA を Android の system store にインポートしても何も変わりません。
- libflutter.so のシンボルは stripped & mangled されており、証明書検証関数が動的解析ツールから隠されています。
正確なFlutterスタックのフィンガープリント
バージョンを特定すれば、正しいバイナリを再ビルドしたり、パターン照合したりできます。
| Step | Command / File | Outcome |
|---|---|---|
| スナップショットハッシュを取得 | python3 get_snapshot_hash.py libapp.so | adb4292f3ec25… |
| ハッシュをEngineへマッピング | enginehash list in reFlutter | Flutter 3 · 7 · 12 + engine commit 1a65d409… |
| 依存コミットを取得 | DEPS file in that engine commit | • dart_revision → Dart v2 · 19 · 6• dart_boringssl_rev → BoringSSL 87f316d7… |
Find get_snapshot_hash.py here.
Target: ssl_crypto_x509_session_verify_cert_chain()
- Located in
ssl_x509.ccinside BoringSSL. - Returns
bool– a singletrueis enough to bypass the whole certificate chain check. - Same function exists on every CPU arch; only the opcodes differ.
Option A – Binary patching with reFlutter
- Clone the exact Engine & Dart sources for the app’s Flutter version.
- Regex-patch two hotspots:
ssl_x509.cc内で、強制的にreturn 1;とする。- (任意)
socket_android.cc内で、プロキシをハードコードする("10.0.2.2:8080")。
- libflutter.so を再コンパイルし、APK/IPAに差し替えて署名・インストールする。
- ビルド時間を数時間節約するため、一般的なバージョン向けのPre-patched builds が reFlutter の GitHub リリースで提供されています。
### Option B – Live hooking with Frida (the “hard-core” path) シンボルが stripped されているため、ロードされたモジュールをパターンスキャンしてその最初のバイト列を見つけ、実行時に戻り値を変更します。
// attach & locate libflutter.so
var flutter = Process.getModuleByName("libflutter.so");
// x86-64 pattern of the first 16 bytes of ssl_crypto_x509_session_verify_cert_chain
var sig = "55 41 57 41 56 41 55 41 54 53 48 83 EC 38 C6 02";
Memory.scan(flutter.base, flutter.size, sig, {
onMatch: function (addr) {
console.log("[+] found verifier at " + addr);
Interceptor.attach(addr, {
onLeave: function (retval) { retval.replace(0x1); } // always 'true'
});
},
onComplete: function () { console.log("scan done"); }
});
翻訳するファイルの内容をここに貼ってください。受け取ったら指定どおりにMarkdown構文やタグを維持して日本語へ翻訳します。
frida -U -f com.example.app -l bypass.js
移植のヒント
- For arm64-v8a or armv7, grab the first ~32 bytes of the function from Ghidra, convert to a space-separated hex string, and replace
sig. - Keep one pattern per Flutter release, store them in a cheat-sheet for fast reuse.
トラフィックを proxy 経由に強制する
Flutter 自体は device proxy settings を無視します。最も簡単な選択肢:
- Android Studio emulator: Settings ▶ Proxy → manual.
- 実機: evil Wi-Fi AP + DNS spoofing, or Magisk module editing
/etc/hosts.
Quick Flutter TLS bypass workflow (Frida Codeshare + system CA)
観察だけが目的で pinned Flutter API を追う場合、rooted/writable AVD、system-trusted proxy CA、および drop-in Frida スクリプトを組み合わせる方が、libflutter.so をリバースエンジニアリングするより速いことが多い:
-
Install your proxy CA in the system store. Follow Install Burp Certificate to hash/rename Burp’s DER certificate and push it into
/system/etc/security/cacerts/(writable/systemrequired). -
Drop a matching
frida-serverbinary and run it as root so it can attach to the Flutter process:
adb push frida-server-17.0.5-android-x86_64 /data/local/tmp/frida-server
adb shell "su -c 'chmod 755 /data/local/tmp/frida-server && /data/local/tmp/frida-server &'"
- ホスト側のツールをインストールして、ターゲットパッケージを列挙する。
pip3 install frida-tools --break-system-packages
adb shell pm list packages -f | grep target
- Codeshare フックを使って BoringSSL の pin checks を無効化して Flutter アプリを起動する。
frida -U -f com.example.target --codeshare TheDauntless/disable-flutter-tls-v1 --no-pause
The Codeshare スクリプトは Flutter の TLS verifier を上書きし、Burp の動的に生成された証明書を含むすべての証明書を受け入れ、public-key pin の比較を回避します。
- プロキシ経由でトラフィックをルーティングする。 エミュレータの Wi‑Fi proxy GUI を設定するか、
adb shell settings put global http_proxy 10.0.2.2:8080で強制する。直接ルーティングが失敗する場合はadb reverse tcp:8080 tcp:8080または host-only VPN を使う。
CA が OS レイヤで信頼され、Frida が Flutter の pinning ロジックを潰すと、Burp/mitmproxy は APK を再パッケージ化することなく API fuzzing(BOLA、トークン改竄など)に対する完全な可視性を取り戻します。
BoringSSL 検証のオフセットベースフック(シグネチャスキャン不要)
パターンベースのスクリプトがアーキテクチャ間(例: x86_64 と ARM)で失敗する場合、libflutter.so 内の絶対アドレスで BoringSSL のチェーン検証器を直接フックします。ワークフロー:
- APK から適切な ABI のライブラリを抽出する:
unzip -j app.apk "lib/*/libflutter.so" -d libs/でデバイスに合うもの(例:lib/x86_64/libflutter.so)を選ぶ。 - Ghidra/IDA で解析して検証器を特定する:
- ソース: BoringSSL ssl_x509.cc 関数
ssl_crypto_x509_session_verify_cert_chain(引数3、戻り値 bool)。 - stripped ビルドでは文字列 “ssl_client” を検索して XREF を調べる;3つのポインタっぽい引数を取り、bool を返す関数を特定する。
- ランタイムオフセットを算出する:Ghidra に表示された関数アドレスから解析時に使われたイメージベースを引いて相対オフセット(RVA)を得る。例:
0x02184644 - 0x00100000 = 0x02084644。 - ランタイムで base + offset にフックして成功を強制する:
// frida -U -f com.target.app -l bypass.js --no-pause
const base = Module.findBaseAddress('libflutter.so');
// Example offset from analysis. Recompute per build/arch.
const off = ptr('0x02084644');
const addr = base.add(off);
// ssl_crypto_x509_session_verify_cert_chain: 3 args, bool return
Interceptor.replace(addr, new NativeCallback(function (a, b, c) {
return 1; // true
}, 'int', ['pointer', 'pointer', 'pointer']));
console.log('[+] Hooked BoringSSL verify_cert_chain at', addr);
注意
- 各ターゲットビルドおよびCPUアーキテクチャごとにオフセットを再計算する。コンパイラ/codegenの差異がハードコードされたシグネチャを壊すため。
- このバイパスによりBoringSSLが任意のチェーンを受け入れ、Flutter内部のpins/CA trustに関係なくHTTPS MITMを可能にする。
- TLSブロッキングを確認するためにデバッグ中にトラフィックを強制ルーティングする場合、例えば:
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination <Burp_IP>:<Burp_Port>
…上記の hook は依然として必要です。検証は libflutter.so の内部で行われ、Android のシステムトラストストアでは行われません。
参考文献
- https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/
- Flutter SSL Bypass: How to Intercept HTTPS Traffic When all other Frida Scripts Fail
- BoringSSL ssl_x509.cc (ssl_crypto_x509_session_verify_cert_chain)
- SSL Pinning Bypass – Android
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
HackTricks

