- Commit uBlock Origin menulis ulang alur CNAME uncloaking dalam pemrosesan jaringan Firefox, dan mengubahnya agar IP yang diperoleh dari kueri DNS tercermin di
details.ip - Cache Map
cnamesyang lama dihapus dan diganti dengan ring buffer 256 entri berbasisdnsList,dnsDict,dnsWritePtrserta cache TTL60000ms - Kueri DNS menggunakan
browser.dns.resolve(hn, [ 'canonical_name' ]), dancanonicalNamesertaaddresses[0]dari hasilnya masing-masing dimanfaatkan sebagai CNAME dan IP - Penanganan pengecualian CNAME tetap mempertahankan kondisi 1st-party, ignore list, dan root document, sementara alamat IPv4 atau hostname yang diawali
[dikecualikan dari kueri ulang - Versi minimum Chromium naik menjadi
80.0, versi minimum Opera naik menjadi67.0, dan nilai defaultcnameMaxTTLpada pengaturan tersembunyi dihapus
Struktur cache DNS Firefox ditulis ulang
- Kode terkait CNAME uncloaking di
platform/firefox/vapi-background-ext.jsdiubah dari struktur berbasis Map global menjadi struktur cache DNS di dalam class - Alih-alih status global
cnameUncloakEnableddan Mapcnamesyang lama, cache dikelola dengan field berikutdnsList: ring bufferdnsWritePtr: posisi tulis berikutnyadnsMaxCount: maksimum256dnsDict: pemetaan dari hostname ke indeks ring bufferdnsEntryTTL:60000ms
- Di constructor,
canUncloakCnamesdancnameUncloakEnableddiinisialisasi sebagaitrue
Alur pemrosesan request
onBeforeSuspendableRequest(details)mengambil hostname dari URL request, lalu terlebih dahulu memeriksa cache dengandnsFromCache(hn)- Jika entri DNS yang di-cache memiliki
ip, nilainya disetel kedetails.ip - Jika hasil pemanggilan dasar
super.onBeforeSuspendableRequest(details)berakhir dengan pembatalan, redirect, atau sejenisnya, hasil tersebut dikembalikan apa adanya - Jika entri DNS yang di-cache bukan
Promise, pemrosesan lanjutan diteruskan keonAfterDNSResolution(hn, details, dnsEntry) - Jika kondisi untuk kueri ulang DNS tidak terpenuhi atau ada
details.proxyInfo?.proxyDNS, tidak dilakukan pemrosesan DNS tambahan
Cara kueri dan penyimpanan DNS
dnsShouldResolve(hn)mengecualikan hostname kosong, hostname yang diawali[, dan bentuk alamat IPv4 dari target kueri DNSdnsResolve(hn, details)mendaftarkan hostname pada posisi saat ini di ring buffer dan memanggildnsAPI.resolve(hn, [ 'canonical_name' ])- Saat kueri berhasil,
dnsToCache(hn, rec, details)dijalankan; saat gagal,dnsToCache(hn)meninggalkan entri kosong di cache dnsToCachemenyimpanhndan waktu kedaluwarsa pada entri cache baru- Jika
cnameFromRecordmengembalikan nilai, nilai tersebut disimpan kednsEntry.cname - Jika
ipFromRecordmengembalikan nilai, nilai tersebut disimpan kednsEntry.ip
- Jika
dnsFromCachemengembalikan entri cache apa adanya jika entri itu berupaPromise, dan menghapus entri kedaluwarsa daridnsListsertadnsDict
Kondisi penerapan CNAME dan IP
cnameFromRecord(hn, record, details)tidak mengembalikan CNAME jikarecord.canonicalNametidak ada atau sama dengan hostname asli- Jika
cnameIgnore1stPartyaktif, kasus ketika domain CNAME dan hostname asli sama dikecualikan - Jika ada
cnameIgnoreList, CNAME yang tidak cocok dengan regex tersebut dikecualikan - Jika
cnameIgnoreRootDocumentaktif, dikecualikan ketika hostname request sama dengan hostname daridetails.documentUrl || details.url ipFromRecord(record)mengembalikan alamat pertamaaddresses[0]ketikarecord.addressesberupa array dan tidak kosong
Penulisan ulang URL dan pemfilteran lanjutan
onAfterDNSResolutionmenulis ulang URL denganuncloakURLjika entri DNS memiliki CNAME dancnameUncloakEnabledaktif- Saat URL diubah, URL lama disimpan di
details.aliasURL, dan URL baru diterapkan kedetails.url - Jika entri DNS memiliki IP dan berbeda dari
details.ipsaat ini,details.ipdiperbarui - Hanya ketika terjadi penulisan ulang CNAME atau perubahan IP,
onBeforeSuspendableRequest(details)dari class dasar dipanggil kembali uncloakURLmencari posisi hostname di dalam URL dan menggantinya dengan CNAME; bergantung pada nilaicnameReplayFullURL, fungsi ini menyambungkan seluruh URL atau hanya mempertahankan hingga bagian awal path
Perubahan pengaturan dan manifest
- Pemrosesan
cnameMaxTTLdisetOptionsdihapus - Saat opsi berubah, cache DNS dikosongkan dengan
dnsList.fill(null)dandnsDict.clear(), bukan menginisialisasi ulang Mapcnameslama cnameMaxTTL: 120dihapus dari nilai default pengaturan tersembunyi disrc/js/background.jsminimum_chrome_versiondiplatform/chromium/manifest.jsondiubah dari73.0menjadi80.0minimum_opera_versiondiplatform/opera/manifest.jsondiubah dari60.0menjadi67.0
1 komentar
Pendapat di Hacker News
Sepertinya judulnya keliru. uBlock Origin sudah mendukung fitur ini sejak bertahun-tahun lalu, tetapi hanya di Firefox
Kasus kali ini tampaknya lebih berupa refactoring kode tersebut daripada fitur yang sepenuhnya baru
Namun ini belum sempurna karena ketika satu domain punya beberapa IP, kita tidak tahu IP mana yang akan dipilih browser
Kalau ada usulan judul yang lebih akurat dan netral, bisa diubah lagi. Namun commit GitHub tanpa konteks tambahan biasanya tidak terlalu cocok untuk thread HN
Saya belum terdampak langsung, tetapi kalau Chrome benar-benar menghapus uBO, saya sudah mulai menyesuaikan ulang ekstensi-ekstensi agar bisa beralih ke versi Firefox
Itu akan tiba dalam beberapa rilis lagi, jadi kita harus bersiap
Paling-paling hanya mengubah
background.service_workermenjadibackground.scripts; secara harfiah cukup mengganti nama key sajauBlock Origin adalah salah satu hal yang membuat Firefox lebih hebat, dan salah satu alasan utama memakai Firefox alih-alih Chrome dan lainnya
Itu membuat internet benar-benar bisa dijelajahi
Selama lebih dari 10 tahun memang ada masalah tampilan di beberapa situs, tetapi situs-situs itu juga bermasalah di Chrome
Secara pribadi, saya menganggap iklan sebagai semacam kanker masyarakat modern. Ia bercampur antara kebohongan putih, kebohongan yang bukan putih, dan manipulasi; fakta bahwa ada uang sangat besar mengalir di dalamnya justru membuatnya makin tidak layak dihormati
Brave juga proyek berkualitas bagus jadi saya pakai sebagai cadangan, dan kadang saya juga mencampurnya dengan Vivaldi karena split window dan manajemen tab yang jauh lebih baik
Apakah CNAME cloaking berarti situs iklan memakai subdomain yang dibuat acak dan mengarah ke wildcard record?
Biasanya ketika mengunjungi contentsite.com, iklan disajikan dari adsite.com. Aturan pemblokir iklan memblokir adsite.com, maka iklan tidak terlihat
CNAME cloaking adalah cara situs utama membuat subdomain seperti adsite.contentsite.com mengarah ke adsite.com. Dengan begitu, pemblokir iklan harus melakukan pekerjaan yang hampir mustahil: memblokir jutaan subdomain yang tampak seolah-olah milik situs sah
Situs sah bisa terus mengganti subdomain, dan pemblokir iklan tidak punya cara untuk mengetahui subdomain mana yang konten sah dan mana yang iklan. Selain itu, karena konten disajikan dari domain yang sama, sebagian kebijakan cookie juga bisa dilewati sehingga pengguna dapat dilacak dengan lebih baik
Pembaruan ini memungkinkan aturan pemfilteran berdasarkan IP yang telah di-resolve
Ini contoh bagus yang menunjukkan mengapa Manifest V3 kurang bagus. Secara definisi, hal semacam ini tidak bisa dilakukan, dan heuristik berbasis kode saat runtime juga mustahil
Ini adalah perlombaan eskalasi melawan pengiklan, sementara Google adalah pedagang senjata yang menjual ke kedua pihak. Mereka tidak akan memberi pengguna apa yang dibutuhkan untuk menang
Tentu saja semua ini bergantung pada apakah vendor browser, yaitu Google, ingin menambahkan API tersebut. Kalau pemrosesan imperatif bisa dilakukan dengan “kode saat runtime”, pengguna dapat berinovasi di userland sebelum pembuat browser memasukkan dukungan bawaan
Jadi pernyataan bahwa fitur tertentu “secara definisi” mustahil itu salah
[1] https://blog.mozilla.org/addons/2022/05/18/manifest-v3-in-fi...
CNAME cloaking misalnya, anggap penyedia SaaS A ingin menyediakan software pelacakan iklan yang keren untuk perusahaan Q
Dengan cara lama, A mungkin akan menyuruh perusahaan Q menyisipkan skrip dari, misalnya, https://A-ads-tracking.example ke situs web perusahaan Q di
https://q-company.exampleLalu daftar pemblokiran yang dipakai uBlock Origin akan punya aturan seperti “blokir permintaan ke domain A-ads-tracking.example”, dan iklannya pun diblokir
CNAME cloaking adalah cara penyedia SaaS A menempatkan layanan pelacakan iklannya bukan di domain A-ads-tracking.example, melainkan di alamat IP tertentu, misalnya 29.1.2.3. Dan bagian pentingnya, SaaS A meminta perusahaan Q membuat subdomain dari q-company.example dan membuat record CNAME-nya mengarah ke 23.1.2.3. Namanya dibuat terdengar wajar, seperti media.q-company.example
Setelah perusahaan Q mengatur CNAME itu dan menambahkan tag skrip
media.q-company.exampleke situs webnya, SaaS A bisa melacak semua pengguna situs tersebut. Karena lapisan pengelakan seperti ini, praktis muncul permainan kucing-kucingan tanpa akhir antara pemilik perusahaan Q dan daftar pemblokiran publikUntuk menghindari masalah ini, software yang menjalankan ekstensi seperti uBlock Origin harus bisa melihat bukan hanya domain tujuan dari permintaan browser, tetapi juga alamat IP sebenarnya dari domain itu. Commit ini tampaknya terkait dengan membuat perilaku tersebut mungkin, atau setidaknya membuat kodenya bekerja lebih baik
Misalnya
media.q-company.exampleadalah CNAME yang mengarah keq-company.ads-tracking.example, laluq-company.ads-tracking.examplememiliki record A yang memberikan IPSaya tidak tahu apakah browser menyediakan nama DNS perantara itu ke ekstensi. Jadi sesuatu seperti uBlock mungkin harus bergantung pada daftar IP, tetapi pemfilteran berbasis DNS seperti pihole bisa langsung memblokirnya dengan aturan untuk
ads-tracking.exampleBagaimanapun, sebaiknya memakai pemblokir berbahaya berbasis browser dan berbasis DNS sekaligus
Memang lambat dan mudah salah, tetapi setelah terbiasa jadi lebih mudah, dan sepenuhnya kebal terhadap omong kosong semacam ini
Apakah Chrome akan memblokir uBO? Saya tidak selalu mengikuti perkembangan terbaru
Setahu saya cookie pihak ketiga sekarang akan diizinkan, jadi mungkin masih ada kemungkinan
Mereka menghilangkan API inti yang dibutuhkan uBO untuk mengidentifikasi apa yang tidak boleh dimuat, lalu mencegahnya dimuat
Google mengklaim ini demi “performa” atau “keamanan”. Tentu saja, satu-satunya “performa” atau “keamanan” yang benar-benar terdampak besar adalah kemampuan untuk mengidentifikasi, mencegat, dan menghentikan unduhan berbahaya atau terkait iklan sebelum dimulai
https://developer.chrome.com/docs/extensions/develop/migrate...
https://www.bleepingcomputer.com/news/google/google-chrome-w...
Jika memakai versi Chromium yang hanya mendukung Manifest V3, ekstensi itu akan disembunyikan
Bukankah beberapa server DNS punya fitur yang berperilaku seperti CNAME yang di-resolve oleh server? Maksudnya, admin memasukkan record yang mengarah ke nama DNS lain, tetapi klien hanya melihat record A atau AAAA saja
uBO sudah punya fitur ini sejak cukup lama. Sejak 1.34.0, dan di pengaturan lanjutan sejak 1.25.0
https://github.com/gorhill/uBlock/wiki/Dashboard:-Settings#u...
Kalau tidak salah sekitar tahun 2021
Bagaimana status uBO di Brave, Edge, Opera?
https://brave.com/blog/brave-shields-manifest-v3/
Meski begitu, itu tidak terlalu diperlukan. Brave punya pemblokir iklan bawaan sendiri yang cukup kuat, dan terakhir kali saya cek, pemblokir itu dikompilasi sebagai native code sehingga performanya juga lebih tinggi daripada uBO serta mendukung daftar iklan yang sama secara penuh