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

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-28. 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-77, 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-112. 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-115.

Nilai mentah disimpan di self.disarg

APKLeaks.__init__ menyalin args.args apa adanya ke self.disarg apkleaks/apkleaks.py:29. 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-36. 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.
Fig. 1: Komposisi token perintah jadx dari nilai -a/--argsNilai 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-98:

  1. args diisi empat token bawaan: path binary jadx, path APK, flag -d, dan direktori temporer apkleaks/apkleaks.py:91-93.
  2. args.extend(re.split(r"\s|=", self.disarg)) menambahkan token hasil pecahan nilai -a tepat setelah token bawaan apkleaks/apkleaks.py:91-93.
  3. Setiap token di-quote, digabung dengan spasi, lalu semua kutip tunggal diganti kutip ganda sebelum os.system(comm) dipanggil; nilai balik os.system diabaikan, jadi kode keluar jadx tidak diperiksa apkleaks/apkleaks.py:96-98.
PosisiTokenAsal nilai
0path binary jadxself.jadx, hasil which("jadx") atau jadx/bin/jadx apkleaks/apkleaks.py:27-36
1path APKself.file dari os.path.realpath(args.file) apkleaks/apkleaks.py:27-36
2-dflag keluaran bawaan apkleaks/apkleaks.py:91-93
3direktori temporerself.tempdir, hasil tempfile.mkdtemp(prefix="apkleaks-") apkleaks/apkleaks.py:27-36
4 dan seterusnyatoken penggunahasil `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-95 |

Titik tabrakan dengan argumen bawaan

Karena extend hanya menambah di belakang, token pengguna selalu berada setelah -d <tempdir> apkleaks/apkleaks.py:91-93. 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.
Fig. 2: Perjalanan nilai -a/--args sampai perintah jadx dijalankanString 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-98:

  • Flag -d ganda. -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=DEBUG dikirim 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. quote menghasilkan kutip tunggal bila perlu, lalu semua ' diganti " sebelum os.system dipanggil apkleaks/apkleaks.py:96-98. Perlakuan ini relevan bagi keamanan perintah dan dibahas di Kebijakan Keamanan dan Pelaporan Kerentanan.

⚠️ -a/--args memberi 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-98.