5
Kumpulan Pola Pencarian
apkleaks tidak menanam satu pun pola sensitif di dalam kode Python. Seluruh aturan pencarian berada di dua berkas JSON di direktori config/, dan kelas APKLeaks hanya menyimpan path ke salah satunya di atribut self.pattern. Atribut itu menunjuk config/regexes.json bila argumen --pattern tidak diberikan (apkleaks/apkleaks.py:351).
graph TD
RX["config/regexes.json<br/>53 kunci, 58 pola"] --> LOAD["json.load di scanning"]
NK["config/notkeyhacks.json<br/>9 kunci, 10 pola"] -.->|"butuh -p eksplisit"| EXT
LOAD --> SHAPE{"isinstance(pattern, list)"}
SHAPE -->|"string"| S1["satu thread untuk satu pola"]
SHAPE -->|"list"| S2["satu thread per elemen daftar"]
S1 --> EXT["extract(name, matches)"]
S2 --> EXT
EXT --> OUT["out_json results: name + matches"]
style RX fill:#336791,color:#fff
style NK fill:#f59e0b,color:#000
style SHAPE fill:#8b5cf6,color:#fff
style S2 fill:#8b5cf6,color:#fff
style LOAD fill:#8b5cf6,color:#fff
style S1 fill:#2d7d46,color:#fff
style EXT fill:#2d7d46,color:#fff
style OUT fill:#2d7d46,color:#fff
%% fig: Bentuk data dua berkas pola dan percabangan scanning
%% desc: regexes.json dimuat lalu dicabangkan menurut tipe nilai, sedangkan notkeyhacks.json hanya terpakai bila path-nya dilewatkan lewat -p.Dua berkas, dua peran
Kedua berkas memakai bentuk yang sama: satu objek JSON datar yang memetakan nama kunci ke sebuah pola. Isinya berbeda ruang lingkup, dan hanya satu di antaranya yang otomatis dipakai.
| Berkas | Kunci | Kunci bernilai daftar | Total pola | Dipakai tanpa --pattern |
|---|---|---|---|---|
config/regexes.json | 53 | 1 (Amazon_AWS_S3_Bucket, 6 pola) | 58 | ya (apkleaks/apkleaks.py:351) |
config/notkeyhacks.json | 9 | 1 (Adjust_Config, 2 pola) | 10 | tidak |
Angka pada tabel dihitung dari blok nilai di config/regexes.json:2-612 dan config/notkeyhacks.json:2-133: 52 kunci bernilai string ditambah 6 pola Amazon_AWS_S3_Bucket, serta 8 kunci bernilai string ditambah 2 pola Adjust_Config.
String tunggal dan daftar string
Sebagian besar kunci bernilai satu string regex, seperti Amazon_AWS_Access_Key_ID yang mengejar prefiks AKIA, A3T, dan sejenisnya (config/regexes.json:24). Sebagian kecil kunci bernilai daftar string, dan Amazon_AWS_S3_Bucket menunjukkan bentuk itu lewat enam varian host S3 (config/regexes.json:3-105). Berkas Android memakai bentuk yang sama sekali untuk Adjust_Config, yang memuat pola AdjustConfig(...) dan setAppSecret (config/notkeyhacks.json:6-96).
scanning membaca kedua bentuk dengan satu percabangan isinstance(pattern, list) (apkleaks/apkleaks.py:125-1387). Nilai string dijalankan sekali, nilai daftar dijalankan satu kali per elemen. Setiap eksekusi menjadi satu thread yang memanggil self.extract(name, util.finder(...)) dengan nama kunci yang sama, sehingga kunci berdaftar menyumbang beberapa entri {"name": ..., "matches": ...} bernama identik di out_json["results"] (apkleaks/apkleaks.py:1148).
Nama kunci menjadi judul hasil
extract mencetak nama kunci sebagai header [Name] sebelum daftar temuan (apkleaks/apkleaks.py:100-1049). Nama itu juga satu-satunya penanda khusus di seluruh alur: extract membandingkan name == "LinkFinder" untuk membuang temuan yang menunjuk pustaka Android dan memangkas kutip di ujung tiap hasil (apkleaks/apkleaks.py:106-10910).
⚠️ Mengganti nama kunci
LinkFinderdi berkas pola akan mematikan kedua penyaringan itu. Polanya tetap dijalankan, tetapi hasilnya tidak lagi dibersihkan dari path pustaka Android dan tanda kutipnya.
Kelompok pola di config/regexes.json
Kunci-kunci di berkas ini dikelompokkan menurut jenis rahasia, bukan menurut penyedia tunggal. Tabel berikut memetakan kelompok yang menonjol beserta contoh kuncinya.
| Kelompok | Contoh kunci | Rentang pola |
|---|---|---|
| Header otorisasi | Authorization_Basic, Authorization_Bearer | config/regexes.json:13-1411 |
| Cloud dan storage | AWS_API_Key, Firebase, Google_API_Key, Google_OAuth_Access_Token | config/regexes.json:15-3212 |
| Endpoint dan URI | IP_Address, LinkFinder, Mailto | config/regexes.json:36-4213 |
| Kunci privat | PGP_private_key_block, RSA_Private_Key, SSH_DSA_Private_Key, SSH_EC_Private_Key | config/regexes.json:45-5314 |
| Token platform | MailChimp_API_Key, Slack_Token, Stripe_API_Key, Twilio_API_Key | config/regexes.json:40-5715 |
| CTF flag | DEFCON_CTF_Flag, HackerOne_CTF_Flag, HackTheBox_CTF_Flag, TryHackMe_CTF_Flag | config/regexes.json:1816, config/regexes.json:33-3417, config/regexes.json:5618 |
config/notkeyhacks.json: pola pemanggilan Android
Sembilan kunci di berkas ini tidak mengejar bentuk token, melainkan pemanggilan API SDK Android. Escape \\( dan \\s? dipakai agar pola cocok dengan sintaks Java/Kotlin seperti AdjustConfig(...), AppCenter.configure(...), setAccessToken(...), dan withAppKey(...) (config/notkeyhacks.json:2-133).
⚠️ Tidak ada kode yang membuka
config/notkeyhacks.json.self.patternhanya diisi defaultconfig/regexes.json(apkleaks/apkleaks.py:351), danscanninghanya membuka berkas yang ditunjukself.pattern(apkleaks/apkleaks.py:123-12419). Untuk memakai pola Android ini, lewatkan path-nya secara eksplisit, misalnyaapkleaks -f app.apk -p config/notkeyhacks.json. Opsi-pmenerima satu path berkas saja (apkleaks/cli.py:2620), jadiregexes.jsondannotkeyhacks.jsontidak bisa dipakai bersamaan dalam satu pemindaian tanpa digabung lebih dulu.
Pola dijalankan per baris
util.finder mengompilasi pola lalu memanggil matcher.search(line) untuk setiap baris berkas hasil decompile. Temuan dikumpulkan lewat mo.group() dan dikembalikan sebagai sorted(list(set(found))) (apkleaks/utils.py:17-3121). Karena search bekerja per baris dan group() mengembalikan bagian yang cocok saja, pola yang membutuhkan konteks lintas baris tidak akan pernah cocok, dan hasil yang tersimpan adalah potongan baris, bukan baris utuh.
Untuk menambah atau mengganti kumpulan pola, lihat Kustomisasi Pola Sendiri. Mekanisme pemindaian dan pewarnaan keluaran dibahas di Mesin Pencarian Regex dan Keluaran Warna.