1 poin oleh GN⁺ 2024-09-27 | 1 komentar | Bagikan ke WhatsApp
  • Jika jalur penemuan printer otomatis CUPS berpadu dengan ketiadaan validasi atribut IPP, penyerang jarak jauh tanpa autentikasi dapat menyuntikkan konfigurasi printer berbahaya dan bahkan memicu eksekusi perintah arbitrer saat pencetakan dilakukan
  • Titik awal serangan adalah perilaku cups-browsed yang menerima paket dari sumber mana pun pada port UDP 631 dan mengirim permintaan IPP Get-Printer-Attributes ke URL penyerang
  • Kerentanan ini terbagi menjadi CVE-2024-47176, CVE-2024-47076, CVE-2024-47175, dan CVE-2024-47177, lalu berlanjut hingga alur pembuatan PPD di libcupsfilters, libppd, cups-filters, serta eksekusi foomatic-rip
  • Cakupan dampaknya meliputi sebagian besar distribusi GNU/Linux, sebagian BSD, kemungkinan Oracle Solaris dan Chromium/ChromeOS; dalam pemindaian IPv4 publik, teramati callback dari ratusan ribu perangkat dan hingga 200 ribu–300 ribu klien simultan
  • Secara praktis, cups-browsed yang tidak diperlukan harus dinonaktifkan atau dihapus dan paket CUPS harus diperbarui; jika pembaruan sulit dilakukan, pertimbangkan pemblokiran UDP 631 dan, bila perlu, trafik DNS-SD

Inti rantai kerentanan

  • Rantai ini dimulai dari fitur penemuan printer otomatis CUPS, lalu berlanjut ke pemrosesan atribut IPP, pembuatan berkas PPD, dan eksekusi filter
  • Kerentanan utama saling terkait dalam empat tahap
    • CVE-2024-47176: cups-browsed 2.0.1 ke bawah melakukan binding ke UDP INADDR_ANY:631 dan memercayai paket dari sumber mana pun, sehingga memicu permintaan IPP Get-Printer-Attributes ke URL yang dikendalikan penyerang
    • CVE-2024-47076: cfGetPrinterAttributes5 di libcupsfilters 2.1b1 ke bawah meneruskan atribut yang diterima dari server IPP ke sistem CUPS tanpa validasi atau sanitasi
    • CVE-2024-47175: ppdCreatePPDFromIPP2 di libppd 2.1b1 ke bawah menulis atribut IPP ke berkas PPD sementara tanpa validasi atau sanitasi, sehingga memungkinkan penyisipan data yang dikendalikan penyerang
    • CVE-2024-47177: foomatic-rip di cups-filters 2.0.1 ke bawah memungkinkan eksekusi perintah arbitrer melalui parameter FoomaticRIPCommandLine pada PPD

Titik masuk serangan dan cakupan dampak

  • Penyerang jarak jauh tanpa autentikasi dapat diam-diam mengubah URL IPP printer yang sudah ada menjadi URL berbahaya, atau membuat sistem memasang printer baru
  • Eksekusi perintah yang sebenarnya terjadi saat pekerjaan cetak dimulai pada komputer tersebut
  • Ada dua titik masuk
    • WAN / internet publik: penyerang jarak jauh mengirim paket ke port UDP 631, tanpa memerlukan autentikasi
    • LAN: penyerang lokal dapat memalsukan iklan zeroconf, mDNS, atau DNS-SD untuk mencapai RCE melalui jalur kode yang sama
  • CUPS dan cups-browsed dipaketkan di berbagai sistem turunan UNIX
  • Dari hasil pemindaian seluruh rentang IPv4 internet publik beberapa kali sehari selama beberapa minggu, setelah paket UDP dikirim, ratusan ribu perangkat melakukan callback dan teramati puncak hingga 200 ribu–300 ribu klien simultan

Jalur yang dibuka oleh cups-browsed

  • Saat menjalankan netstat -anu di laptop Ubuntu, ditemukan port UDP yang mendengarkan pada 0.0.0.0:631
  • Hasil pemeriksaan lsof -i :631 menunjukkan bahwa TCP 631 digunakan oleh cupsd, sedangkan UDP 631 digunakan oleh cups-browsed
  • Pada ps aux, proses cups-browsed terlihat berjalan sebagai root
  • cups-browsed adalah bagian dari sistem CUPS dan berfungsi menemukan printer baru lalu menambahkannya secara otomatis ke sistem
  • Hasil pemeriksaan kode sumber menunjukkan layanan ini melakukan binding ke INADDR_ANY:631 UDP dan mengharapkan paket UDP dalam format HEX_NUMBER HEX_NUMBER TEXT_DATA
  • Dalam keadaan berkas konfigurasi default sebagian besar dikomentari, pembatasan akses pada praktiknya menjadi lemah

Masalah parsing dan bug tambahan

  • Paket CUPS sendiri termasuk dalam oss-fuzz, tetapi cups-browsed tampaknya tidak memiliki cakupan fuzzing
  • Saat target fuzzing berbasis AFL dibuat di sekitar process_browse_data, 5 input memicu stack-buffer-overflow
  • Penyebabnya ditunjuk sebagai alur di mana dereferensi pointer terjadi sebelum kondisi terminasi diperiksa dalam dua loop
  • Setelah itu, race condition dan kemungkinan DoS juga ditemukan pada titik penanganan lock
  • Masalah-masalah ini telah dilaporkan kepada pengembang dan CERT, tetapi menurut peneliti belum diakui atau ditambal

Permintaan IPP dan injeksi PPD

  • found_cups_printer memperlakukan salah satu field teks yang diparsing dari paket UDP sebagai URL
  • URL dan data terkait ini melewati alur examine_discovered_printer_record, create_remote_printer_entry, lalu berlanjut ke pemanggilan cfGetPrinterAttributes di libcupsfilters
  • Jika penyerang mengirim paket berbentuk 0 3 http://<ATTACKER-IP>:<PORT>/printers/whatever, cups-browsed pada target akan terhubung ke URL penyerang
  • Saat terhubung, header User-Agent mencakup versi kernel dan arsitektur, dan pada sebagian permintaan juga dilaporkan nama pengguna target
  • Internet Printing Protocol adalah protokol komunikasi antara klien dan printer atau server cetak, yang digunakan antara lain untuk mengecek status printer dan mengirim pekerjaan cetak
  • Sistem target mengenali server penyerang sebagai printer dan mengirim permintaan Get-Printer-Attributes yang dienkapsulasi di dalam HTTP
  • Saat merespons dengan atribut yang dapat dikendalikan menggunakan paket Python ippserver, printer palsu ditambahkan ke printer lokal tanpa pemberitahuan kepada pengguna

PPD dan jalur eksekusi foomatic-rip

  • Log debug menunjukkan pembuatan antrean printer, pembuatan berkas PPD sementara, serta proses penggunaan dan pengeditan PPD
  • Fungsi create_queue meneruskan atribut IPP ke API ppdCreatePPDFromIPP2 milik libppd
  • ppdCreatePPDFromIPP2 menulis atribut teks yang dikendalikan penyerang, seperti printer-make-and-model, ke berkas PPD tanpa validasi atau escaping
  • Berkas PostScript Printer Description adalah berkas teks yang menjelaskan fitur dan kemampuan printer, serta berperan dalam menentukan fungsi printer dan cara penggunaannya di CUPS
  • Di antara berbagai direktif PPD, cupsFilter2 sebagai ekstensi CUPS dapat menjalankan berkas eksekusi di bawah /usr/lib/cups/filter sebagai filter saat pekerjaan cetak berlangsung
  • foomatic-rip diperlakukan sebagai filter yang dapat menjalankan perintah melalui direktif FoomaticRIPCommandLine pada PPD
  • Sebelumnya, foomatic-filters memiliki perbaikan terkait CVE-2011-2964 dan CVE-2011-2697, tetapi dikonfirmasi bahwa perbaikan tersebut tidak di-port dalam proses integrasi CUPS
  • Dalam CVE-2024-35235 yang lebih baru, eksekusi perintah arbitrer melalui FoomaticRIPCommandLine juga disebutkan
  • Menurut penjelasan pihak pengembang CUPS, membatasi konten yang dapat diberikan ke FoomaticRIPCommandLine sangat sulit dilakukan tanpa merusak driver yang sudah ada, dan ratusan model printer lama sebelum 2010 kemungkinan hanya bergantung pada Foomatic

Alur reproduksi RCE

  • Rantai RCE terdiri dari tiga tahap
    • Membuat sistem target terhubung ke server IPP berbahaya milik penyerang
    • Mengembalikan string atribut IPP yang dikendalikan penyerang untuk menyisipkan direktif ke berkas PPD sementara
    • Saat pekerjaan cetak dikirim ke printer palsu, direktif PPD dan perintah dieksekusi
  • Dalam konfigurasi server IPP, eksekusi perintah disusun dengan menutup string PPD, menyisipkan baris baru, lalu memasukkan direktif FoomaticRIPCommandLine dan cupsFilter2
  • Target demo adalah Ubuntu 24.04.1 LTS yang telah sepenuhnya ditambal dan cups-browsed 2.0.1, dan eksekusi perintah berhasil dicapai pada mesin penyerang
  • Alur ini berlaku ketika beberapa tahap pemrosesan di cups-browsed, libcupsfilters, libppd, dan cups-filters saling berpadu

Mitigasi dan rekomendasi

  • Jika cups-browsed tidak diperlukan, disarankan untuk menonaktifkan dan menghapus layanan tersebut
  • Paket CUPS pada sistem harus diperbarui
  • Jika tidak dapat memperbarui dan layanan tersebut diperlukan, trafik UDP 631 harus diblokir
  • Tergantung situasi, trafik DNS-SD juga dapat diblokir, tetapi ini mungkin sulit diterapkan di lingkungan yang menggunakan zeroconf
  • Sebagai rekomendasi pribadi, peneliti menyatakan akan menghapus layanan, binary, dan library CUPS dari sistemnya sendiri serta tidak akan mencetak dari sistem UNIX
  • Ia juga menambahkan bahwa listener zeroconf, Avahi, dan Bonjour akan dihapus

Proses publikasi dan pekerjaan lanjutan

  • Risetnya sendiri memakan waktu beberapa hari, tetapi setelah advisory keamanan dibuka di repositori OpenPrinting cups-browsed pada 5 September dan proses responsible disclosure dimulai, butuh 22 hari hingga publikasi
  • Diskusi terkait berlanjut menjadi advisory keamanan untuk cups-browsed, libcupsfilters, libppd, dan cups-filters
  • Riset memakan waktu 2 hari, exploit yang berfungsi terdiri dari 249 baris, dan proses publikasinya melibatkan perdebatan, email, pesan, serta lebih dari 100 halaman teks
  • Terkait kontroversi skor CVSS 9.9, dijelaskan bahwa skor awal 9.9 adalah nilai yang diperkirakan oleh seorang engineer RedHat dalam laporan VINCE dan ditinjau oleh engineer lain
  • Peneliti menilai skor awal 9.9 muncul karena RCE mudah dieksploitasi dan paketnya hadir secara luas, tetapi menambahkan bahwa dari sisi dampak ia sendiri tidak akan mengklasifikasikannya sebagai 9.9
  • Ia menyatakan bahwa laporan markdown lengkap dan exploit yang hanya dibagikan kepada CERT VINCE telah bocor
  • exploit.py awalnya hanya mengirim paket UDP dan membuat server IPP berbahaya, tetapi kemudian ditambahkan fungsi iklan zeroconf sehingga menjadi sebuah tool
  • Setelah itu, tool tersebut ditulis ulang dalam Go dan diintegrasikan ke bettercap, dengan penambahan kemampuan untuk secara transparan menyamar sebagai layanan yang diiklankan lewat zeroconf, Bonjour, dan Avahi di LAN, serta pemrosesan terkait IPP
  • Artikel berikutnya direncanakan membahas serangan terhadap Apple macOS menggunakan modul bettercap yang belum dipublikasikan, tetapi jadwalnya belum pasti karena prosedur publikasi lain

1 komentar

 
GN⁺ 2024-09-27
Komentar Hacker News
  • Saya kira ini lelucon. Isinya mengatakan bahwa “penyerang jarak jauh tanpa autentikasi dapat mengubah URL IPP printer yang sudah ada menjadi URL berbahaya atau memasang yang baru, sehingga memungkinkan eksekusi perintah arbitrer saat pekerjaan cetak dimulai di komputer itu”, tetapi Heartbleed saja 7,5, jadi rasanya mustahil ini 9,9
    Tweet aslinya menyebut “eksekusi kode jarak jauh tanpa autentikasi terhadap semua sistem GNU/Linux dan sebagainya”, tetapi kenyataannya di banyak distro CUPS hanya bind ke loopback atau bahkan tidak terpasang sama sekali
    Ia juga mengatakan telah memindai seluruh IPv4 publik beberapa kali sehari selama beberapa minggu dan menerima callback dari ratusan ribu perangkat. Kalau pemahaman saya benar, itu berarti ada sekitar 300 ribu instance CUPS terbuka di seluruh IPv4 publik, dan agar eksekusi kode jarak jauh terjadi, server CUPS tersebut harus menerima pekerjaan cetak, jadi sepertinya sebagian besar tidak akan begitu

    • Kalau membaca tulisannya, ini memang cukup buruk, tetapi lebih condong ke kesimpulan bahwa daemon cups-browsed itu sendiri seharusnya dihapus, dan ekosistem Linux perlu membahas masa depan CUPS secara serius
      Bug-bugnya terlihat mengejutkan sederhana, dan pada akhirnya ini isu keamanan yang cukup serius, tetapi respons upstream-nya bukan level yang layak diharapkan dari paket desktop Linux yang terpasang secara default
      Meski begitu, ini jelas bukan kepanikan CVSS 9,9 yang sampai menghentikan dunia
    • Supaya adil, penulisnya memang mengatakan “berdasarkan dampaknya saya tidak akan mengklasifikasikannya sebagai 9,9, tapi sebenarnya apa yang saya tahu”
    • Ada juga buffer overflow yang dapat dieksploitasi tanpa tindakan pengguna. Jalur foomatic yang membutuhkan pekerjaan cetak hanyalah salah satu yang paling mudah dipindai dan dieksploitasi
    • Saya tertawa keras pada meme “Look at me, I'm the printer now”. Terlepas dari penilaian tingkat keparahannya, setidaknya leluconnya berhasil
    • Heartbleed adalah kebocoran memori, sedangkan ini adalah eksekusi kode jarak jauh penuh tanpa tindakan pengguna. Eksekusi kode jarak jauh tentu berarti kebocoran informasi total dan lebih dari itu
      Tepatnya, eksekusi ditunda sampai pengguna berikutnya mencetak ke printernya menggunakan pengaturan printer yang telah diubah penyerang, dan kerentanannya ada di cupsd-browser, bukan cupsd
      Mungkin ada masalah dengan sikap penulisnya, tetapi kerentanan ini sendiri memang benar-benar besar
  • Orang yang mengekspos CUPS ke internet sudah berada pada tingkat ketidakpedulian yang tidak bisa dijangkau CVE

    • Layanan rentan yang dimaksud tampaknya listen di 0.0.0.0, dan ini mengkhawatirkan. Artinya secara default rentan terhadap serangan di LAN, dan jika server terekspos ke internet, port 631 harus diblokir secara eksplisit
      Tentu saja untuk memicunya pengguna harus mencetak sesuatu, dan secara pribadi rasanya saya belum pernah mencetak apa pun dari Linux, tetapi klaim menerima callback dari ratusan ribu mesin Linux terdengar masuk akal
    • Dalam kasus ini, “mengekspos CUPS ke internet” terdengar seperti berarti “menjalankan desktop Linux yang terhubung ke internet”. Saya tidak akan melakukannya, tetapi itu belum sampai gila, dan orang akan berharap instalasi desktop Debian default cukup aman bahkan tanpa firewall
      Setidaknya, menurut saya laptop Linux tidak seharusnya menjadi sangat rentan terhadap semua perangkat lain di tempat seperti Wi-Fi bandara
    • Orang yang pergi ke kafe dan memakai Wi-Fi publik pada dasarnya mengekspos CUPS dan bisa dieksploitasi. Menepisnya begitu saja tidak membantu siapa pun
    • Absurdnya, CUPS berjalan sebagai daemon sistem, bukan program pengguna yang disandbox kuat
    • Meski begitu, untuk pergerakan lateral dan eskalasi hak akses, ini kemenangan penuh
  • Tergantung bagaimana menafsirkan metrik Scope di CVSSv3, angka yang lebih tepat tampaknya 8,8 atau 9,6
    Ringkasnya, pada beberapa varian desktop Linux, CUPS yang terekspos ke LAN berjalan di 0.0.0.0, berjalan sebagai root, dan rentan terhadap eksekusi kode jarak jauh tanpa autentikasi. Pada sebagian besar Linux berorientasi server seperti Ubuntu Server atau CentOS, ini bukan layanan default, tetapi pada kebanyakan Linux desktop tampaknya dimulai secara default
    Untuk memicu eksekusi kode jarak jauh, pengguna mesin Linux yang rentan harus mencetak dokumen setelah eksploitasi dilakukan
    evilsocket mengatakan menerima ratusan ribu callback, dan meskipun kebanyakan dari kita hampir tidak pernah mencetak dari Linux, dampak sebesar itu bisa cukup untuk membuat botnet besar

    • Di universitas ada banyak orang yang memakai desktop Linux dengan IP publik dan terus mencetak, entah makalah, tulisan sendiri, atau tulisan orang lain
    • Pangsa desktop Linux, bahkan tidak termasuk ChromeOS, kira-kira 4,5%. Meski kebanyakan dari kita tidak mencetak, pekerjaan cetak yang keluar dari host Linux kemungkinan masih cukup banyak
    • Heartbleed 7,5 dan hanya 0,4 lebih rendah dari insiden xz, jadi saya tidak mengerti bagaimana ini bisa 9,6
  • Saya sempat sedikit panik setelah mendengar berita karena membiarkan cupsd terbuka ke internet, tetapi seperti judul di sini, isu ini juga ada bagian yang salah disampaikan. Masalahnya bukan cupsd inti, melainkan cups-browsed, paket/komponen terpisah
    Gentoo Linux yang saya pakai untuk server menyediakan cups-browsed sebagai paket terpisah, dan karena saya tidak memasangnya, saya tidak terdampak. Sebagian besar pengguna CUPS yang tidak memasang paket tambahan ini juga tidak terdampak bug ini
    Mengatakan semua sistem yang menjalankan CUPS bisa diretas berarti salah menggambarkan skalanya

    • Debian cenderung konservatif, tetapi saya selalu tidak suka bahwa saat memasang cups, biasanya cups-browsed ikut terpasang secara default. Sepertinya bisa diatasi dengan “no install recommends”, tetapi kalau tidak salah driver tambahan seperti hplip kadang menariknya masuk lagi
      Di rumah saya hanya mematikan layanannya, tetapi cukup menyebalkan melihat semakin banyak software keluar dari cakupannya dan membuat komponen yang seharusnya opsional seolah-olah wajib
      Contoh serupa adalah avahi-daemon. Kalau mencoba menghapusnya dari Debian/Ubuntu desktop, besar kemungkinan software lain yang membuat kita heran kenapa avahi harus menjadi dependensi kuat juga ikut terhapus
  • Bagian yang mengatakan bahwa “terlalu banyak hal diharapkan dari peneliti dan dianggap wajar karena triager yang bersikap seolah peneliti keamanan seperti Anda harus ‘membuktikan bahwa mereka layak didengar’” bisa dipahami, tetapi kenyataannya memang menyedihkan
    Untuk setiap laporan yang diteliti dengan baik seperti ini, masuk 57 laporan spam berkualitas rendah yang mencoba memeras imbalan bug bounty atau mencantumkan penemuan CVE di CV. Terutama dengan meningkatnya penggunaan LLM, spam seperti itu mudah menipu
    Situasinya menyedihkan, tetapi sulit juga sepenuhnya menyalahkan pengembang karena bersikap skeptis

  • Singkatnya, cups-browsed mendengarkan port UDP 631 dan dapat memasang printer secara otomatis tanpa konfirmasi pengguna
    Penyerang memanfaatkan “fitur” ini untuk memasang printer palsu, tanpa konfirmasi pengguna, yang memiliki driver kustom yang dapat diunduh dari host arbitrer, lalu menentukan perintah yang akan dijalankan saat pekerjaan cetak dikirim
    Jika pengguna mencetak sesuatu ke printer palsu itu, perintah tersebut akan dijalankan

    • Karena CUPS diperkenalkan pada 1999, mungkin pemasangan otomatis tanpa konfirmasi pengguna masih masuk akal saat itu. Namun saya tidak tahu mengapa hal itu masih tetap ada sampai sekarang
  • Dalam kasus ini, tampaknya distro menyertakan cups-browsed sebagai fitur, tetapi saya selalu merasa buruk bahwa Ubuntu/Debian, dan mungkin semua distro berbasis deb, secara otomatis menyalakan hampir semua layanan saat instalasi
    Artinya, hanya karena memasang satu paket, layanan jaringan lain yang terpasang sebagai dependensi bisa tanpa sengaja terbuka
    exim4 sudah diketahui, tetapi agar adil, default-nya hanya mendengarkan localhost sehingga mungkin bukan masalah besar. Saya baru saja memasang cups-browsed di satu mesin Debian, dan dua layanan (cups-browsed dan avahi) yang mendengarkan di 0.0.0.0 ikut berjalan
    Ini tidak terjadi pada distro keluarga Arch/Gentoo dan CentOS

  • Skor CVSS asli yang diposting di Twitter menyatakan bahwa tidak diperlukan interaksi pengguna. Namun jika membaca rantai eksekusi kode jarak jauh di halaman tersebut, tertulis “menunggu pekerjaan cetak dikirim ke printer palsu agar direktif PPD dan perintah terkait dijalankan”
    Sepertinya jika Alice tidak menekan tombol cetak, pekerjaan cetak tidak akan terpicu; saya penasaran apakah ada yang saya lewatkan. Ini bukan karena saya meragukan evilsocket, melainkan untuk memastikan pemahaman saya

    • Ada juga buffer overflow yang ditemukan dengan fuzzer, dan ini bisa mengarah ke eksekusi kode jarak jauh tanpa interaksi pengguna. Namun penulis tidak memiliki keahlian yang cukup di bidang ini untuk membuat exploit yang benar-benar berfungsi
    • Tergantung pada definisi “interaksi”. Sejauh yang saya pahami, Alice tidak perlu mencetak dokumen yang disediakan penyerang; cukup mencetak apa saja
  • Setiap kali harus mencetak sesuatu di MacOS, saya kembali teringat betapa saya membenci printer dan perangkat lunak terkait printer. Saya sudah menggunakan komputer selama 40 tahun, dan sungguh, setiap 10 tahun printer menjadi makin merepotkan

    • Menarik bahwa gerakan FSF sebagian besar bermula dari kekesalan Stallman terhadap kualitas driver printer. Namun entah kenapa, selama 40 tahun gerakan itu tidak berhasil meningkatkan kualitas perangkat lunak terkait printer secara nyata
    • Saya menulis kode printer selama lebih dari 10 tahun. Saya paham betapa sulitnya masalah teknisnya, tetapi para vendor membuat situasinya jauh lebih buruk. Printer itu menjijikkan, dan menurut saya puncaknya adalah masa LaserJet III
    • Saya merasa printer sekarang jauh lebih baik daripada 10 tahun lalu. Setidaknya di MacOS dan iOS, saya tidak punya masalah menemukan printer dan mencetak. 10 tahun lalu itu menyiksa, tetapi sekarang menurut saya mulus, dan tidak perlu memasang driver
    • Kabar terbaru: HP menambahkan AI ke driver printer. Ini bukan lelucon: https://hardware.slashdot.org/story/24/09/27/0030239/hp-is-a...
    • Memang kehilangan kontrol pekerjaan, tetapi jika dokumen dikonversi ke PostScript lalu dikirim dengan netcat ke port printer, itu berfungsi dengan baik
      pdf2ps - | nc 9001