2 poin oleh GN⁺ 3 hari lalu | Belum ada komentar. | Bagikan ke WhatsApp
  • 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.

Belum ada komentar.