Kerentanan RCE qBittorrent: Kesalahan validasi sertifikat SSL diabaikan selama 14 tahun
(sharpsec.run)- 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
9824d86pada 6 April 2010 - Perilaku default diubah pada commit
3d9e971tanggal 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.orgyang di-hardcode - Setelah diunduh, qBittorrent mengganti nama file tersebut menjadi
.exelalu menjalankannya, kemudian menghapus file sementara setelah selesai - Perilaku ini ada sejak Juni 2015 hingga sekarang, dan memengaruhi
v3.2.1sampaiv5.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
linkpada 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
.gzdari 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
-smilik mitmproxy bersama skrip Python, otomatisasi berikut dimungkinkan- Mengganti
.exePython 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
- Mengganti
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
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
Yang mencolok adalah ini bukan bug, melainkan “fitur”
void downloadThread::ignoreSslErrors(QNetworkReply* reply,QList errors) {
// Ignore all SSL errors
reply->ignoreSslErrors(errors);
}
https://github.com/qbittorrent/qBittorrent/commit/9824d86a3c...
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
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
Jika ada yang terdampak, kemungkinan besar itu serangan tertarget
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
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
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
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
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