1 poin oleh GN⁺ 2024-10-08 | 1 komentar | Bagikan ke WhatsApp
  • 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 cnames yang lama dihapus dan diganti dengan ring buffer 256 entri berbasis dnsList, dnsDict, dnsWritePtr serta cache TTL 60000ms
  • Kueri DNS menggunakan browser.dns.resolve(hn, [ 'canonical_name' ]), dan canonicalName serta addresses[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 menjadi 67.0, dan nilai default cnameMaxTTL pada pengaturan tersembunyi dihapus

Struktur cache DNS Firefox ditulis ulang

  • Kode terkait CNAME uncloaking di platform/firefox/vapi-background-ext.js diubah dari struktur berbasis Map global menjadi struktur cache DNS di dalam class
  • Alih-alih status global cnameUncloakEnabled dan Map cnames yang lama, cache dikelola dengan field berikut
    • dnsList: ring buffer
    • dnsWritePtr: posisi tulis berikutnya
    • dnsMaxCount: maksimum 256
    • dnsDict: pemetaan dari hostname ke indeks ring buffer
    • dnsEntryTTL: 60000ms
  • Di constructor, canUncloakCnames dan cnameUncloakEnabled diinisialisasi sebagai true

Alur pemrosesan request

  • onBeforeSuspendableRequest(details) mengambil hostname dari URL request, lalu terlebih dahulu memeriksa cache dengan dnsFromCache(hn)
  • Jika entri DNS yang di-cache memiliki ip, nilainya disetel ke details.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 ke onAfterDNSResolution(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 DNS
  • dnsResolve(hn, details) mendaftarkan hostname pada posisi saat ini di ring buffer dan memanggil dnsAPI.resolve(hn, [ 'canonical_name' ])
  • Saat kueri berhasil, dnsToCache(hn, rec, details) dijalankan; saat gagal, dnsToCache(hn) meninggalkan entri kosong di cache
  • dnsToCache menyimpan hn dan waktu kedaluwarsa pada entri cache baru
    • Jika cnameFromRecord mengembalikan nilai, nilai tersebut disimpan ke dnsEntry.cname
    • Jika ipFromRecord mengembalikan nilai, nilai tersebut disimpan ke dnsEntry.ip
  • dnsFromCache mengembalikan entri cache apa adanya jika entri itu berupa Promise, dan menghapus entri kedaluwarsa dari dnsList serta dnsDict

Kondisi penerapan CNAME dan IP

  • cnameFromRecord(hn, record, details) tidak mengembalikan CNAME jika record.canonicalName tidak ada atau sama dengan hostname asli
  • Jika cnameIgnore1stParty aktif, kasus ketika domain CNAME dan hostname asli sama dikecualikan
  • Jika ada cnameIgnoreList, CNAME yang tidak cocok dengan regex tersebut dikecualikan
  • Jika cnameIgnoreRootDocument aktif, dikecualikan ketika hostname request sama dengan hostname dari details.documentUrl || details.url
  • ipFromRecord(record) mengembalikan alamat pertama addresses[0] ketika record.addresses berupa array dan tidak kosong

Penulisan ulang URL dan pemfilteran lanjutan

  • onAfterDNSResolution menulis ulang URL dengan uncloakURL jika entri DNS memiliki CNAME dan cnameUncloakEnabled aktif
  • Saat URL diubah, URL lama disimpan di details.aliasURL, dan URL baru diterapkan ke details.url
  • Jika entri DNS memiliki IP dan berbeda dari details.ip saat ini, details.ip diperbarui
  • Hanya ketika terjadi penulisan ulang CNAME atau perubahan IP, onBeforeSuspendableRequest(details) dari class dasar dipanggil kembali
  • uncloakURL mencari posisi hostname di dalam URL dan menggantinya dengan CNAME; bergantung pada nilai cnameReplayFullURL, fungsi ini menyambungkan seluruh URL atau hanya mempertahankan hingga bagian awal path

Perubahan pengaturan dan manifest

  • Pemrosesan cnameMaxTTL di setOptions dihapus
  • Saat opsi berubah, cache DNS dikosongkan dengan dnsList.fill(null) dan dnsDict.clear(), bukan menginisialisasi ulang Map cnames lama
  • cnameMaxTTL: 120 dihapus dari nilai default pengaturan tersembunyi di src/js/background.js
  • minimum_chrome_version di platform/chromium/manifest.json diubah dari 73.0 menjadi 80.0
  • minimum_opera_version di platform/opera/manifest.json diubah dari 60.0 menjadi 67.0

1 komentar

 
GN⁺ 2024-10-08
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

    • Sekarang masih didukung, dulu juga sudah didukung :P
    • Kelihatannya lebih dari sekadar refactoring. Sekarang pemblokiran berbasis IP tampaknya bisa dilakukan pada tahap lebih awal sebelum request sebenarnya dikirim
      Namun ini belum sempurna karena ketika satu domain punya beberapa IP, kita tidak tahu IP mana yang akan dipilih browser
    • Judul sudah dikembalikan ke judul halaman. Judul submit sebelumnya adalah “uBlock Origin supports filtering CNAME cloaking sites on Firefox now”
      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

    • Ini bukan soal “kalau”, melainkan “kapan”. Sejak 2020 ini sudah menjadi soal “kapan”, dan sekarang benar-benar akan datang
      Itu akan tiba dalam beberapa rilis lagi, jadi kita harus bersiap
    • Saya sedang memindahkan keluarga ke Brave. Perbedaannya hampir tidak terasa, dan saya lebih yakin browser itu akan terus mendukung pemfilteran konten yang berpihak pada pengguna
    • Di rilis Canary, itu sudah dihapus
    • Saya tidak mengerti maksud “menulis ulang ekstensi untuk Firefox”. Firefox juga memakai API yang sama
      Paling-paling hanya mengubah background.service_worker menjadi background.scripts; secara harfiah cukup mengganti nama key saja
    • Bertanya untuk orang-orang yang belum tahu: apa itu uBO, dan apa dampaknya terhadap kebanyakan ekstensi?
  • uBlock 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

    • Saya pindah ke kombinasi ini beberapa tahun lalu dan tidak pernah melihat alasan untuk pergi. Di ponsel Android pun sama; itu satu-satunya pengalaman web mobile yang layak pakai yang pernah saya lihat
      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
    • Hal itu bisa berubah karena Mozilla sedang menjadi perusahaan iklan
    • Saya sudah mencoba Brave dan Firefox, dan jujur tidak merasakan perbedaan besar. Meski begitu, karena filosofi dan karena berasal dari organisasi nirlaba, saya lebih memilih Firefox
      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?

    • Itu sebagian dari masalahnya
      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
    • Benar. Penyedia iklan dan analitik mulai memakai cara ini untuk mengakali perlindungan cookie pihak ketiga
  • 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

    • Tidak ada alasan mengapa API Manifest V3 yang deklaratif tidak bisa menyediakan fungsi seperti ini. Kalau saya membaca commit-nya dengan benar, ini bahkan bisa bekerja lebih baik dengan mengintegrasikannya lebih baik ke alur request sebelum apa pun dikirim ke server sebenarnya, lalu memblokir berdasarkan alamat IP yang benar-benar akan digunakan
      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
    • Secara teknis, Manifest V3 itu sendiri terpisah dari API yang disediakan browser untuk ekstensi. Di Firefox, Manifest V3 didukung bersama blocking web request[1], yaitu API pemfilteran sebelum “Manifest V3”
      Jadi pernyataan bahwa fitur tertentu “secara definisi” mustahil itu salah
      [1] https://blog.mozilla.org/addons/2022/05/18/manifest-v3-in-fi...
    • Tinggalkan Chrome dan terimalah Firefox
  • 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.example
    Lalu 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.example ke 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 publik
    Untuk 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

    • Tepatnya agak berbeda. Sesuai namanya, yang dipakai adalah CNAME, yaitu record yang mengarah ke record lain, bukan record A yang mengarah ke IP
      Misalnya media.q-company.example adalah CNAME yang mengarah ke q-company.ads-tracking.example, lalu q-company.ads-tracking.example memiliki record A yang memberikan IP
      Saya 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.example
      Bagaimanapun, sebaiknya memakai pemblokir berbahaya berbasis browser dan berbasis DNS sekaligus
    • Inilah alasan mengapa di mode lanjutan uBlock bagus untuk memblokir semua JavaScript, lalu perlahan memasukkan skrip yang terlihat ke allowlist sampai situs berfungsi dengan benar
      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

    • Bukan memblokir uBO itu sendiri, melainkan dengan merilis API plugin baru, Manifest V3, mereka menghapus fitur browser yang memungkinkan uBO bekerja
      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
    • Tidak memperbarui browser juga berisiko. Jauh lebih baik beralih ke Firefox agar tetap mendapat pembaruan sekaligus dukungan penuh untuk uBO
    • Mereka menghapusnya perlahan secara bertahap dalam jangka panjang untuk menghindari ledakan opini buruk soal monopoli browser. Namun jadwal itu sudah dimulai sejak Juni
      https://developer.chrome.com/docs/extensions/develop/migrate...
      https://www.bleepingcomputer.com/news/google/google-chrome-w...
    • Untuk saat ini, uBlock Origin masih ada di Chrome Web Store untuk browser Chromium yang mendukung Manifest V2
      Jika memakai versi Chromium yang hanya mendukung Manifest V3, ekstensi itu akan disembunyikan
    • Sejujurnya, besar kemungkinan ini bergantung pada apakah AS terus mempertahankan pemerintahan yang mau menyeret perusahaan monopoli yang terang-terangan ke pengadilan
  • 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

    • Sepertinya yang dimaksud adalah record ALIAS
  • 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?

    • Saya tidak peduli dengan dua browser proprietary yang disebutkan, tetapi Brave berencana mendukung Manifest V2 secara parsial selama mungkin dan menjaga kompatibilitas uBO
      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