- Pembaruan MV3 di Chrome menghapus izin
webRequestBlockinguntuk melemahkan kemampuan adblocker yang ada - Penulis menemukan pada 2023 sebuah bug yang memungkinkan mengakali
webRequestBlockingbahkan di lingkungan MV3 - Bug ini terjadi karena struktur binding JavaScript yang rapuh dan kode lama yang masih dibiarkan tetap ada
- Dengan memanipulasi ID instance WebView, pemeriksaan izin bisa dilewati sehingga fungsi pemblokiran tetap dapat digunakan di lingkungan MV3
- Saat ini patch sudah diterapkan sehingga metode bypass ini tidak lagi berfungsi
MV3 dan perubahan pada adblocker
- Chrome secara bertahap menghentikan ekstensi MV2 dan beralih ke MV3
- MV3 menghapus izin
webRequestBlocking, sehingga adblocker tidak lagi bisa memblokir permintaan jaringan secara dinamis lewat skrip - Sebagai pengganti izin tersebut, API
declarativeNetRequestditambahkan, tetapi tidak mendukung tingkat fleksibilitas yang sama - Perubahan ini menyebabkan kemampuan adblocker menurun secara signifikan
Keterbatasan struktur binding JavaScript
- Inti Chrome dikembangkan dengan C++, tetapi ekstensi berjalan dengan JavaScript, dan API ekstensi juga diakses melalui JS binding
- Hingga 2015–2016, API diinisialisasi dan diverifikasi dengan menyisipkan file JS ke situs (modul binding ekstensi)
- Metode ini rentan terhadap override fungsi global/prototipe JS, sehingga memicu beberapa bug Universal XSS
- Setelah itu Google memindahkan binding utama ke C++, tetapi sebagian file JS binding masih tersisa
- Sampai sekarang, API tertentu seperti
chrome.webRequestmasih menggunakan struktur JS binding
Bypass menggunakan kelas event web request
-
Di MV2, pemblokiran web request bisa diimplementasikan dengan kode berikut
chrome.webRequest.onBeforeRequest.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
Di MV3, opsi
blockingdilarang sehingga pemblokiran normal tidak memungkinkan -
Namun, lewat
.constructordari eventwebRequest, objek event arbitrer dapat dibuat -
Secara internal, objek event ini dikelola oleh kelas wrapper khusus dari JS binding
-
Jika
opt_webViewInstanceId, salah satu parameter konstruktor, ditentukan, maka logika izin khusus aplikasi platform bisa dilewati sehingga pemeriksaan izin blocking dapat dibypasslet WebRequestEvent = chrome.webRequest.onBeforeRequest.constructor let fakeEvent = new WebRequestEvent("webRequest.onBeforeRequest", 0, 0, 0, 1337) fakeEvent.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
Awalnya mekanisme ini dirancang agar hanya bisa digunakan oleh aplikasi platform, tetapi karena validasi WebView ID lemah, ekstensi biasa pun dapat menyalahgunakannya
Hasil dan patch keamanan
- Dengan celah ini, membuat adblocker yang sepenuhnya berfungsi di lingkungan MV3 benar-benar memungkinkan
- Penulis melaporkan bug ini ke Google pada 2023, dan pada Chrome 118 bug ini ditambal dengan memastikan kepemilikan izin WebView diperiksa dengan benar
- Tidak ada hadiah bug bounty yang diberikan, karena secara struktural celah ini hanya memungkinkan bypass izin tanpa paparan data tambahan
- Kasus ini menunjukkan bahwa perubahan kode beberapa puluh baris saja dapat melumpuhkan pembaruan keamanan perusahaan besar
Kesimpulan dan referensi
- Bug ini sekarang sudah ditambal dan tidak lagi berfungsi
- Sebagai contoh lain dari kerentanan terkait ekstensi Chrome yang menarik, ada juga kasus yang benar-benar mendapat nomor CVE dan hadiah $10.000 (lihat tulisan blog terpisah)
4 komentar
Mungkin setelah pembaruan itu, pendapatan penyedia adblock justru naik lebih tinggi.
Aplikasi standalone yang memblokir langsung di tingkat jaringan memang hanya bisa dipakai berbayar, jadi kemungkinan terjual cukup banyak.
Mengunggah kerentanan yang setelah 2 tahun berlalu sudah sama sekali tidak berarti lagi sambil sengaja menyebut tidak dibayar untuk itu... secara pribadi rasanya tidak terlalu keren.
Tapi mungkin hal seperti ini juga memang harus ditulis di blog untuk membuktikan nilai diri sendiri?
Sejujurnya saya juga ingin belajar pola pikir seperti ini dan menulis lebih banyak di blog
Cukup pakai Firefox. Dalam 1–2 tahun terakhir ini performanya jauh lebih cepat, jadi tidak buruk sama sekali.
Saya sudah bertahun-tahun memakai Firefox sebagai browser utama dan sesekali membandingkannya dengan Chrome, dan terutama belakangan ini saya merasa Firefox sudah cukup layak dipakai.
Bahkan halaman web yang dulu mengabaikan standar web, seperti bank-bank di Korea, belakangan ini sudah banyak diperbaiki sehingga sebagian besar kini juga berfungsi dengan baik di Firefox.
Untuk kustomisasi juga, Firefox jauh lebih mudah.
Komentar Hacker News
Meskipun ingin mencoba Firefox, hambatan terbesarnya adalah bug pemuatan situs web yang kadang muncul, ditambah tidak bisa memasang PWA (Progressive Web Apps). Chrome dan browser turunannya sudah lama mendukung fitur ini, jadi saya tidak begitu paham kenapa Firefox masih belum mengimplementasikannya. Saya memang sempat menemukan ekstensi pihak ketiga (PWAs for Firefox), tetapi saya enggan memakainya dari sisi privasi
Sekalipun ada cara untuk mengakali tindakan Google, saya rasa itu bukan arah yang benar. Jika orang tidak setuju dengan langkah Google, satu-satunya cara yang benar adalah meninggalkan Chrome dan semua browser berbasis Chromium. Penting untuk memukul dominasi Google dan merebut kendali mereka atas arah masa depan web
Jalan akal-akalan yang sesungguhnya adalah memakai Firefox. uBlock Origin bekerja paling baik di Firefox
uBlock Origin works best on Firefox
Saya juga ragu MV3 benar-benar lebih aman daripada MV2 menurut Google. Rasanya pindah ke MV3 tidak secara mendasar membuat keamanan jadi lebih kuat
Tentang kasus seseorang menemukan cara mengakali adblocker lalu memberitahukannya ke Google, ada reaksi seperti, “menemukannya lalu langsung ngadu ke Google, keren sekali”
OP melaporkan “isu” yang sama sekali bukan masalah ke Google, sehingga menutup jalan bagi pengembang addon untuk mengakali pembatasan MV3. Semoga itu memang bernilai $0
Sejak mulai memakai Brave, saya sama sekali tidak merindukan Chrome
Brave
Stop using Brave browser
Menanggapi klaim bahwa "adblocker mutlak membutuhkan webRequestBlocking, dan karena Google menghasilkan uang dari iklan maka penghapusan fitur itu sangat disengaja," ada juga pendapat yang mengatakan, "itu tidak benar; siapa pun bisa memakai uBlock Origin Lite di Chrome dan manifest v3, performanya bagus dan saya tidak merasakan perbedaan dengan uBlock Origin biasa. Semuanya difilter di C++ sehingga jauh lebih cepat. Memang ada batas maksimum rule, tetapi untuk sekarang masih sangat memadai"
Selain laptop kerja, saya hampir tidak pernah memakai Chrome, dan sehari-hari tetap menggunakan Firefox. Meski begitu, saya tetap merasa sayang karena tidak bisa memakai uBlock Origin untuk kegiatan browsing kerja seperti riset dan dokumen
Kalau cuma ingin jalan akal-akalan, tinggal pasang Firefox saja