Lompat ke konten
dokumentasi.id
Commit dd5271a
v2
Star6,4 rb

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:35).

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.
Fig. 1: Bentuk data dua berkas pola dan percabangan scanningregexes.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.

BerkasKunciKunci bernilai daftarTotal polaDipakai tanpa --pattern
config/regexes.json531 (Amazon_AWS_S3_Bucket, 6 pola)58ya (apkleaks/apkleaks.py:35)
config/notkeyhacks.json91 (Adjust_Config, 2 pola)10tidak

Angka pada tabel dihitung dari blok nilai di config/regexes.json:2-61 dan config/notkeyhacks.json:2-13: 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:2). Sebagian kecil kunci bernilai daftar string, dan Amazon_AWS_S3_Bucket menunjukkan bentuk itu lewat enam varian host S3 (config/regexes.json:3-10). Berkas Android memakai bentuk yang sama sekali untuk Adjust_Config, yang memuat pola AdjustConfig(...) dan setAppSecret (config/notkeyhacks.json:6-9).

scanning membaca kedua bentuk dengan satu percabangan isinstance(pattern, list) (apkleaks/apkleaks.py:125-138). 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:114).

Nama kunci menjadi judul hasil

extract mencetak nama kunci sebagai header [Name] sebelum daftar temuan (apkleaks/apkleaks.py:100-104). 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-109).

⚠️ Mengganti nama kunci LinkFinder di 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.

KelompokContoh kunciRentang pola
Header otorisasiAuthorization_Basic, Authorization_Bearerconfig/regexes.json:13-14
Cloud dan storageAWS_API_Key, Firebase, Google_API_Key, Google_OAuth_Access_Tokenconfig/regexes.json:15-32
Endpoint dan URIIP_Address, LinkFinder, Mailtoconfig/regexes.json:36-42
Kunci privatPGP_private_key_block, RSA_Private_Key, SSH_DSA_Private_Key, SSH_EC_Private_Keyconfig/regexes.json:45-53
Token platformMailChimp_API_Key, Slack_Token, Stripe_API_Key, Twilio_API_Keyconfig/regexes.json:40-57
CTF flagDEFCON_CTF_Flag, HackerOne_CTF_Flag, HackTheBox_CTF_Flag, TryHackMe_CTF_Flagconfig/regexes.json:18, config/regexes.json:33-34, config/regexes.json:56

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-13).

⚠️ Tidak ada kode yang membuka config/notkeyhacks.json. self.pattern hanya diisi default config/regexes.json (apkleaks/apkleaks.py:35), dan scanning hanya membuka berkas yang ditunjuk self.pattern (apkleaks/apkleaks.py:123-124). Untuk memakai pola Android ini, lewatkan path-nya secara eksplisit, misalnya apkleaks -f app.apk -p config/notkeyhacks.json. Opsi -p menerima satu path berkas saja (apkleaks/cli.py:26), jadi regexes.json dan notkeyhacks.json tidak 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-31). 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.