- Integrasi SSH menggunakan escape sequence terminal untuk berkomunikasi dengan shell jarak jauh, dan karena struktur ini, output terminal biasa pun bisa ditafsirkan seperti protokol conductor
- Masalah intinya adalah kegagalan kepercayaan: bukan hanya conductor jarak jauh yang sebenarnya, tetapi juga file berbahaya, banner, MOTD, dan respons server dapat bertindak seolah-olah conductor melalui
DCS 2000p dan OSC 135 palsu
- Hanya dengan menjalankan
cat readme.txt, jika transcript conductor palsu dirender maka iTerm2 akan melanjutkan sendiri alur getshell · pythonversion · run(...), dan output serangan cukup menyamar sebagai respons
- Eksploit ini memanfaatkan kebingungan ketika perintah base64 yang ditulis ke PTY, saat conductor SSH yang sebenarnya tidak ada, justru jatuh menjadi input plaintext ke shell lokal; eksekusi menjadi mungkin ketika chunk terakhir ditafsirkan sebagai jalur
ace/c+aliFIo
- Perbaikannya sudah masuk dalam commit 31 Maret
a9e745993c2e2cbb30b884a16617cd5495899f86, tetapi pada saat dipublikasikan belum masuk stable release, sehingga muncul celah perlindungan sebelum patch tersebar
Latar belakang integrasi SSH di iTerm2
- iTerm2 SSH integration adalah fitur untuk memahami sesi jarak jauh dengan lebih kaya, dan bekerja dengan cara menaruh skrip helper kecil bernama conductor di shell jarak jauh
- Memulai integrasi SSH melalui
it2ssh
- Mengirim conductor, skrip bootstrap jarak jauh, melalui sesi SSH yang sudah ada
- Skrip jarak jauh ini menjalankan peran lawan bicara untuk protokol iTerm2
- iTerm2 dan conductor jarak jauh tidak berkomunikasi sebagai layanan jaringan biasa, melainkan saling bertukar escape sequence di atas terminal I/O
- Deteksi login shell
- Memeriksa keberadaan Python
- Mengganti direktori
- Mengunggah file
- Menjalankan perintah
Cara kerja PTY
- Emulator terminal modern adalah versi perangkat lunak dari terminal hardware lama, dan bertugas menangani output layar, input keyboard, serta interpretasi sequence kontrol terminal
- Shell dan program command-line masih mengharapkan perangkat yang terlihat seperti terminal sungguhan, sehingga OS menyediakan PTY
- PTY adalah pseudoterminal yang berada di antara emulator terminal dan proses foreground
- Dalam sesi SSH biasa, iTerm2 menulis byte ke PTY, lalu proses foreground
ssh meneruskannya ke mesin jarak jauh, dan conductor jarak jauh membacanya dari stdin
- Saat iTerm2 mengirim perintah ke conductor jarak jauh, di sisi lokal pada akhirnya ia menulis byte ke PTY
Protokol conductor
- Media transport untuk protokol integrasi SSH menggunakan terminal escape sequence
- Ada dua elemen inti
DCS 2000p dipakai untuk meng-hook SSH conductor
OSC 135 dipakai untuk pesan conductor pre-framer
- Di level source,
DCS 2000p membuat iTerm2 membentuk conductor parser, lalu parser itu memproses pesan OSC 135 sesudahnya
begin <id>
- baris output perintah
end <id> <status> r
unhook
- Conductor jarak jauh yang normal bisa berkomunikasi dengan iTerm2 hanya melalui output terminal
Kerentanan inti
- Esensi kerentanannya adalah kegagalan kepercayaan: bahkan output terminal yang bukan sesi conductor tepercaya pun diterima iTerm2 sebagai protokol SSH conductor
- Akibatnya, output terminal yang tidak tepercaya bisa menyamar sebagai conductor jarak jauh
- file berbahaya
- respons server
- banner
- MOTD
- Input serangan dapat mencetak hook
DCS 2000p palsu dan respons OSC 135 palsu; bila ini terjadi, iTerm2 bertindak seolah pertukaran SSH integration yang sebenarnya sedang berlangsung
Cara kerja eksploit
- File eksploit berbentuk transcript conductor palsu
- Saat pengguna menjalankan
cat readme.txt, iTerm2 merender file tersebut, tetapi isinya bukan teks biasa melainkan mengandung elemen berikut
- baris
DCS 2000p palsu yang menandakan sesi conductor palsu
- pesan
OSC 135 palsu yang menjawab permintaan iTerm2
- Setelah hook diterima, iTerm2 memulai workflow conductor normal; pada source upstream,
Conductor.start() langsung mengirim getshell(), lalu jika berhasil mengirim pythonversion()
- Serangan tidak perlu menyuntikkan permintaan-permintaan itu; iTerm2 sendiri yang menerbitkan permintaan, dan output berbahaya cukup menyamar sebagai respons
Proses state machine
- Pesan
OSC 135 palsu disusun minimal tetapi dalam urutan yang tepat
- awal body perintah untuk
getshell
- mengembalikan baris yang tampak seperti output deteksi shell
- mengakhiri perintah itu dengan status sukses
- awal body perintah untuk
pythonversion
- mengakhiri perintah itu dengan status gagal
unhook
- Hanya dengan alur ini, iTerm2 masuk ke jalur fallback normal, lalu menilai workflow SSH integration sudah cukup selesai dan melanjutkan ke tahap berikutnya
- Tahap berikutnya adalah menyusun dan mengirim perintah
run(...)
Peran sshargs
- Hook
DCS 2000p palsu memuat beberapa field, dan salah satunya adalah sshargs yang dikendalikan penyerang
- Nilai ini kemudian dipakai sebagai bahan penyusun perintah saat iTerm2 membangun permintaan
run ... untuk conductor
- Eksploit memilih
sshargs agar ketika iTerm2 melakukan encoding base64 terhadap data berikut
run <padding><magic-bytes>
- chunk 128-byte terakhir menjadi
ace/c+aliFIo
- String ini bukan nilai acak, tetapi dipilih agar sekaligus memenuhi dua syarat berikut
- output yang valid dari jalur encoding conductor
- nama path relatif yang valid
Kebingungan PTY yang memungkinkan eksploit
- Dalam sesi SSH integration normal, iTerm2 menulis perintah conductor yang telah di-encode base64 ke PTY, dan
ssh meneruskannya ke conductor jarak jauh
- Dalam situasi eksploit, iTerm2 tetap menulis perintah ke PTY dengan cara yang sama, tetapi karena conductor SSH yang sebenarnya tidak ada, shell lokal justru menerimanya sebagai input plaintext
- Pada sesi yang direkam, terlihat bentuk berikut
getshell muncul dalam bentuk base64
pythonversion muncul dalam bentuk base64
- lalu payload
run ... panjang yang di-encode base64 muncul
- chunk terakhir adalah
ace/c+aliFIo
- Chunk-chunk sebelumnya gagal sebagai perintah yang tidak bermakna, tetapi chunk terakhir akan berjalan bila path tersebut ada secara lokal dan dapat dieksekusi
Langkah reproduksi
- PoC asli berbasis file dapat direproduksi dengan
genpoc.py
python3 genpoc.py
unzip poc.zip
cat readme.txt
- Prosedur ini menghasilkan dua file berikut
- skrip helper yang dapat dieksekusi bernama
ace/c+aliFIo
readme.txt yang memuat sequence DCS 2000p dan OSC 135 berbahaya
- File pertama memancing iTerm2 agar berkomunikasi dengan conductor palsu, dan file kedua menyediakan target yang benar-benar akan dijalankan shell saat chunk terakhir tiba
- Agar eksploit berhasil,
cat readme.txt harus dijalankan di direktori yang berisi ace/c+aliFIo, sehingga chunk terakhir rancangan penyerang ditafsirkan sebagai path yang benar-benar bisa dieksekusi
Jadwal pengungkapan dan patch
- Bug dilaporkan ke iTerm2 pada 30 Maret
- Perbaikan selesai pada commit 31 Maret
a9e745993c2e2cbb30b884a16617cd5495899f86
- Pada saat penulisan, perbaikannya masih belum masuk stable release
- Setelah commit patch tersedia, dilakukan upaya untuk membangun ulang eksploit dari nol hanya berdasarkan patch itu
- Prompt untuk proses tersebut ada di
prompts.md
- Hasilnya adalah
genpoc2.py
- Cara kerjanya sangat mirip dengan
genpoc.py
Keberatan terhadap waktu pengungkapan
- Pengungkapan dilakukan sebelum perbaikan mencapai stable release, sehingga tercipta situasi di mana sebagian besar pengguna sulit benar-benar terlindungi saat kerentanan diumumkan
- Benturan soal waktu pengungkapan semacam ini memerlukan justifikasi yang jelas
- Dua minggu terlalu singkat untuk berharap distribusi yang bermakna, dan juga terlalu singkat untuk membenarkan bahwa pengungkapan dini perlu dilakukan demi memaksa respons
- Akibatnya, kerentanannya sudah diketahui luas, tetapi versi perbaikannya secara realistis masih belum tersedia bagi pengguna yang membutuhkannya, sehingga terbentuk masa jeda pengungkapan
- Pilihan yang lebih baik adalah menunggu sampai versi perbaikan benar-benar sampai ke tangan pengguna, atau setidaknya memberikan alasan yang jelas mengapa paparan dini diperlukan; namun keduanya tidak terpenuhi
Belum ada komentar.