4.1
Opsi CLI dan Argumen Disassembler
Opsi -a/--args adalah satu-satunya opsi CLI yang nilainya diteruskan ke disassembler jadx. Nilai itu tidak divalidasi sama sekali: APKLeaks memecahnya dengan re.split lalu menempelkannya ke daftar argumen yang sudah berisi argumen bawaan. Halaman ini menelusuri perakitan tersebut dan titik-titik tempat opsi pengguna dapat bertabrakan dengan argumen bawaan. Daftar opsi lain dan contoh pemakaian singkat ada di Penggunaan CLI.
Definisi opsi di argparse
argument() mendaftarkan -a dan --args sebagai satu argumen str yang tidak wajib, dengan teks bantuan "Disassembler arguments (e.g. --threads-count 5 --deobf)" apkleaks/cli.py:24-281. Argparse hanya menyimpan string; tidak ada pemeriksaan jumlah token, nama flag, maupun nilai yang sah.
README mencatat opsi ini sebagai "Disassembler arguments" pada tabel opsinya README.md:71-772, lalu memberi dua contoh bentuk pemakaian: --args="--threads-count 5" dan apkleaks -f /path/to/file.apk -a "--deobf --log-level DEBUG" README.md:106-1123. Keduanya mengirim satu string; tanda kutip di shell hanya menjaga agar spasi tidak memecah argv. README juga memperingatkan pembaca agar memperhatikan argumen bawaan untuk mencegah tabrakan README.md:114-1154.
Nilai mentah disimpan di self.disarg
APKLeaks.__init__ menyalin args.args apa adanya ke self.disarg apkleaks/apkleaks.py:295. Tiga atribut lain ikut menyusun perintah jadx: self.file dari os.path.realpath(args.file), self.tempdir dari tempfile.mkdtemp(prefix="apkleaks-"), dan self.jadx yang berasal dari which("jadx") atau binary bawaan jadx/bin/jadx apkleaks/apkleaks.py:27-366. Nilai -a baru diinterpretasikan jauh kemudian, di dalam decompile().
graph LR
CLI["cli.argument: -a/--args"] --> RAW["APKLeaks.__init__: self.disarg"]
RAW --> SPLIT["decompile: re.split pada self.disarg"]
RAW -.-> GUARD["except Exception: pass"]
SPLIT --> USER["token pengguna"]
GUARD --> BASE["4 token bawaan"]
USER --> MERGE["args.extend"]
BASE --> MERGE
MERGE --> CMD["quote, join, replace kutip"]
CMD --> SYS["os.system"]
style CLI fill:#2d7d46,color:#fff
style RAW fill:#336791,color:#fff
style SPLIT fill:#8b5cf6,color:#fff
style USER fill:#8b5cf6,color:#fff
style MERGE fill:#f59e0b,color:#000
style CMD fill:#f59e0b,color:#000
style GUARD fill:#dc2626,color:#fff
style SYS fill:#dc2626,color:#fff
%% fig: Komposisi token perintah jadx dari nilai -a/--args
%% desc: Nilai mentah dari argparse dipecah re.split dan ditempelkan ke empat token bawaan sebelum dijalankan lewat os.system.Argumen bawaan dan penempelan token pengguna
decompile() menyusun perintah dalam tiga langkah apkleaks/apkleaks.py:89-987:
argsdiisi empat token bawaan: path binary jadx, path APK, flag-d, dan direktori temporer apkleaks/apkleaks.py:91-938.args.extend(re.split(r"\s|=", self.disarg))menambahkan token hasil pecahan nilai-atepat setelah token bawaan apkleaks/apkleaks.py:91-938.- Setiap token di-
quote, digabung dengan spasi, lalu semua kutip tunggal diganti kutip ganda sebelumos.system(comm)dipanggil; nilai balikos.systemdiabaikan, jadi kode keluar jadx tidak diperiksa apkleaks/apkleaks.py:96-989.
| Posisi | Token | Asal nilai |
|---|---|---|
| 0 | path binary jadx | self.jadx, hasil which("jadx") atau jadx/bin/jadx apkleaks/apkleaks.py:27-366 |
| 1 | path APK | self.file dari os.path.realpath(args.file) apkleaks/apkleaks.py:27-366 |
| 2 | -d | flag keluaran bawaan apkleaks/apkleaks.py:91-938 |
| 3 | direktori temporer | self.tempdir, hasil tempfile.mkdtemp(prefix="apkleaks-") apkleaks/apkleaks.py:27-366 |
| 4 dan seterusnya | token pengguna | hasil `re.split(r"\s |
Pemisah yang dipakai adalah \s atau =, sehingga satu nilai -a dapat menjadi beberapa token sekaligus:
| Nilai -a/--args | Token hasil re.split(r"\s|=", ...) |
| --- | --- |
| --deobf --log-level DEBUG | --deobf, --log-level, DEBUG |
| --threads-count 5 --deobf | --threads-count, 5, --deobf |
| --log-level=DEBUG | --log-level, DEBUG |
| kosong (opsi tidak dipakai) | re.split melempar TypeError yang ditelan except Exception: pass, sehingga perintah hanya berisi empat token bawaan apkleaks/apkleaks.py:92-9510 |
Titik tabrakan dengan argumen bawaan
Karena extend hanya menambah di belakang, token pengguna selalu berada setelah -d <tempdir> apkleaks/apkleaks.py:91-938. APKLeaks tidak memeriksa duplikasi, sehingga flag yang sama dapat muncul dua kali dalam satu perintah.
sequenceDiagram
autonumber
participant CLI as cli.argument
participant INIT as APKLeaks.__init__
participant DEC as APKLeaks.decompile
participant SYS as os.system
participant JADX as jadx
CLI->>INIT: args.args
INIT->>DEC: self.disarg
DEC->>DEC: args = [self.jadx, self.file, "-d", self.tempdir]
DEC->>DEC: re.split lalu extend
DEC->>DEC: quote, join, replace kutip tunggal
DEC->>SYS: comm
SYS->>JADX: perintah shell
JADX-->>SYS: kode keluar diabaikan
%% fig: Perjalanan nilai -a/--args sampai perintah jadx dijalankan
%% desc: String dari argparse dibawa apa adanya ke decompile, dipecah dan ditempelkan ke argumen bawaan, lalu dieksekusi os.system tanpa pemeriksaan kode keluar.Beberapa bentuk tabrakan yang mungkin timbul dari mekanisme di atas apkleaks/apkleaks.py:89-987:
- Flag
-dganda.-a "-d /tmp/lain"membuat perintah memuat-d <tempdir>lalu-d /tmp/lain; keduanya dikirim ke jadx dalam satu perintah. - Path APK ganda. Pengguna dapat mengirim path APK lain sebagai token tambahan, sehingga jadx menerima dua path masukan.
- Nilai ber-
=terpecah.--log-level=DEBUGdikirim sebagai dua token terpisah, bukan satu token--log-level=DEBUG. - Argumen bernilai spasi. Spasi selalu menjadi pemisah, jadi satu nilai yang mengandung spasi tidak dapat dipertahankan sebagai satu token.
- Kutip tunggal berubah menjadi kutip ganda.
quotemenghasilkan kutip tunggal bila perlu, lalu semua'diganti"sebelumos.systemdipanggil apkleaks/apkleaks.py:96-989. Perlakuan ini relevan bagi keamanan perintah dan dibahas di Kebijakan Keamanan dan Pelaporan Kerentanan.
⚠️
-a/--argsmemberi kendali penuh atas sisa perintah jadx. Argumen bawaan[self.jadx, self.file, "-d", self.tempdir]tidak dapat diganti, hanya ditambah, sehingga jangan mengandalkan APKLeaks untuk menolak flag yang bertabrakan apkleaks/apkleaks.py:89-987.