2 poin oleh GN⁺ 2024-11-02 | 1 komentar | Bagikan ke WhatsApp
  • DownloadManager qBittorrent mengabaikan kesalahan validasi sertifikat SSL selama sekitar 14 tahun 6 bulan, dari 6 April 2010 hingga 12 Oktober 2024, sehingga berbagai alur unduhan menjadi permukaan serangan dalam situasi penyadapan jaringan
  • Masalah ini ditetapkan sebagai CVE-2024-51774, dan eksploitasi memerlukan akses MITM atau spoofing DNS
  • Jalur yang menggunakan DownloadManager seperti pencarian, unduhan .torrent, feed RSS, dan unduhan favicon terdampak, serta dapat menerima sertifikat kedaluwarsa maupun self-signed
  • Alur prompt instalasi Python dan pemeriksaan pembaruan RSS di Windows dapat berujung pada unduhan file eksekusi atau manipulasi tautan pembaruan jika respons URL yang di-hardcode diubah
  • Lebih aman bagi pengguna untuk melakukan upgrade dengan mengunduh v5.0.1 secara manual langsung lewat browser daripada melalui prompt pembaruan di dalam aplikasi

Bypass validasi sertifikat yang berlangsung lebih dari 14 tahun

  • Kelas DownloadManager qBittorrent telah mengabaikan semua kesalahan validasi sertifikat SSL sejak commit 9824d86 pada 6 April 2010
  • Perilaku default diubah pada commit 3d9e971 tanggal 12 Oktober 2024 agar sertifikat divalidasi
  • Rilis patch pertama adalah qBittorrent v5.0.1, yang terbit 2 hari sebelum waktu penulisan artikel
  • Masalah ini ditetapkan sebagai CVE-2024-51774
  • Syarat eksploitasi adalah akses MITM atau spoofing DNS

Permukaan serangan luas yang dibuat DownloadManager

  • Cakupan penggunaan DownloadManager luas sehingga pencarian, unduhan .torrent, feed RSS, dan unduhan favicon ikut terdampak
  • Jalur-jalur tersebut dapat menerima sertifikat kedaluwarsa, sertifikat self-signed, atau sertifikat yang memenuhi keduanya
  • Jalur dampak utama terbagi menjadi instalasi Python di Windows, pembaruan perangkat lunak, feed RSS, dan permukaan serangan pustaka dekompresi

Unduhan file eksekusi pada alur instalasi Python di Windows

  • Di Windows, jika Python yang cukup baru belum terpasang, qBittorrent akan menampilkan jendela yang menanyakan instalasi atau pembaruan Python agar plugin pencarian bisa digunakan
  • Jika pengguna mengeklik Yes yang dipilih secara default atau menekan Enter, qBittorrent akan mengunduh file instalasi Python dari URL python.org yang di-hardcode
  • Setelah diunduh, qBittorrent mengganti nama file tersebut menjadi .exe lalu menjalankannya, kemudian menghapus file sementara setelah selesai
  • Perilaku ini ada sejak Juni 2015 hingga sekarang, dan memengaruhi v3.2.1 sampai v5.0.0
  • Pada varian OS lain, jika Python tidak ada atau tidak cukup baru, widget pencarian dinonaktifkan, dan perilaku yang sama tampaknya tidak dapat direproduksi
  • File eksekusi bisa disimpan di jalur seperti C:\Users\_user_\AppData\Local\Temp\is-G61QK.tmp
  • Mungkin karena perilaku QProcess, dua thread file eksekusi bisa terbentuk dan hanya satu yang berakhir, sementara yang lain dapat tetap dalam keadaan sleeping

Manipulasi URL melalui RSS pemeriksaan pembaruan

  • qBittorrent versi Windows atau Linux yang terpasang akan secara default memeriksa pembaruan saat dijalankan jika bukan file appImage
  • Pemeriksaan pembaruan dilakukan dengan mengunduh dokumen XML dari URL RSS Fosshub yang di-hardcode lalu mem-parsing informasi rilis program
  • Jika XML berisi versi yang lebih tinggi daripada versi yang sedang berjalan, qBittorrent mengekstrak update URL dan menanyakan kepada pengguna apakah ingin mengunjungi URL tersebut tanpa pemfilteran atau verifikasi tambahan
  • Jika pengguna menerima prompt tersebut, URL akan dibuka di browser default
  • Dalam konteks kepercayaan bahwa tautan itu disediakan perangkat lunak, pengguna akan mengharapkan file .exe
  • Jika penyerang mengarahkan ke situs berbagi file seperti mediafire, pengguna bisa menerima file eksekusi yang dikendalikan penyerang seolah-olah itu pembaruan
  • Karena qBittorrent bersifat open source, relatif mudah untuk menambahkan fungsi backdoor ke versi terbaru lalu mengompilasinya ulang
  • Pengembang menyediakan kunci untuk verifikasi tanda tangan biner, tetapi perlindungan hanya efektif jika pengguna benar-benar memverifikasi dan mematuhi kegagalan verifikasi

Injeksi feed dan tautan RSS

  • Semua feed RSS yang di-parse aplikasi melewati DownloadManager sehingga dapat dibajak
  • URL yang dikunjungi korban dapat diamati dan didaftarkan, dan URL RSS secara karakteristik bersifat statis serta bertahan lama
  • Elemen link pada tiap item di-parse secara langsung, dan dapat diunduh saat pengguna melakukan klik ganda
  • Bahkan tanpa modifikasi MITM, URL arbitrer yang dimasukkan penulis feed atau penyerang yang mencemari feed RSS yang dilanggan pengguna dapat dibuka hanya dengan satu kali klik ganda
  • CVE-2019-13640 adalah kerentanan yang memungkinkan eksekusi perintah jarak jauh melalui shell metacharacter pada nama torrent atau parameter tracker saat ini, dan penyerang MITM dapat memasukkan data berbahaya ke RSS sehingga meningkatkan risiko kombinasi serangan

Unduhan basis data GeoIP dan permukaan serangan dekompresi

  • Saat dijalankan, qBittorrent secara default otomatis mengunduh basis data MaxMind GeoIP biner berekstensi .gz dari URL yang di-hardcode lalu mendekompresinya
  • Jika ada kerentanan pada dekompresi zlib, penyerang dapat menargetkan permukaan serangan ini dengan file arbitrer hingga 64MB
  • Sebagai contoh, CVE-2022-37434 adalah buffer overflow Critical dengan CVSS 9.8 pada 2022, tetapi tidak berlaku di sini karena fungsi inflateGetHeader() tidak dipanggil
  • Setelah dekompresi, kode yang mem-parsing basis data MaxMind biner cukup terlindungi pada 2024, tetapi di masa lalu tidak demikian dan mungkin ada permukaan serangan tambahan
  • Dalam salah satu commit fungsi gzip::decompress(), buffer target diubah dari alokasi statis di stack menjadi alokasi dinamis di heap, dan karena ada pemeriksaan sebelum penulisan, hal ini tidak dapat dieksploitasi

Skenario serangan yang dapat diotomatisasi

  • URL file instalasi Python dan URL feed RSS pembaruan sama-sama di-hardcode, sehingga skrip berbahaya di lingkungan MITM dapat menginventarisasi versi rentan dan menyerang
  • URL feed RSS tidak punya alasan untuk dikunjungi kecuali saat qBittorrent sedang berjalan, sehingga dapat digunakan sebagai sidik jari perangkat lunak
  • Karena tidak ada validasi sertifikat, penyerang dapat memalsukan server target tanpa perlu deployment Man-On-The-Side yang rumit seperti QUANTUM
  • Karena sifat URL yang di-hardcode, penyerang bisa secara selektif mencegat hanya permintaan qBittorrent yang tidak memverifikasi, tanpa memicu peringatan kegagalan koneksi aman dari browser atau aplikasi lain
  • Dengan memakai opsi -s milik mitmproxy bersama skrip Python, otomatisasi berikut dimungkinkan
    • Mengganti .exe Python dengan file eksekusi arbitrer: RCE satu klik
    • Mengganti URL RSS pembaruan qBittorrent secara otomatis: pembajakan browser/RCE, memerlukan interaksi pengguna tingkat sedang
    • Mengganti semua atau tautan tertentu di penampil RSS qBittorrent: RCE hingga 2019, pembajakan unduhan

Upgrade dan cara mitigasi

  • Harus melakukan upgrade ke qBittorrent v5.0.1
  • Disarankan melakukan upgrade dengan mengunduh manual langsung lewat browser, bukan melalui prompt pembaruan di dalam aplikasi
  • Sebagai alternatif, bisa menggunakan klien seperti Deluge atau Transmission yang tidak memiliki kerentanan ini
  • Serangan yang memerlukan MITM sulit dianggap sekadar risiko teoretis, mengingat sejarah terbaru dan contoh nyata di beberapa negara
  • Ada kontak dengan maintainer repositori, tetapi belum ada jawaban apakah mereka berniat menerbitkan advisory keamanan GitHub

1 komentar

 
GN⁺ 2024-11-02
Komentar Hacker News
  • Kelas DownloadManager qBittorrent telah mengabaikan semua kesalahan verifikasi sertifikat SSL yang terjadi di semua platform selama 14 tahun 6 bulan sejak commit 9824d86 pada 6 April 2010
    Kelihatannya cukup serius

  • Bukan bermaksud meremehkan kerentanan ini, tetapi menjadikan kombinasi sertifikat TLS valid dan nama domain sebagai satu-satunya garis pertahanan pada jalur yang memungkinkan eksekusi kode jarak jauh menurut saya nyaris seperti bencana
    Setidaknya, jika aplikasi mengunduh dan menjalankan artefak dari internet, aplikasi harus dipatok ke versi tertentu dan memverifikasi hash file yang diunduh sebelum menjalankannya

    • Kalau begitu apakah artinya pembaruan otomatis tidak mungkin dilakukan?

    • Menurut saya standar minimumnya adalah verifikasi tanda tangan
      Jika perangkat lunak diperbarui cukup sering, semestinya ada cukup kesempatan untuk merotasi kunci

    • Di Windows, alat build bisa memakai sertifikat penandatanganan kode, lalu menyerahkan verifikasi binary yang diunduh kepada sistem operasi
      Namun untuk penandatanganan kode, server timestamp wajib dipakai agar tidak rusak setelah sertifikat kedaluwarsa

    • Dalam kasus ini, menurut saya pemeriksaan hash sulit karena sifat potensi serangan man-in-the-middle
      Jika penyerang dapat melihat dan mengubah isi permintaan, pemeriksaan hash pun tidak berguna selain untuk pengecekan integritas

      Cara aplikasi desktop mengirim pembaruan otomatis atau permintaan pengecekan ke domain tertentu tampaknya secara umum belum mendapat perhatian yang cukup dari sudut pandang keamanan
      Ada juga skenario seperti penulis asli berhenti memperpanjang domain lalu domain itu diambil alih secara bermusuhan, dan saya belum menemukan solusi yang baik

  • Akan mengejutkan jika kita bisa tahu berapa banyak orang yang benar-benar terdampak masalah ini selama sekitar 15 tahun terakhir
    Bahkan di sisi internet yang agak mencurigakan, saya bertanya-tanya seberapa penting verifikasi SSL bagi penyerang yang bisa membaur di tengah kerumunan
    Terlalu banyak hal “sekadar berjalan” karena tidak ada yang peduli, dan sekarang masalah ini tersorot, situasinya pasti akan memburuk bagi orang yang tidak melakukan pembaruan otomatis

    • Mungkin mendekati 0
      Kode ini bertugas mengunduh Python dari python.org, dan walau bisa dieksploitasi, serangannya harus cukup tertarget serta kemungkinan sudah memerlukan tingkat akses tertentu ke target
      Untuk mengeksploitasinya dengan cara lain diperlukan hal seperti pengambilalihan domain python.org, yang kemungkinan besar akan disadari semua orang
    • Menarik jika bisa tahu berapa banyak orang yang benar-benar terdampak selama sekitar 15 tahun terakhir, tetapi secara pribadi saya pikir angkanya hampir 0
      Jika ada yang terdampak, kemungkinan besar itu serangan tertarget
    • Saya juga pikir 0
      Sebagian besar tulisannya terasa dilebih-lebihkan, dan memang ada sesuatu yang bermasalah, tetapi ungkapan “eksekusi kode jarak jauh qBittorrent” secara teknis benar namun terlalu mengkhawatirkan
    • Untuk hal yang seharusnya dilakukan dengan peramban web, saya melakukannya dengan peramban web; aplikasi torrent biasanya hanya saya buka saat ingin mengunduh file .torrent yang saya dapatkan sendiri
    • Saya juga berpikir begitu
      Data riilnya tampak hampir mustahil didapat, tetapi kalau bisa dilihat pasti menarik
  • Kalau pernah melihat kode qBittorrent, Anda tahu kodenya benar-benar mengerikan
    Fungsi tanpa komentar berlanjut berhalaman-halaman, spasinya rapat, dan tampak seperti catatan penjara seorang pasien psikosis yang dipenjara secara tidak adil
    Bahkan di bagian kecil yang saya lihat, hanya beberapa halaman yang padat, sama sekali tidak ada pemeriksaan nilai kembalian

    Saya ingat jika sebuah field berisi nilai 3 huruf yang valid alih-alih nilai 2 huruf yang biasanya benar, sekitar satu menit kemudian program akan crash atau semacamnya
    Sekitar 20 tahun lalu saya pernah dua kali dibayar untuk memrogram dengan C++, dan setelah mendapat pesan dari maintainer yang kira-kira berbunyi “kalau begitu silakan lihat sendiri”, saya menjalankannya dengan debugger
    Saya berhasil sampai ke titik di GUI tempat nilai yang salah dan nilai yang benar dibaca, lalu ketika menelusuri nilai itu, tiba-tiba -1 sudah diteruskan ke sana-sini, dan program terus berjalan begitu saja untuk beberapa saat

    Pada akhirnya, versi yang dijalankan dengan nilai salah itu crash di sebuah fungsi yang cukup jauh, disertai pesan kesalahan seperti dari pasien psikosis yang dipenjara secara tidak adil
    Setelah itu salah satu developer qBittorrent sungguhan memang memperbaikinya di rilis berikutnya, tetapi bagaimanapun, begitulah kodenya

  • Hanya tertulis “BUGFIX: Don't ignore SSL errors (sledgehammer999)”
    https://www.qbittorrent.org/news
    Secara pribadi saya pikir perlu ada pengumuman keamanan

  • Bahkan dengan pemeriksaan sertifikat yang benar, mengunduh dan menjalankan executable jarak jauh menurut saya secara definisi adalah kerentanan eksekusi kode jarak jauh
    Syncthing juga memakai cara ini, dan mungkin memang memeriksa sertifikat, tetapi pembaruan otomatis tanpa pengawasan secara logis sulit dibedakan dari RAT/Trojan horse

    • Secara harfiah tidak begitu
    • Saya sulit setuju dengan ini
      Bagian yang membuatnya menjadi kerentanan muncul ketika pihak ketiga bisa mengeksploitasinya
      Karena kita pada akhirnya memang harus memercayai penyedia perangkat lunak, pembaruan otomatis itu sendiri bukan berarti kerentanan eksekusi kode jarak jauh
    • Pada dasarnya tidak berbeda dengan menekan Yes pada “Apakah Anda ingin meningkatkan ke versi terbaru?”
    • Bagaimana kalau orang yang sama yang mengunduh program aslinya juga melakukan pembaruan otomatis tanpa pengawasan; atau bagaimana jika tidak demikian?
  • Meski bukan penyebab langsung kerentanan ini, aplikasi seperti ini yang berkomunikasi dengan banyak node yang berpotensi jahat tampaknya akan sangat diuntungkan oleh keamanan memori
    Namun implementasi yang ada sekarang semuanya tampak ditulis dalam C++
    Artikel itu juga membahas potensi kerentanan semacam ini pada poin nomor 4

Bahkan Deluge yang ditulis dengan Python pun bergantung pada libtorrent yang ditulis dalam C++
Saya tidak tahu apakah ada fork modern dari klien Azureus lama yang berbasis Java
Saat ini banyak klien BitTorrent memisahkan GUI dari proses daemon yang menangani pemrosesan torrent sebenarnya, jadi jika daemon dibuat dengan Java lalu dihubungkan ke GUI native, mungkin bisa menghasilkan keseimbangan yang cukup baik antara keamanan, performa, dan pengalaman pengguna

  • Sekilas mencari saja sudah ada beberapa library BitTorrent Go murni

  • Ada rqbit yang ditulis dalam Rust dan tidak bergantung pada libtorrent: https://github.com/ikatson/rqbit

  • Sebagai pertanyaan malas alih-alih mencari sendiri demi diskusi: dari mana sebaiknya memulai jika ingin membuat alternatif libtorrent?
    Saya juga penasaran apakah pernah ada upaya atau kisah sukses, serta apakah ada klien yang benar-benar berfungsi di dunia nyata dengan implementasi lain

  • Terutama makin ke bagian belakang, poin-poinnya terlihat agak berlebihan
    Nomor 1, “loader executable berbahaya dengan fungsi penyamaran”, isinya adalah klien mengunduh Python dari python.org lewat HTTPS
    Ini memang tidak bagus, terutama karena di-hardcode ke 3.12.4, tetapi saya tidak melihat jalur eksploitasi yang jelas tanpa membutuhkan serangan man-in-the-middle sekaligus interaksi pengguna

    Nomor 2, “pembajakan browser + pengunduhan executable”, isinya adalah klien mengunduh file RSS lewat HTTPS, lalu dalam kondisi tertentu menanyakan kepada pengguna apakah akan membuka URL di dalam file itu
    Risikonya lebih rendah daripada nomor 1, dan bahkan jika pengguna diserang dengan man-in-the-middle lalu dibuat mengklik “update”, pada akhirnya yang bisa ditampilkan hanya halaman web

    Nomor 3, “injeksi URL arbitrer di feed RSS”, sepertinya penelitinya salah memahami perilaku yang diharapkan dari klien RSS
    Nomor 4, “permukaan serangan library dekompresi”, kalau bisa menemukan kerentanan zlib, ada jauh lebih banyak hal yang lebih buruk untuk dilakukan daripada menyerang klien torrent
    Dekompresi input pada dasarnya adalah operasi yang diasumsikan aman

    • Yang langsung terpikir adalah server HTTP yang mendukung kompresi stream

    • Benar
      Saya tidak ingin terdengar terlalu negatif, tetapi para “peneliti” keamanan tampaknya meraih kemungkinan yang sangat tipis demi sedikit ketenaran
      Saya akan lebih menghormatinya jika didokumentasikan secara jujur, tetapi cara yang dilakukan di sini hanya membuat orang mengernyit

    • Jika kesalahan sertifikat tidak diabaikan, poin-poin itu akan menjadi sepele
      Karena masalah aslinya adalah mengabaikan kesalahan SSL, pada praktiknya semua unduhan HTTPS telah diturunkan menjadi unduhan HTTP, dan dapat diserang bahkan tanpa serangan man-in-the-middle

      Dengan kata lain, ketiadaan verifikasi SSL membuat URL HTTPS memberi rasa aman palsu kepada peninjau, seolah-olah ada keamanan

    • Setuju
      Menyebut ini sebagai “kerentanan eksekusi kode jarak jauh” adalah hiperbola yang konyol

      Berikutnya apakah mereka akan mengatakan browser web punya “kerentanan eksekusi kode jarak jauh” karena memungkinkan pengguna mengunduh dan menjalankan program dari situs acak yang mungkin aman atau tidak?
      Atau apakah mereka juga akan mengumumkan lagi fakta bahwa jika tinggal di negara otoriter, pemerintah bisa melakukan hal buruk?

  • Mengejutkan bahwa kualitas masalah-masalah ini serendah itu, padahal qBittorrent adalah klien yang 1000 kali lebih berkinerja dibanding pilihan lain yang disebut di artikel

    • Deluge juga punya performa sebagus qBittorrent
      Yang menghasilkan performa itu adalah libtorrent-rasterbar(libtorrent.org)
  • Untuk mengompilasi dan menjalankan versi terbaru, https://github.com/userdocs/qbittorrent-nox-static adalah skrip bantu yang bagus untuk membangun binary statis dengan Docker
    Saya ingin menjalankan 5.0.0 dengan libtorrent 1.2, dan skrip ini jauh paling mudah