Ketika Burp Suite diam membisu dan Frida tak berdaya, rahasia aplikasi Flutter seringkali tersembunyi di balik lapisan native code dan BoringSSL yang bandel.
Sebagai seorang pentester atau pengembang yang ingin menganalisis keamanan aplikasi, Anda pasti pernah mengalami frustrasi saat mencoba meng-intercept traffic HTTPS aplikasi Flutter. Proxy biasa tidak bekerja, script Frida yang biasanya ampuh tiba-tiba tak berdaya, dan aplikasi tetap diam menyimpan rahasia komunikasinya dengan server. Artikel ini akan membimbing Anda melalui metode bypass SSL pinning pada aplikasi Flutter yang terbukti efektif bahkan ketika pendekatan konvensional gagal total, berdasarkan pengalaman nyata dan penelitian mendalam.
1. Mengapa Flutter Sangat Berbeda dan Menantang?
Sebelum masuk ke solusi, penting untuk memahami akar permasalahan mengapa Flutter begitu sulit di-intercept dibandingkan aplikasi native Android atau iOS.
1.1 Arsitektur Unik Flutter
Flutter bukan sekadar framework UI biasa. Aplikasi Flutter terdiri dari:
- Dart Framework: Kode aplikasi yang ditulis developer dalam Dart
- Flutter Engine: Runtime portabel yang ditulis terutama dalam C++ untuk menjalankan aplikasi Flutter
- BoringSSL: Library kriptografi Google yang digunakan untuk SSL/TLS, bukan library sistem standar
Kompilasi Ahead-of-Time (AOT) Flutter menghasilkan snapshot binary yang berisi kode mesin dari framework Flutter dan kode sumber pengembang, membuat analisis menjadi lebih kompleks.
1.2 Masalah Utama dalam Intercepting Traffic
Dua tantangan utama yang dihadapi:
- Proxy Unaware: Aplikasi Flutter mengabaikan pengaturan proxy sistem. Mengatur proxy di pengaturan perangkat tidak akan memengaruhi aplikasi Flutter.
- Verifikasi Sertifikat Native: Validasi sertifikat SSL dilakukan di lapisan native melalui BoringSSL, bukan menggunakan store CA sistem Android/iOS.
1.3 Kegagalan Pendekatan Konvensional
Banyak pentester mencoba pendekatan standar yang biasanya bekerja untuk aplikasi native:
- Script Frida untuk mem-bypass pinning (sering gagal)
- Memasang sertifikat CA Burp ke sistem (tidak efektif)
- Tool otomatis seperti Objection (terbatas fungsionalitasnya)
Kegagalan ini terjadi karena logika keamanan berada di dalam libflutter.so, library native yang tidak terekspos ke layer Java/Kotlin yang biasanya di-hook oleh Frida.
2. Kasus Nyata: Saat Semua Script Frida Gagal
Pengalaman nyata dari seorang peneliti keamanan mengilustrasikan tantangan ini dengan baik. Saat menganalisis APK Flutter, ia menemukan bahwa:
- Tidak ada traffic yang muncul di Burp Suite meski proxy sudah dikonfigurasi dengan benar.
- Berbagai script Frida yang tersedia online tidak berfungsi.
- Pendekatan reflutter (tool patching statis) juga gagal dalam kasusnya.
Yang menarik, script yang sama berfungsi untuk rekan-nya yang menggunakan emulator berbasis ARM, sementara ia menggunakan emulator x86_64. Perbedaan arsitektur ini menyebabkan pola memory berbeda sehingga script gagal menemukan fungsi target yang benar.
3. Reverse Engineering libflutter.so
Ketika pendekatan standar gagal, solusinya adalah melakukan reverse engineering langsung pada library Flutter. Berikut langkah-langkah sistematisnya:
3.1 Ekstraksi dan Analisis Awal

Di dalam folder ini, Anda akan menemukan dua file penting:
- libapp.so: Berisi kode Dart aplikasi yang sudah dikompilasi
- libflutter.so: Engine Flutter yang menangani SSL dan fungsi native lainnya
3.2 Mencari Fungsi Verifikasi Sertifikat
Flutter menggunakan BoringSSL, dan fungsi verifikasi sertifikat utama berada di ssl_crypto_x509_session_verify_cert_chain dalam file ssl_x509.cc. Karena simbol dalam libflutter.so ter-strip, kita perlu menemukannya secara manual:

- Buka libflutter.so di Ghidra/IDA
- Cari string “ssl_client” (Search → For Strings)
- Periksa cross-references (XREFs) dari string ini
- Identifikasi fungsi dengan karakteristik:


Cari ssl_client, lalu klik dua kali pada hasilnya dan jelajahi XREF-nya.

Ada 2 XREF, mungkin Anda menemukan lebih banyak XREF jadi periksa semuanya.

Periksa setiap fungsi yang dirujuk ( FUN_… ) secara manual dengan mengklik dua kali FUN_ dan fungsi yang benar adalah fungsi yang menerima 3 argumen dan mengembalikan nilai boolean.


Dalam kasus ini, fungsi kedua adalah yang benar.
3.3 Menghitung Offset untuk Frida
Setelah menemukan fungsinya, dapatkan offset dengan mengklik dua kali pada nama fungsi tersebut.

Setelah menemukan fungsi target, catat offsetnya. Contoh: 0x02184644. Kurangi dengan base load address (biasanya 0x100000) untuk mendapatkan offset relatif:
0x02184644 - 0x100000 = 0x2084644
Offset ini akan digunakan dalam script Frida untuk menemukan fungsi dalam memory saat runtime.
4. Solusi Praktis: Script Frida yang Disesuaikan
Berdasarkan analisis di atas, berikut adalah pendekatan praktis yang bisa langsung Anda terapkan:
4.1 Script Frida untuk Bypass SSL Verification

4.2 Menjalankan Script

Seperti yang diharapkan, proses intercept menggunakan script Frida yang disesuaikan berhasil.

4.3 Alternatif: Metode JNI_OnLoad Offset
Pendekatan lain adalah menggunakan export JNI_OnLoad sebagai anchor point, karena ini adalah simbol yang tidak ter-strip:
javascript
function disable_certificate_validation() {
var m = Process.findModuleByName("libflutter.so");
var jni_onload_addr = m.enumerateExports()[0].address;
// Tambahkan offset antara fungsi target dan JNI_OnLoad
let target_addr = ptr(jni_onload_addr).add(0x0027b624); // Ganti offset!
Interceptor.attach(target_addr, {
onLeave: function(retval) {
retval.replace(0x1); // Selalu return true
}
});
}
5. Teknik Pendukung untuk Intercepting Traffic
Bypass SSL verification saja tidak cukup jika aplikasi tidak mengirim traffic melalui proxy. Berikut teknik pendukung yang diperlukan:
5.1 Redireksi Traffic dengan iptables (Android)
Untuk perangkat Android yang ter-root, gunakan iptables untuk mengarahkan traffic ke proxy Anda:
bash
# Redirect semua traffic HTTPS ke Burp
adb shell su -c "iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination [IP_BURP]:[PORT_BURP]"
# Contoh:
adb shell su -c "iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination 192.168.1.100:8080"
5.2 Konfigurasi Burp Suite
- Dengarkan di semua interface (Bind to address: All interfaces)
- Aktifkan invisible proxying (Request Handling → Support invisible proxying)
- Gunakan port tidak standar seperti 8083 untuk menghindari konflik
5.3 Opsi untuk iOS
Untuk perangkat iOS jailbroken, pendekatannya berbeda:
- Internet Sharing via USB
- Konfigurasi pf (Packet Filter) untuk redirect traffic
- Atau gunakan OpenVPN untuk tunnel semua traffic
6. Tool dan Alternatif Lain
Selain pendekatan reverse engineering manual, beberapa tool dapat membantu:
7. Tips Penting dan Pelajaran yang Didapat
- Arsitektur Penting: Script yang bekerja di ARM mungkin gagal di x86_64 dan sebaliknya. Selalu identifikasi arsitektur target.
- Versi Flutter Berpengaruh: Offset dan pola bisa berbeda antar versi Flutter. Tools seperti reFlutter memiliki database hash engine untuk berbagai versi.
- Kombinasi Teknik: Seringkali perlu menggabungkan redireksi traffic DAN bypass SSL verification.
- Mulai dari Aplikasi Demo: Uji teknik Anda dengan aplikasi Flutter demo sebelum menarget aplikasi produksi.
8. Kesimpulan
Bypass SSL pinning pada aplikasi Flutter memang menantang, tetapi bukan tidak mungkin. Kunci keberhasilannya adalah:
- Memahami arsitektur Flutter yang unik dengan lapisan native-nya
- Melakukan reverse engineering libflutter.so untuk menemukan fungsi verifikasi sertifikat
- Membuat script Frida yang spesifik berdasarkan offset yang ditemukan
- Menggabungkan dengan teknik redireksi traffic yang sesuai dengan platform target
Pendekatan yang dijelaskan dalam artikel ini telah teruji pada kasus nyata di mana metode lain gagal. Dengan kesabaran dan analisis yang teliti, Anda dapat mengungkap komunikasi tersembunyi dari aplikasi Flutter yang paling aman sekalipun.