Profobuf(2022): Mendekode dan menghapus iklan untuk memblokir iklan YouTube di Apple TV
(ericdraken.com)- Ini adalah PoC yang menempatkan proxy MITM berbasis pfSense di antara Apple TV dan internet untuk mendekripsi HTTPS, lalu memodifikasi respons Protobuf yang dikirim YouTube agar slot iklan tidak terdaftar di perangkat Apple
- Pemblokir DNS yang ada dan routing VPN terbentur keterbatasan seperti DNS TTL, ketidakcocokan IP, error 403, dan kebocoran ASN, karena iklan YouTube dan video utama memakai domain serta infrastruktur yang sama
- Eksperimen Squid dihentikan karena masalah performa dan konfigurasi, lalu beralih ke pendekatan yang mendekripsi trafik TLS dengan mitmproxy/mitmdump di jail FreeBSD dan langsung memperbaiki respons JSON serta Protobuf
- YouTube web memungkinkan penghapusan
adPlacements,playerAdParams, URLpagead, dan lainnya dari JSON, tetapi aplikasi YouTube iOS menyertakan slot iklan dan informasi pelacakan dalam responsapplication/x-protobuf, sehingga perlu menangani struktur Protobuf - Metode akhir adalah pemindaian linear dan modifikasi 1 byte: mencari field tag secara mundur di sekitar string
/pagead/, lalu mengubah tag seperti50195462menjaditarget_field_tag - 1; ini menghasilkan performa yang cocok untuk pemrosesan real-time tanpa decoding penuh
Tujuan dan desain jaringan awal
- Tujuannya adalah membuat router berbasis FreeBSD dan pfSense untuk memblokir iklan YouTube pre-roll, mid-roll, dan end-roll di Apple TV serta iPhone pada seluruh jaringan
- Dengan menempatkan proxy man-in-the-middle di antara Apple TV dan internet eksternal, trafik HTTPS dapat didekripsi dan data Protocol Buffer yang digunakan Google untuk mengisi iklan YouTube dapat dibaca
- Setelah menerapkan pemblokiran iklan YouTube selama beberapa bulan, penulis mulai berlangganan YouTube Premium, sambil menyatakan bahwa “bisa dilakukan” dan “harus dilakukan” adalah dua hal berbeda
- Alasan memblokir iklan dan pelacakan mencakup pelacakan privasi, pemborosan bandwidth, clickbait, dan cryptojacking
- Penulis memperkirakan 25–40% trafik jaringan bisa berupa iklan, skrip pelacakan,
fingerprint.js,googletagmanager.js, dan loader analitik real-time seperti Hotjar - JavaScript crypto-mining seperti
CoinHive.jsdijelaskan dapat membuat komputer terlalu panas atau disalahgunakan untuk menghasilkan uang receh
- Penulis memperkirakan 25–40% trafik jaringan bisa berupa iklan, skrip pelacakan,
Hardware pfSense dan pengaturan dasar
- Untuk melindungi seluruh jaringan SMB, VM, image Docker, atau Raspberry Pi dianggap kurang bertenaga, sehingga diperlukan hardware khusus yang hanya menangani routing paket, dekripsi, dan pemantauan
- Hardware router yang digunakan adalah mini PC dengan set instruksi AES-NI, RAM DDR4, SSD mSATA, dan USB drive untuk flashing pfSense
- Contoh konfigurasi: mini PC J4125, RAM DDR4 32 GiB, SSD mSATA 128 GiB
- Penyimpanan 128 GB dianggap cukup untuk log, pengurangan keausan SSD, packet capture, serta edge cache NPM dan Docker
- Image instalasi pfSense berukuran sekitar 360 MB dan dapat di-flash ke USB drive dengan Etcher AppImage
- Setelah pengaturan pertama, AES-NI ditampilkan sebagai “Yes (inactive)”, sehingga diaktifkan manual lewat
System › Advanced › Miscellaneous - Untuk memanfaatkan RAM 32 GiB, RAM disk dialokasikan cukup besar untuk
/vardan/tmp, sementara SSD 128 GiB diharapkan mendapat manfaat dari wear-leveling dan backup RAM-disk dikonfigurasi berjalan setiap jam - Di Dashboard, widget S.M.A.R.T. ditambahkan agar anomali SSD dapat terdeteksi
Pemblokiran DNS, pemisahan jaringan, dan pfBlockerNG
- Sebelumnya, Pi-hole di Raspberry Pi digunakan sebagai pemblokir iklan tingkat DNS, dan di pfSense dipasang pfBlockerNG-devel untuk mencoba pemblokiran iklan, konten berbahaya, serta geo-blocking
- Jika layanan
pfb_dnsbltidak berjalan atau tab status menampilkan[ Missing CRON task ], disarankan mencoba menghapus file kosong/var/run/booting - Dengan memanfaatkan 3 port Gigabit pada mini PC, dibuat jaringan fisik, bukan VLAN, dan perangkat “phoning-home” seperti Alexa dan Apple TV dipisahkan dari jaringan utama
- Perangkat untrusted ditempatkan di jaringan privat
172.31.1.0/24 - LAN trusted dipertahankan di
192.168/16 - LAN hardware untuk IoT melewati adblocker, dan kueri DNS hard-coded seperti
1.1.1.1serta9.9.9.9dicegat agar YouTube tidak dapat melewati pemblokir DNS
- Perangkat untrusted ditempatkan di jaringan privat
- Aturan NAT dikonfigurasi agar semua klien di belakang pfSense memakai server Unbound DNS lokal
- Pemblokiran DNS over TLS dianggap perlu dilakukan terlebih dahulu agar intersepsi kueri DNS dimungkinkan
- iPhone dapat menampilkan Privacy Warning terkait pemblokiran trafik DNS terenkripsi, tetapi permintaan DNS upstream disebut tetap dienkripsi ke Cloudflare
- NAT reflection harus dinonaktifkan agar internet eksternal tidak dapat mengakses server DNS
- Alias firewall
Non_WANdibuat untuk mengalihkan kueri DNS lokal port 53 pada antarmuka selain WAN ke localhost - Karena YouTube mengirimkan iklan dan video utama dari domain yang sama, sulit memfilter hanya iklan dengan pemblokir nama domain seperti pfBlockerNG atau Pi-hole
Eksperimen bypass VPN dan titik kegagalan
- Selain memblokir iklan, dilakukan juga eksperimen untuk mengecoh algoritme iklan YouTube agar pengguna tampak kurang menarik bagi pengiklan
- Trafik pelacakan lokasi YouTube coba dirutekan lewat VPN ke wilayah dengan jumlah penonton lebih sedikit menggunakan router pfSense
- Targetnya adalah membuat akun YouTube dikenali sebagai “pria 70 tahun, tinggal di Italia”
- Di pfSense, WireGuard digunakan alih-alih OpenVPN untuk eksperimen dasar yang mengirim seluruh trafik Apple TV lewat VPN
- Paket WireGuard FreeBSD dipasang, lalu tunnel ditambahkan dan diaktifkan
- Untuk konfigurasi NordLynx, private key diperiksa di VM Linux dengan
sudo wg showconf nordlynx, lalu dipindahkan ke pfSense
- Hasil pengujian menunjukkan Google di laptop tampil dalam bahasa Italia, dan YouTube di Apple TV juga berubah menjadi bahasa Italia
- Iklan masih muncul sebagian, tetapi disebut lebih sedikit daripada sebelumnya
- Netflix dan Amazon Prime mengalami masalah; file CSS atau font tampaknya diblokir, atau thumbnail tidak dimuat
- Penulis memperingatkan agar tidak mengirim seluruh trafik Apple TV lewat VPN, dan menilai Netflix serta Prime cukup baik mendeteksi provider VPN dan geofencing
- Selanjutnya, untuk memasukkan hanya trafik YouTube dari Apple TV ke VPN, dibuat firewall policy rule yang menargetkan
www.youtube.com,youtube.com,googlevideo.com,accounts.google.com,googleapis.com,gstatic.com, dan lainnya- Hasilnya, YouTube melihat pengguna berada di Milan, sementara Netflix dan Prime Video melihat pengguna berada di Kanada
- Iklan berkurang hingga tingkat “jarang sekali”
- Sehari kemudian muncul DNS race condition
- Alias hostname pfSense secara default di-resolve setiap 300 detik
- DNS TTL YouTube bisa 1.440 detik, yakni 24 menit
- Jika IP yang di-resolve Alias Daemon berbeda dari IP yang diterima klien sebenarnya, policy bisa gagal men-tunnel trafik YouTube
- Beberapa video YouTube tidak dapat diputar dengan
403 Forbidden- YouTube disebut menyematkan IP pengguna ke setiap permintaan
googlevideo.com - Jika domain turunan seperti
r5---sn-hpa7kn76.googlevideo.comtidak ditunnel, permintaan keluar dari IP yang salah dan menimbulkan masalah - Yang dibutuhkan adalah tunneling wildcard
*.googlevideo.com, tetapi NAT dan firewall rule bekerja dengan IP, bukan hostname wildcard
- YouTube disebut menyematkan IP pengguna ke setiap permintaan
PoC pelacakan IP berbasis kueri DNS
- Untuk merutekan
*.googlevideo.commelalui VPN, dipikirkan metode pembajakan kueri DNS Google Video- Caranya adalah melacak log kueri DNS secara berkala dan menambahkan kueri
*.googlevideo.comke daftar alias - Jika tiap video menggunakan domain yang unik dan berubah-ubah, metode ini dianggap tidak akan bekerja kecuali dilakukan refresh untuk setiap video
- Caranya adalah melacak log kueri DNS secara berkala dan menambahkan kueri
- Target baru adalah memantau kueri DNS dengan Python 3 dan pfSense REST API untuk menangkap IP, menahan respons sebentar, lalu menambahkan IP ke aturan VPN tunneling dan melepas DNS reply
- Setelah memasang pfSense REST API, alias
VPN_domainsdilihat dengan mengirim request GET kehttps://pfsense/api/v1/firewall/alias - Modul Python untuk Unbound DNS Resolver ditelusuri dan berhasil digunakan untuk mencatat pesan kueri DNS
- Versi Python saat itu adalah 3.8
- Contoh modul Python Unbound berbasis Python 2.4, sehingga diperkirakan mungkin perlu
2to3atau pemformatan
- Skrip PoC mengekstrak IP record A/AAAA dari respons DNS dan menambahkannya ke alias pfSense
- Record A diproses dengan
ipaddress.IPv4Address(d.rr_data[j][2:]).exploded - Record AAAA diproses dengan
ipaddress.IPv6Address(d.rr_data[j][2:]).exploded - TTL alias diatur 1 jam, capacity diatur 500
- Record A diproses dengan
- Keesokan harinya Unbound DNS Resolver mengalami segfault, dan setiap kali menambahkan IP aturan pfSense harus di-reload sehingga pfSense menjadi sangat lambat
Beralih dari Squid ke mitmproxy
- Target baru berubah menjadi meneliti dan memasang proxy keluarga Squid, membuat sertifikat CA palsu yang tepercaya, lalu mendekripsi traffic TLS
- Dalam eksperimen Squid, diuji apakah proxy
squid3yang disediakan sebagai package pfSense memenuhi kebutuhan- Folder khusus
/squid_cachedibuat dan ukuran cache diatur 8GiB - Transparent HTTPS support diharapkan tersedia
- Folder khusus
- Setelah mengonfigurasi Squid dan SquidGuard selama sehari, akhirnya menyerah
- Kecepatannya sangat lambat
- Pengaturan ACL merepotkan
- Ada issue terkait
https://http/* - Pembaruan daftar filter URL SquidGuard memakan waktu sangat lama
- UI Squid kurang memadai
- Setelah itu diputuskan memakai mitmproxy yang ditulis dengan Python
- mitmproxy dipilih daripada
SSLSplitkarena ekstensibilitas hook Python dan UI-nya - Versi FreeBSD pada pfSense adalah
12.2-Stable, build 64-bit
- mitmproxy dipilih daripada
- Karena jail dinonaktifkan di lingkungan default pfSense,
ezjaildipasang manual dan jail untukmitmproxydibuat- Jail dibuat dengan
ezjail-admin create mitmproxy 'lo0|127.0.1.1' - Untuk transparent proxy mode,
allow.raw_sockets=1diatur - Jika raw socket diblokir, bisa muncul error seperti
Transparent mode failureatauCannot open connection, no hostname given.
- Jail dibuat dengan
- Menjalankan binary tarball Linux gagal di FreeBSD
- Muncul
ELF interpreter /lib64/ld-linux-x86-64.so.2 not found libdl.so.2,libz.so.1,libpthread.so.0, danlibc.so.6juga tidak ditemukan
- Muncul
- Di dalam jail,
pkg install mitmproxydijalankan; instalasinya membutuhkan 50 package, ruang tambahan 206MiB, dan unduhan 33MiB - Agar MITMProxy dapat diakses dari LAN, virtual IP
127.0.1.1ditempelkan ke localhost, lalu dengan aturan NAT[Private IPs]:8080diteruskan sementara ke127.0.1.1:8080 - File CA PEM yang dibuat otomatis oleh MITMProxy adalah
~/.mitmproxy/mitmproxy-ca-cert.pem, dan CA cert ini dipasang ke Trusted Root Store pada perangkat uji mitmproxymemakai banyak CPU meski idle, dan pembuatan sertifikat TLS real-time per request serta logging berlebihan dianggap sangat memperlambat kinerjamitmdumpdianggap memiliki beban CPU lebih rendah karena menghilangkan UI dan logging berlebihan
Menghapus iklan JSON YouTube web
- Certificate Pinning adalah teknik ketika server atau client sudah mengetahui fingerprint sertifikat yang diharapkan, sehingga pemalsuan sertifikat MITMProxy tidak berhasil
- Host yang bermasalah dapat dibuat melewati proxy dengan opsi
--ignore-hosts- Sebagai contoh,
apple.com:443danicloud.com:443di-ignore
- Sebagai contoh,
- Saat mengakses YouTube, page ads terlihat di MITMProxy bersama header yang tidak terenkripsi, dan kemungkinan pemblokiran regex sederhana ditinjau
- Untuk menerapkan skrip pemblokiran iklan YouTube,
--scripts "youtube.py"ditambahkan kemitmdump - Filter smoke-test memblokir request iklan berdasarkan substring URL
youtube.com:/pagead/,/log_event?,/stats/ads,/stats/qoe?,/ptracking?,/generate_204,el=adunit,adformat=,/activeview?google.com,google.ca:/pagead/ggpht.com:.
- Request yang hendak diblokir tampak benar-benar diblokir di MITMProxy dan panel Network DevTools, tetapi ads tetap muncul, dan terkadang ads melakukan skip sendiri atau gagal diputar
- Setelah itu ditemukan cukup banyak URL terkait iklan di dalam payload JSON
- Bagian
playerAdsdanplaybackTrackingdisertakan youtubeRemarketingUrlberisihttps://www.youtube.com/pagead/viewthroughconversion/...googleRemarketingUrlberisihttps://www.google.com/pagead/1p-user-list/...
- Bagian
- Setelah menganalisis UI YouTube dan workflow HTTP hingga cookies dan service workers, dikatakan bahwa pre-roll, post-roll, dan mid-video ads semuanya bisa dihapus
- Pada tahap ini, router sudah bisa menghapus ads dari payload JSON iklan YouTube web
Masalah iOS YouTube dan Protobuf
- Aplikasi YouTube iOS menampilkan data yang sangat mirip pada versi Protobuf dari API call yang sama seperti versi web
- Di Protobuf, key berupa angka dan bisa berubah, sehingga cara mencari advertisement section dengan JSONPath tidak bisa digunakan
- YouTube mengirimkan daftar besar ads yang akan ditonton ke dalam payload, dan ketika daftar itu habis, daftar besar lain akan segera datang
- Dalam payload Protobuf terlihat string seperti “Telus,” “Samsung TV,” “Boxing Week,” “Buy now”
- Protokol YouTube iOS berbeda dari traffic web
- Pada versi web, ad video dan video yang diinginkan sampai batas tertentu bisa dibedakan dengan melihat URL dan query parameter
range - Protokol iOS tidak memakai query parameter
rangemaupun headerRange, dan menggunakan counter seperti&nr=2,&nr=3pada video chunk - Untuk memblokir iklan YouTube di iOS, Protobuf response harus di-reverse-engineer
- Pada versi web, ad video dan video yang diinginkan sampai batas tertentu bisa dibedakan dengan melihat URL dan query parameter
- Pada decoded Protobuf message ditemukan item
has_unlimited_entitlement: Falsedanhas_premium_lite_entitlement: False, tetapi alih-alih men-toggle-nya, pendekatannya kembali ke heuristics - Mendecode Protobuf mentah sekitar 500KiB dengan Python pure implementation sangat lambat
- Di desktop i7-6700, hasil Python sekitar 2,06–2,11 detik
- Di router pfSense, hasil Python sekitar 22,8–24,2 detik
- C++
protoc --decode_rawsekitar 0,017–0,022 detik di desktop, dan sekitar 0,12–0,14 detik di router pfSense
Upaya decoding Protobuf dan ekstraksi skema
- Karena raw Protobuf decoding tidak didukung di Python, alih-alih memakai C++
libprotobuf.sosecara langsung, dipilih cara berkomunikasi dengan binary C++protocmelaluisubprocess.Popen - Saat mem-fuzzing respons video iklan, dicoba
200kosong,404,503, response body yang terpotong, menjadikan sebagian video iklan null, dan sebagainya, tetapi aplikasi iOS melambat lalu crash atau berhenti di layar iklan - Pemblokiran URL memicu perilaku respons aplikasi, dan chunk respons video juga berisi session metadata
- blackboxprotobuf untuk Burp Suite memungkinkan decode raw Protobuf wire message, menyuntikkan konten, lalu meng-encode ulang untuk memeriksa perilaku endpoint Protobuf
- Disarankan memakai versi Burp Suite asli, bukan fork PyPI
- Sebagian fork memiliki masalah stack overflow atau infinite recursion karena deep recursion
- Jika memakai C++ bindings, raw Protobuf sekitar 500KiB dapat di-transcode dalam beberapa detik
- Skema yang dihasilkan tidak sempurna, besar, dan bersarang sangat dalam, serta pretty-print lambat, tetapi cukup untuk menemukan detail iklan
- Untuk mengekstrak file
.protoatau skema sebenarnya dari APK YouTube Android, dicoba PBTK, Apktool, dex2jar, dan Java Decompiler- Yang diekstrak PBTK hanya proto file 59-byte
- Di Java terdapat Protobuf classes dan getter/setter, tetapi true schema files tidak didapatkan sehingga upaya dihentikan
Titik balik akhir: mengubah 1 byte field tag Protobuf
- Berdasarkan decrypted network traffic dan hasil fuzzing Protobuf, iklan diamati sebagai struktur yang didaftarkan ke slots pada video tertentu
- Jenis slot mencakup pre-roll, mid-roll, end-roll, full-page, dan ad pods
- Jika URL iklan diblokir, muncul error semacam “iklan yang tidak ada telah memesan slot” dan UI mengalami panic
- Jika decode, edit, lalu re-encode dilakukan tanpa schema asli, encoding yang dimodifikasi akan dihasilkan; karena tidak bisa diketahui apakah ZigZag digunakan atau apakah tipe angka seperti
int32,int64,sint32/64,varintdipakai, dan object field order juga biasanya nondeterministic, ini dianggap bermasalah - Kemungkinan bypass ditemukan dari backward compatibility Protobuf dan perilaku UnknownFieldSet
- Saat old software membaca message dengan field baru yang ditambahkan, unknown field dapat muncul
- Jika key field tertentu diubah ke nilai lain, seluruh sub-structure yang berisi informasi iklan dan tracking dapat dibuat menjadi unavailable
- Sebagai contoh, diajukan ide mengubah field key
49399797menjadi49399796agar sub-structure iklan/tracking tersebut diperlakukan seperti unknown field - Field key
49399797tidak bisa ditemukan dengan pencarian hex sederhana; varint/tag encoding harus dipertimbangkan- Wire type-nya
2, yang berarti nested string/message dengan length-delimited - Urutan byte tag untuk target field key
49399797menjadiAA FF B8 BC 01 - Dengan
395198378 >> 3untuk menghapus 3 bit wire type, diperoleh field key asli49399797
- Wire type-nya
- Dari bytes Protobuf, signature URL iklan klasik seperti
/pagead/dicari untuk menentukan rentang field search, lalu dari posisi itu bergerak mundur untuk menemukan field tag dan field key yang akan diubah - Pada contoh log intercept, dalam respons
application/x-protobuf1,87MiB untuk request POSTyoutubei.googleapis.com:443/youtubei/v1/browse?key=..., key49399797ditemukan di posisi4465, dan key50195462di posisi4477 - Pada smoke test O(n), data Protobuf 1,8MiB di-scan satu kali tanpa memory tambahan
- Target ditemukan pada byte ke-30.593 dari 1,8MiB
- Dengan backtracking sekitar 600 byte, field key yang akan di-denature ditemukan
- Setelah metode ini berhasil, tidak perlu lagi memblokir URL yang berisi
*.googleadservices.comatau/pagead/, dan request tersebut sejak awal tidak lagi terjadi
Struktur skrip add-on MITMProxy
- Skrip add-on MITMProxy disediakan sebagai proof of concept untuk memblokir iklan YouTube pada Apple device yang terhubung ke jaringan
- Nama filenya
youtube.py - Contoh eksekusi:
mitmdump --listen-port 8080 --listen-host 127.0.0.1 -s "youtube.py" - Prasyarat FreeBSD adalah
pkg install protobuf,pkg install py38-pip,pip install jsonpath-ng
- Nama filenya
- Skrip tersebut mencakup fairness function yang mengizinkan 5% iklan demi mendukung pembuat konten
in_allowed_ads_window()melewati pemblokiran iklan jika waktu saat ini berada di antara menit ke-0 hingga ke-2 setiap jam
YouTubeAdBlockermeng-intercept domain terkait YouTube dan memodifikasi response JSON atau Protobuf untuk menghapus informasi iklan- Regex host target intercept adalah
\.youtube\.com|google\.(com|ca)|googleapis\.com|googleadservices\.com|googlevideo\.com - String untuk deteksi iklan Protobuf adalah
b"/pagead/" - Batas pencarian adalah
80_000byte - Tag field target adalah
50195462
- Regex host target intercept adalah
- Daftar blokir pada tahap request mencakup
pagead/,log_event?,stats/ads,stats/qoe?,ptracking?,generate_204,error_204,adformat=,activeview?,_ad_,ai?,sw.js, dan lainnya pada host YouTube - Replacement JSON untuk YouTube web menghapus atau menonaktifkan field terkait iklan
yt_addiubah menjadi"0"adPlacementsdiubah menjadi[]adPlacementRenderer,adPlacementConfig,playerAdParams,gutParamsdiubah menjadi{}adVideoIddiubah menjadi""showCompanion,showInstream,useGutdiubah menjadiFalse
- Hook
load()menonaktifkan HTTP/2 dan menetapkananticomp=True,mode="transparent" - Hook
running()memperbaruiallow_hostsagar intercept hanya diterapkan pada domain terkait YouTube - Hook
response()mencari/pagead/di dalam 80.000 byte pertama body response jikacontent-typemengandungprotobuf- Jika ditemukan, ia membuat byte tag target dengan
TagBytes(self.target_field_tag, WIRETYPE_LENGTH_DELIMITED) - Ia membuat byte tag untuk
target_field_tag - 1sebagai byte baru - Ia melakukan reverse search ke arah sebelum posisi
/pagead/untuk menemukan tag target - Byte di posisi tersebut diganti dengan byte yang sesuai dengan
target_field_tag - 1 - Konten Protobuf yang telah dimodifikasi dimasukkan kembali dengan
flow.response.set_content(bytes(body))
- Jika ditemukan, ia membuat byte tag target dengan
- Komentar kode menyatakan bahwa PoC ini sudah memblokir 90% iklan, dan menambahkan bahwa ada field key lain di bagian lain serta mungkin ada beberapa section iklan yang perlu dinonaktifkan
Performa, keterbatasan, dan pengguna target
- Teknik akhir memanfaatkan kemampuan Protobuf yang mengizinkan unknown field agar perubahan schema tetap backward-compatible, serta sensitivitas single-byte edit pada format compact
- Dengan mengubah 1 byte di critical spot sehingga section yang tersarang dalam tampak seperti milik future schema version, Protobuf dapat mengabaikannya dan informasi iklan bisa dihapus
- Google mengembalikan response Protobuf besar yang mencakup hingga layout aplikasi iOS, dan contoh payload-nya berukuran 1,8 MiB
- Untuk mem-parse seluruh payload dibutuhkan native code seperti C++/Swift, sementara decoding dengan Python disebut lebih lambat beberapa digit dan menyebabkan connection timeout
- JSON berbasis web harus mem-parse, mengedit, dan melakukan re-serialize seluruh payload, tetapi teknik Protobuf hanya melakukan linear scan dan backtrack cepat, sehingga diproses dalam satuan mikrodetik, cocok untuk real-time adblocking, dan tidak memerlukan blocklist
- Semua URL
*.googleadservices.comdan/pagead/*pada Apple device berasal dari payload Protobuf; jika ad data hilang dari payload, request tersebut juga otomatis hilang - Aplikasi YouTube tidak mencoba fetch URL iklan, sehingga terasa lebih cepat, dan karena iklan tidak didaftarkan ke video slot, konten langsung diputar
- Metode ini disajikan sebagai teknik yang sangat terspesialisasi untuk memblokir iklan YouTube di Apple device atau traffic tracker Instagram, WhatsApp, dan Facebook
- Kebutuhan CPU untuk mendekripsi/mengenkripsi ulang traffic HTTPS disebut jauh melampaui kemampuan Raspberry Pi
- Karena ditujukan bagi pemilik Apple device yang tidak ingin meng-compromise OS, basis penggunanya dianggap lebih sempit
YouTube Premium dan eksperimen biaya iklan
- Penulis menilai belum jelas apakah harga YouTube Premium sebesar CAD $9.99/mo atau CAD $11.99/mo, sekitar CAD $13.43/mo termasuk pajak, masuk akal
- Ia melakukan eksperimen paparan iklan dengan menonton YouTube secara sporadis selama satu hari menggunakan laptop bersih dan private browsing
- Dalam riwayat tontonan, video yang “ditonton” hanya 10
- Saat menonton sebagian dari 10 video itu, ia terpapar 8 iklan
- Hanya 2 iklan yang bisa dilewati, dan keduanya dilewati
- Jika CPV kasar diasumsikan USD $0.15, 8 iklan per hari berarti biaya pengiklan sebesar
8 x $0.15 = $1.20, dan jika diekstrapolasi ke sebulan menjadi sekitar USD $36/mo - Ia juga menyajikan perhitungan berdasarkan data Statista dengan membagi belanja iklan AS dengan total jumlah view
- Pada 2019, pengiklan AS membelanjakan $15.1 billion di YouTube
- Penduduk AS disebut menonton 916 billion video
- Rata-ratanya adalah
$15.1B / 916B = USD $0.0165 per view - Untuk kasus penulis, ia menghitungnya setara dengan biaya pengiklan sekitar USD $0.13 per hari, atau sekitar USD $3.96 per bulan
- Selama eksperimen iklan, ia menggunakan hardware mute dan sering mengalihkan pandangan, sehingga menilai belanja iklan yang ditargetkan kepadanya terbuang percuma
- Meski begitu, ia mengatakan ingin mendukung kreator dan akan mencoba trial Premium 3 bulan sambil terus memantau apa saja yang dilacak Google tentang dirinya
- Ia khawatir bahwa sejak DMCA claim diterima, seluruh pendapatan iklan bisa mengalir ke claimant, bukan kreator, dan menambahkan bahwa tidak mengherankan jika banyak kreator berpindah ke Patreon
Ringkasan akhir
- Ia menyiapkan router hardware dari awal dan memisahkan LAN menjadi zona trusted/untrusted
- Ia menyiapkan pemblokiran iklan DNS tradisional
- Ia menambahkan transparent MITM proxy
- Pada akhirnya, ia mengatakan berhasil memblokir iklan YouTube dengan performa baik pada perangkat Apple yang terhubung ke jaringan
- Ia menulis bahwa karena bagian sulitnya sudah selesai, ia akan mempertimbangkan untuk membayar YouTube Premium, tetapi menambahkan bahwa tracker tetap diblokir dengan ketat
1 komentar
Opini Hacker News
Ini tampaknya bukan cacat pada format Protobuf, melainkan penulis mengganti nomor field ke nomor besar yang belum digunakan.
Caranya adalah mencari signature URL iklan seperti
/pagead/di byte Protobuf untuk menentukan rentang field, lalu bergerak mundur dari sana untuk menemukan tag field target dan key field, kemudian menonaktifkannya. Ini lebih dekat ke perilaku yang memang dimaksudkan daripada sebuah cacat.Jika sudah mau bersusah payah mencari tag, membaca panjang varint tepat di sebelahnya dan melewati byte terkait juga bukan pekerjaan tambahan yang besar. Memang mungkin perlu menyalin buffer atau menggeser byte, tetapi skrip PoC juga harus melakukan penyalinan karena
bytesyang dikembalikan API mitmproxy bersifat immutable.Google tentu akan merilis aplikasi baru terlebih dahulu sebelum mengubah protokol sampai iklan sama sekali tidak muncul di versi aplikasi lama, jadi metode pemblokiran ini bisa langsung dicegah hanya dengan certificate pinning dasar atau decoding yang kurang toleran saat ekstraksi informasi iklan gagal. Jika saya di tim YouTube, bagian seperti ini mungkin akan dianggap sebagai cacat.
bytesmemang immutable, tetapi objekbytearraytidak immutable.Proxy C++/Go kecil pun bisa melakukan hal yang sama dengan overhead jauh lebih rendah. Untuk pekerjaan yang terdefinisi sejelas ini, pendekatan itu lebih stabil dan lebih sedikit repot daripada bergulat dengan mitmproxy.
Jika semua traffic dikirim melalui proxy, performa akan turun meski memakai intersepsi SNI. pfSense juga sama; server Linux sederhana dengan aturan iptables sederhana bisa menanganinya tanpa harus melawan lapisan abstraksi pfSense.
Cukup tulis field proto hasil reverse engineering yang dibutuhkan ke file
.proto, generate kode secara otomatis, lalu ubah flag-nya. Ini lebih murah daripada implementasi Python dan lebih mudah diperbarui meskipun proto berubah. Mengabaikan tag field yang tidak dikenal adalah fitur penting Protobuf, dan memungkinkan perubahan skema yang kompatibel tanpa merusak deployment lama.Penulis tampaknya sudah menyadari sebagian besar poin dalam komentar, dan tulisannya juga cukup menyeluruh. Ia melakukan benchmark dengan Python dan C++, dan implementasi akhirnya bahkan tidak melakukan decoding Protobuf. Ia juga mencoba beberapa solusi mitm, dan pfSense dipakai bukan sekadar sebagai router keamanan sederhana, melainkan untuk menargetkan hanya traffic Apple TV dengan VLAN dan VPN.
Komentar ini terasa terlalu murahan dan merendahkan. Artikel aslinya tidak seperti itu, jadi kalau mau berkata demikian, sebaiknya buktikan sendiri untuk komunitas.
Kalau membayar YouTube Premium, apakah itu mendukung kreator? Kalau ya, saya penasaran seberapa besar dibanding dukungan langsung seperti Patreon.
Pendapatan dari satu langganan YouTube Premium untuk masing-masing kreator mungkin kecil, tetapi tetap lebih baik daripada menonton video dengan pemblokir iklan aktif.
Dasarnya bukan impresi iklan, melainkan waktu tonton, jadi kreator yang membuat konten format panjang lebih diuntungkan.
Akun YouTube pacar saya anehnya tidak menampilkan iklan di perangkat mana pun saat login. Termasuk Apple TV, bukan Premium, dan juga tidak pernah pernah Premium.
Saya penasaran apakah ada flag internal yang disetel sehingga iklan dimatikan.
Baru saat itulah saya merasa mengerti mengapa orang-orang mengeluh.
Meski tidak memakai pemblokir iklan, begitu login, iklan tidak muncul di mana pun, baik di situs web maupun aplikasi mobile. Saya juga tidak punya Twitch Turbo dan sudah tidak punya Amazon Prime. Manfaat Turbo lain juga tidak ada, jadi akun saya tidak sepenuhnya ditandai sebagai Turbo.
Entah apakah profil akun saya tanpa sengaja rusak karena dulu saya mengutak-atik banyak hal saat bug bounty, tetapi jika mereka membiarkan manfaat ini tetap ada, saya bisa memberikan informasi lebih rinci.
Yang aneh, saya ingat dulu ketika di rumah sakit, dalam kondisi dibius obat dan kesakitan, saya hanya ingin menonton TV, tetapi iklan Twitch sangat parah sampai hampir membuat saya breakdown. Lalu 1–2 tahun kemudian, tiba-tiba saya sadar bahwa saya tidak melihat iklan selama bertahun-tahun.
Mungkin ada A/B test tanpa iklan yang sudah lama terlupakan dan dibiarkan karena tidak layak dibereskan. Berkat itu saya mendapat keuntungan selama bertahun-tahun dan menonton Twitch lebih banyak daripada platform lain mana pun. Twitch Turbo di Inggris £12 per bulan, sekitar $15,50, jadi termasuk mahal secara global, dan dibanding $12/€12 di AS dan Eropa, harganya terasa cukup merugikan.
Cukup mengejutkan bahwa menempatkan proxy man-in-the-middle antara Apple TV dan internet eksternal bisa mendekripsi trafik HTTPS
Biasanya saya pikir ini seharusnya tidak berfungsi, lalu kemudian saya kembali terkejut setelah tahu bahwa CA bisa ditambahkan ke certificate store Apple TV. Ini tulisan yang sangat rinci dan menelusuri seluruh stack
Misalnya di universitas, agar perangkat bisa terhubung ke Wi-Fi, alamat MAC harus dimasukkan ke allowlist atau sertifikat harus dipasang
Namun kalau begitu, YouTube bisa rusak di banyak lingkungan perusahaan, jadi belum tentu mereka benar-benar akan melakukannya. Tetap saja, sayangnya ini sangat mudah diblokir
Saya sudah beberapa kali mencoba mengimplementasikannya di Apple TV, tetapi sama sekali tidak berhasil. Sepertinya YouTube sekarang sudah menambahkan certificate pinning ke aplikasinya, atau semacam itu. Penasaran apakah ada orang yang belakangan ini berhasil membuatnya berjalan
[0] https://frida.re/docs/home/
Saya suka semua upaya untuk memblokir di seluruh jaringan layanan online buruk yang terpaksa kita pakai
Pemblokiran iklan juga bagus, tetapi saya berharap ada cara yang lebih mudah dan lebih banyak untuk memblokir scroll tak terbatas yang agresif seperti YouTube Shorts atau Instagram Reels di seluruh jaringan
Di Instagram saya hanya ingin melihat postingan dan story dari orang yang saya ikuti, bukan direkomendasikan video bodoh yang dirancang untuk mencuri perhatian. Mungkin ini menunjukkan kurangnya kemauan, tetapi saya sering akhirnya menonton beberapa dan kehilangan 15 menit hidup saya
Pengguna internet pada umumnya memilih tidak ingin membayar, jadi ada pihak lain yang menanggung biayanya. Secara keseluruhan, pengguna internet tidak memberi imbalan kepada pihak yang tidak menampilkan iklan. Mereka menginginkan konten, tetapi umumnya menginginkannya gratis
Saya menemukan script yang mengubah halaman Instagram menjadi seperti tag gambar biasa sehingga hanya foto yang bisa dilihat: https://greasyfork.org/en/scripts/5014-un-instagram
Jadi ini tampaknya bukan sekadar kurangnya kemauan, melainkan lebih mirip ketidakpekaan yang telah kita bangun, dan itu cukup buruk. Upaya dan kreativitas untuk mengembalikan keadaan agar kitalah yang memakai platform, bukan platform yang membuat kita memakainya, patut dihargai
Saya rutin membicarakannya dengan anak-anak, dan mereka juga setuju bahwa itu berbahaya, tetapi terlalu sulit untuk dilawan. Saya sendiri pun kadang terseret doomscrolling
Di tempat yang memungkinkan, saya sudah mengatur pemfilteran iklan dengan Pi-hole, tetapi saya tidak ingin memblokir YouTube sepenuhnya. Meski begitu, demi melindungi keluarga, sepertinya ke depan saya akan mempertimbangkannya secara serius
Rekayasanya bagus, tetapi agak menyedihkan bahwa kita harus sampai sejauh ini agar bisa memakai hardware atau software sendiri seolah-olah kita memilikinya, bahkan hanya sampai tingkat tertentu
Memangnya ada iklan di YouTube? Browser saya memblokirnya dengan sangat baik sampai saya tidak tahu
Masalah sebenarnya adalah pengalaman Apple TV jauh lebih buruk daripada pengalaman browser web biasa. Apple mengunci hardware terlalu ketat, sehingga strukturnya lebih menguntungkan pendapatan iklan YouTube daripada konsumen akhir yang sudah membayar untuk membelinya
Hal yang sama terjadi saat menjelajah web dengan iPad di luar jaringan Pi-hole rumah. Saya tidak tahu bagaimana orang bisa menahannya setiap hari
iPad itu perangkat kerja yang diberikan kantor, jadi saya tidak sering memakainya untuk keperluan pribadi, tetapi setiap kali dipakai saya kembali diingatkan betapa menyebalkannya
Anehnya, sebelum menerima iPad saya mengira perangkat itu hanya berguna untuk konsumsi konten, tetapi kenyataannya sangat praktis untuk remote access cepat ke resource kerja, sementara untuk browsing web biasa dan streaming media, perangkat itu terasa terjebak di gurun tandus yang dipenuhi iklan
Kalau butuh YouTube tanpa iklan, pakai https://yewtu.be atau instance Invidious lain https://docs.invidious.io/instances/
Ada perlombaan senjata antara YouTube dan Invidious, dan kadang Invidious tidak berfungsi, tetapi timnya selalu menemukan cara baru untuk melewati YouTube dan mengirimkan video tanpa iklan