Flutter
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Flutter è il toolkit UI cross-platform di Google che permette agli sviluppatori di scrivere una singola code-base in Dart che l’Engine (nativo C/C++) converte in codice macchina specifico per piattaforma per Android e iOS. L’Engine include una Dart VM, BoringSSL, Skia, ecc., e viene distribuito come libreria condivisa libflutter.so (Android) o Flutter.framework (iOS). Tutto il networking reale (DNS, sockets, TLS) avviene all’interno di questa libreria, non nei consueti layer Java/Kotlin Swift/Obj-C. Questa architettura isolata è il motivo per cui i tipici hook Frida a livello Java non funzionano sulle app Flutter.
Intercepting HTTPS traffic in Flutter
Questo è un riassunto di questo blog post.
Why HTTPS interception is tricky in Flutter
- La verifica SSL/TLS avviene due livelli più in basso in BoringSSL, quindi i bypass del SSL-pinning a livello Java non la toccano.
- BoringSSL usa il suo proprio store di CA dentro libflutter.so; importare la CA di Burp/ZAP nello store di sistema Android non cambia nulla.
- I simboli in libflutter.so sono rimossi e offuscati, nascondendo la funzione di verifica dei certificati agli strumenti dinamici.
Fingerprint the exact Flutter stack
Conoscere la versione permette di ricostruire o riconoscere i binari corretti tramite pattern.
| Step | Command / File | Outcome |
|---|---|---|
| Ottieni l’hash dello snapshot | python3 get_snapshot_hash.py libapp.so | adb4292f3ec25… |
| Associare hash → Engine | enginehash list in reFlutter | Flutter 3 · 7 · 12 + engine commit 1a65d409… |
| Recupera i commit dipendenti | DEPS file in that engine commit | • dart_revision → Dart v2 · 19 · 6• dart_boringssl_rev → BoringSSL 87f316d7… |
Find get_snapshot_hash.py here.
Obiettivo: ssl_crypto_x509_session_verify_cert_chain()
- Si trova in
ssl_x509.ccdentro BoringSSL. - Restituisce
bool– un singolotrueè sufficiente per bypassare l’intera verifica della catena di certificati. - La stessa funzione esiste su ogni arch CPU; cambiano solo gli opcode.
Opzione A – Patch binaria con reFlutter
- Clona le sorgenti esatte di Engine & Dart per la versione Flutter dell’app.
- Regex-patch due hotspot:
- In
ssl_x509.cc, forzarereturn 1; - (Opzionale) In
socket_android.cc, hard-code un proxy ("10.0.2.2:8080").
- Ricompila libflutter.so, reinseriscila nell’APK/IPA, firma, installa.
- Build pre-patchati per le versioni comuni sono forniti nelle release GitHub di reFlutter per risparmiare ore di tempo di compilazione.
Opzione B – Hooking live con Frida (la via “hard-core”)
Poiché il simbolo è rimosso e offuscato, esegui una scansione per pattern del modulo caricato sui suoi primi byte, quindi cambi il valore di ritorno al volo.
// 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"); }
});
Puoi incollare il contenuto di src/mobile-pentesting/android-app-pentesting/flutter.md che vuoi tradurre in italiano?
frida -U -f com.example.app -l bypass.js
Suggerimenti per il porting
- Per arm64-v8a or armv7, prendi i primi ~32 byte della funzione da Ghidra, converti in una stringa esadecimale separata da spazi e sostituisci
sig. - Mantieni un pattern per release di Flutter, conservali in un cheat-sheet per un riuso rapido.
Forzare il traffico attraverso il tuo proxy
Flutter di per sé ignora le impostazioni proxy del dispositivo. Opzioni più semplici:
- Android Studio emulator: Impostazioni ▶ Proxy → manuale.
- Physical device: evil Wi-Fi AP + DNS spoofing, oppure modulo Magisk che modifica
/etc/hosts.
Offset-based hook of BoringSSL verification (no signature scan)
Quando gli script basati su pattern falliscono tra architetture (es. x86_64 vs ARM), aggancia direttamente il chain verifier di BoringSSL usando l’indirizzo assoluto dentro libflutter.so. Procedura:
- Estrai la libreria con ABI corretta dall’APK:
unzip -j app.apk "lib/*/libflutter.so" -d libs/e scegli quella corrispondente al device (es.lib/x86_64/libflutter.so). - Analizza in Ghidra/IDA e individua il verifier:
- Sorgente: funzione BoringSSL ssl_x509.cc
ssl_crypto_x509_session_verify_cert_chain(3 argomenti, ritorna bool). - Nei build stripped, cerca la stringa
"ssl_client"e ispeziona gli XREF; identifica la funzione che prende tre argomenti tipo pointer e ritorna un booleano. - Calcola l’offset a runtime: prendi l’indirizzo della funzione mostrato da Ghidra e sottrai l’image base usata durante l’analisi per ottenere l’offset relativo (RVA). Esempio:
0x02184644 - 0x00100000 = 0x02084644. - Aggancia a runtime usando base + offset e forza il successo:
// 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);
Note
- Ricalcola l’offset per ogni build di destinazione e architettura CPU; le differenze di compiler/codegen rompono le firme hardcoded.
- Questo bypass fa sì che BoringSSL accetti qualsiasi catena, abilitando HTTPS MITM indipendentemente da pins/CA trust all’interno di Flutter.
- Se forzi il routing del traffico durante il debugging per confermare il blocco TLS, ad es.:
iptables -t nat -A OUTPUT -p tcp -j DNAT --to-destination <Burp_IP>:<Burp_Port>
…avrai comunque bisogno dell’hook sopra, poiché la verifica avviene all’interno di libflutter.so, non nel system trust store di Android.
Riferimenti
- 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)
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
HackTricks

