- Untuk memblokir iklan YouTube di Apple TV dan iPhone pada level jaringan, dilakukan berbagai eksperimen mulai dari pfSense, pemblokiran DNS, routing VPN, Squid, MITMProxy, hingga modifikasi respons Protobuf
- Karena iklan YouTube dikirim dari domain yang sama dengan video biasa, pemblokiran DNS saja seperti dengan Pi-hole atau pfBlockerNG sulit memisahkan konten dan iklan secara stabil
- Setelah trafik TLS didekripsi dengan MITMProxy, field iklan JSON pada YouTube web dihapus, sementara pada aplikasi iOS struktur iklan di dalam respons application/x-protobuf dicari lalu dimodifikasi secara langsung
- Decoding Protobuf penuh berbasis Python memerlukan sekitar 23 detik pada router pfSense, tetapi dengan metode pemindaian linear di sekitar
/pagead/, payload 1.8MiB pun bisa diproses secara real time - Metode ini memerlukan instalasi CA tepercaya dan CPU yang cukup bertenaga; pemblokiran iklan pada perangkat Apple yang terhubung ke jaringan berhasil dilakukan, tetapi pada akhirnya opsi berlangganan YouTube Premium pun mulai dipertimbangkan
Router pfSense dan pemisahan jaringan
- Tujuannya adalah membuat router berbasis FreeBSD·pfSense untuk memblokir iklan YouTube pre-roll, mid-roll, end-roll di Apple TV dan iPhone pada seluruh jaringan
- Perangkat keras yang digunakan adalah mini PC J4125 dengan set instruksi AES-NI, RAM DDR4, SSD mSATA, dan USB drive untuk instalasi pfSense
- Contoh konfigurasinya menggunakan RAM 32GiB dan SSD mSATA 128GB
- Ruang penyimpanan 128GB dianggap berguna untuk log, mengurangi keausan SSD, packet capture, dan ruang edge cache
- Setelah pfSense diinstal, LAN 1 diatur ke IP statis
192.168.1.3di luar rentang DHCP yang ada, lalu portal web admin diakses dengan akunadmin/pfsense - Setelah memeriksa indikator
AES-NI CPU Crypto: Yes (inactive)di dashboard pfSense, AES-NI diaktifkan secara manual dari System › Advanced › Miscellaneous - Dengan memanfaatkan RAM 32GiB, RAM disk berukuran besar dialokasikan ke
/vardan/tmp, serta backup RAM-disk diatur berjalan setiap jam
Pemblokiran DNS dan pemisahan jaringan fisik
- Alih-alih memakai Pi-hole yang lama, dipasang paket pfSense pfBlockerNG-devel untuk memblokir iklan, konten berbahaya, dan melakukan pemblokiran geografis
- Ukuran instalasinya menambah sekitar 20MiB
- Jika layanan
pfb_dnsbltidak berjalan atau muncul[ Missing CRON task ], disarankan mencoba menghapus file kosong/var/run/booting
- Tiga port Gigabit pada router pfSense digunakan untuk pemisahan LAN fisik, bukan VLAN
- Perangkat yang sering phoning-home seperti Alexa dan Apple TV ditempatkan di LAN perangkat keras terpisah
- LAN penting dipisahkan dari perangkat pintar dan perangkat Wi‑Fi untuk melindungi perangkat yang digunakan untuk perbankan, trading saham, dan crypto wallet
- Jaringan untuk perangkat pintar dipisahkan ke
172.31.1.0/24, sedangkan LAN yang lebih tepercaya tetap berada di192.168/16- Jika tidak ada route antarjaringan, dampak dari aturan iptables yang salah konfigurasi juga dianggap bisa sedikit berkurang
- DHCP resolver pada NIC fisik harus diaktifkan agar perangkat jaringan baru bisa memperoleh alamat
- AC1200 Archer C5 dibuang karena tidak memiliki mode AP, bermasalah untuk akses jarak jauh, masih memakai stock firmware lama, dan chipset Broadcom-nya kurang didukung oleh OpenWRT/DD-WRT/Tomato
- Setelah itu, Nighthawk R7000 digunakan sebagai AP untuk Apple/Amazon/TV dan AP untuk Trusted Wireless Network
- Pada Trusted Wireless Network, diputuskan untuk mematikan 2.4GHz dan hanya memakai 5GHz
- 5GHz dianggap lebih mudah terhalang dinding dan beton, sehingga lebih baik untuk menghindari snooping dari jarak menengah
Memaksa semua DNS melalui pfSense
- Ditambahkan aturan NAT agar semua klien di belakang pfSense menggunakan server Unbound DNS lokal
- Tujuannya agar aplikasi dan home assistant tidak bisa menghindar lewat server DNS sendiri atau DNS yang di-hardcode
- Agar pfBlockerNG bisa ikut campur dalam permintaan DNS, DNS over TLS perlu diblokir
- Aturan NAT awalnya dibuat pada tiap antarmuka selain WAN, lalu disederhanakan dengan alias firewall
Non_WAN- Pada IPv4 dan IPv6, kueri DNS lokal di port 53 diarahkan ulang ke localhost
- NAT reflection harus dinonaktifkan agar server DNS lokal tidak bisa diakses dari internet eksternal
- Pada Services › DNS Resolver › Display Custom Options ditambahkan
server: log-queries: yesuntuk mencatat permintaan DNS yang dicegat - Dari log DNS terlihat Windows mencoba mengakses Google Tag Manager, dan permintaan tersebut diblackhole ke IP yang tidak ada,
10.10.10.1
Mencoba menghindari penargetan iklan YouTube dengan VPN
- Karena iklan YouTube datang dari domain yang sama dengan video biasa, pemblokir domain seperti pfBlockerNG atau Pi-hole sulit memilih hanya iklannya
- Memblokir
googleadservices.comdianggap baru bermakna setelah video iklan diputar dan iklan itu diklik - Di browser, uBlock Origin bisa ikut campur pada JavaScript, tetapi pada aplikasi YouTube iPhone pembatasan iklan dianggap sulit tanpa jailbreak
- Memblokir
- Alih-alih memblokir iklan secara langsung, dilakukan eksperimen agar algoritme iklan YouTube menilai pengguna sebagai target iklan yang kurang menarik
- Idenya adalah mengirim trafik Apple TV melalui VPN dan memakai endpoint VPN di wilayah dengan sedikit penonton YouTube
- Tujuannya adalah membuat pengguna terlihat seperti pria 70 tahun yang tinggal di Italia
- WireGuard dikonfigurasi di pfSense, dengan private key NordLynx/WireGuard diambil dari Linux VM lalu diterapkan
- Saat memasukkan alamat tunnel, jika diisi
1.0.0.0dan subnet mask0, hasil di UI akan tampil sebagai0.0.0.0/0
- Saat memasukkan alamat tunnel, jika diisi
- Ketika seluruh trafik Apple TV dilewatkan melalui VPN, YouTube tampil dalam bahasa Italia dan jumlah iklan berkurang, tetapi Netflix dan Amazon Prime mengalami masalah
- Tampak seperti file CSS atau font diblokir dan thumbnail gagal dimuat
- Diperingatkan bahwa Netflix dan Prime cukup ketat dalam geofencing terhadap penyedia VPN
- Setelah itu, dicoba merutekan hanya FQDN terkait YouTube melalui VPN, dengan kandidat seperti
www.youtube.com,youtube.com,googlevideo.com,accounts.google.com,googleapis.com,gstatic.com- Setelah konfigurasi ini, YouTube menganggap pengguna berada di Milan, sementara Netflix dan Prime Video menganggapnya berada di Kanada
- Iklan menjadi jarang muncul, dan iklan yang tetap muncul pun berbahasa Italia
Masalah DNS race condition dan domain wildcard
- Sehari kemudian ditemukan DNS race condition di mana hostname alias pfSense dan cache DNS klien melihat kumpulan IP YouTube yang berbeda
- Interval resolve default hostname alias pfSense adalah 300 detik
- TTL DNS YouTube teramati sebesar 1.440 detik
- Jika IP yang di-resolve Alias Daemon untuk FQDN tidak cocok dengan IP yang diterima Apple TV kemudian, lalu lintas bisa melewatkan tunnel VPN
- Mitigasinya adalah membuat pfSense mengabaikan TTL target dan menyimpan cache entri alias lebih lama
- Subdomain varian
googlevideo.commemerlukan routing wildcard, tetapi aturan NAT dan firewall bekerja berbasis IP dan tidak bisa langsung menangani hostname wildcard - Sebuah PoC ditulis menggunakan modul Python Unbound dan pfSense REST API untuk menangkap IP respons DNS dan menambahkannya secara dinamis ke alias
VPN_wildcards- TTL
VPN_wildcardsdiatur 1 jam, kapasitasnya 500 - Record A diparse sebagai
ipaddress.IPv4Address, record AAAA sebagaiipaddress.IPv6Address
- TTL
- Saat diperiksa pada pagi hari, Unbound DNS Resolver berada dalam kondisi segfault, dan karena setiap penambahan IP memerlukan reload rule pfSense, pfSense menjadi sangat lambat
Mendekripsi HTTPS dengan Squid dan MITMProxy
- Tujuan baru adalah memasang proxy mirip Squid dan menambahkan sertifikat CA palsu tetapi tepercaya ke perangkat untuk melakukan dekripsi trafik TLS
- Squid dipasang sebagai paket pfSense dan bahkan lulus smoke test SSL Filtering, tetapi kemudian ditinggalkan
- Performanya sangat lambat
- Pengaturan ACL merepotkan
- Ada masalah terkait
https://http/* - Pembaruan daftar filter URL SquidGuard memakan waktu sangat lama
- UI Squid dianggap kurang memadai
- Setelah itu dipilih MITMProxy
- Ada scripting Python dan UI, serta dianggap bisa diperluas agar cocok untuk pemblokiran iklan YouTube
- Tarball Linux mitmproxy 7.0.4 tidak bisa dijalankan di FreeBSD karena
ELF interpreter /lib64/ld-linux-x86-64.so.2 not founddan library yang hilang
- MITMProxy dipasang di lingkungan FreeBSD jail milik pfSense dengan
pkg install mitmproxy- Paket yang dipasang berjumlah 50, ruang tambahan 206MiB, ukuran unduhan 33MiB
- Saat
mitmproxydijalankan di dalam jail, UI terbuka
- Untuk eksperimen MITMProxy, virtual IP
127.0.1.1ditempelkan ke localhost di pfSense, lalu aturan NAT meneruskan[Private IPs]:8080ke127.0.1.1:8080- Ketika proxy laptop korban diatur ke
192.168.20.1:8080, permintaan browser muncul di log UI MITMProxy
- Ketika proxy laptop korban diatur ke
- File PEM CA MITMProxy adalah
~/.mitmproxy/mitmproxy-ca-cert.pemcert.pemdisajikan lewat server web Python 3- MITMProxy juga menyediakan sertifikat CA yang sama di
mitm.it - Sertifikat ditambahkan ke laptop bersih dan iPhone
Pengoperasian MITMProxy dan penanganan certificate pinning
- Di router,
mitmproxymenggunakan banyak CPU bahkan saat idle, dan diduga penyebabnya adalah pembuatan sertifikat TLS secara langsung untuk setiap permintaan serta logging UI yang berlebihan mitmdumpdianggap menurunkan beban CPU karena menghilangkan UI dan logging ekstrem- Saat dijalankan, digunakan
--anticomp,--mode regular,--listen-port 8080,--listen-host 127.0.1.1, dan lain-lain
- Saat dijalankan, digunakan
- Certificate Pinning adalah teknik di mana server atau klien sudah mengetahui fingerprint sertifikat yang diharapkan, sehingga pemalsuan sertifikat oleh MITMProxy tidak akan berhasil
- Sebagai solusi,
--ignore-hostsdigunakan agar host sepertiapple.com:443danicloud.com:443melewati proxy
- Sebagai solusi,
- Dalam Transparent Proxy Mode,
--allowed-hostsdibuat bekerja lebih baik berdasarkan SNI dengan mem-patchnext_layer.pymilik MITMProxy 7.0.4- Sebelumnya, dalam banyak kasus hanya IP server yang dianggap digunakan untuk pencocokan
- Patch tersebut menambahkan
server.snisebagai kandidat hostname selainserver.address[0]
- Setelah patch, sebagian host dapat dicegat secara stabil dan sisanya bisa dibiarkan lewat
Menghapus iklan JSON di YouTube web
- Dalam smoke test MITMProxy, URL iklan dan pelacakan YouTube diblokir dengan skrip kecil
- Di
youtube.com, yang diblokir meliputi/pagead/,/log_event?,/stats/ads,/stats/qoe?,/ptracking?,/generate_204,el=adunit,adformat=,/activeview?, dan lainnya - Di
google.comdangoogle.ca,/pagead/diblokir
- Di
- Pada pengujian awal, permintaan yang menjadi target pemblokiran memang benar-benar terblokir juga di panel Network DevTools
- Entri
(failed)berasal dari skrip - Kegagalan
502diduga merupakan hasil pfBlockerNG yang menangani permintaan dengan black-hole - HTTP/2 dinonaktifkan agar permintaan lanjutan pada kanal yang sama tidak ikut lewat
- Entri
- Pemblokiran URL sederhana saja tidak sepenuhnya menghilangkan iklan, sehingga sambil melihat HTML·JavaScript YouTube dan filter uBlock Origin, ditelusuri kemungkinan bahwa informasi iklan berada di body respons JSON
- Dalam respons JSON yang ditangkap MITMProxy, informasi iklan dan pelacakan terkonfirmasi ada di struktur
playerAdsdanplaybackTrackingplayerAdsmencakupplayerLegacyDesktopWatchAdsRenderer,playerAdParams,gutParams.tag,showCompanion,showInstream,useGut, dan lain-lainplaybackTrackingmencakupvideostatsPlaybackUrl,ptrackingUrl,qoeUrl,atrUrl, dan lain-lainyoutubeRemarketingUrlberbentukwww.youtube.com/pagead/viewthroughconversion/...
- Di YouTube web, menghapus informasi iklan dari payload JSON memungkinkan iklan web dihilangkan melalui router
YouTube iOS dan analisis Protobuf
- Aplikasi YouTube iOS menggunakan data dalam bentuk Protocol Buffer (Protobuf) alih-alih JSON pada panggilan API yang mirip dengan versi web
- Dalam Protobuf, key berupa angka dan dapat berubah, sehingga sulit menemukan bagian iklan dengan pendekatan bergaya JSONPath
- Di payload terlihat string iklan seperti “Telus”, “Samsung TV”, “Boxing Week”, “Buy now”
- Trafik jaringan YouTube iOS berbeda dari trafik web
- Pada versi web, kandidat iklan sampai batas tertentu dapat diperkirakan dari parameter
rangeatauclenpada chunk video - Protokol iOS tidak menggunakan parameter query
rangeatau headerRange, melainkan counter seperti&nr=2,&nr=3
- Pada versi web, kandidat iklan sampai batas tertentu dapat diperkirakan dari parameter
- Saat mendekode respons Protobuf untuk analisis offline, ditemukan item seperti
has_unlimited_entitlement: False,has_premium_lite_entitlement: False- Mengubah nilai ini terasa seperti “cheating”, sehingga pendekatan kembali ke heuristic
- Eksperimen pemblokiran URL iklan menyebabkan infinite loop, error UI, dan crash pada aplikasi iOS
200dengan body kosong,404,503, response body yang terpotong, dan perlakuan sebagian video iklan sebagai null membuat aplikasi melambat atau crash dalam keadaan rusak- Endpoint pelaporan error
/error_204/menunjukkan “dev assertion failed” dan ikut diblokir
- Iklan tampaknya didaftarkan ke slot di dalam video tertentu
- Jenis slot mencakup pre-roll, mid-roll, end-roll, full-page, dan ad pod
- Jika hanya URL iklan yang diblokir, akan muncul error semacam “iklan yang tidak ada memesan slot”, lalu UI masuk ke kondisi panic
Masalah performa Protobuf dan blackboxprotobuf
- Mendekode raw Protobuf sekitar 500KiB menjadi teks yang dapat dibaca manusia hanya dengan Python sangat lambat
- Pada desktop CPU i7-6700, waktunya sekitar 2,06~2,11 detik
- Pada router pfSense, waktunya sekitar 22,8~24,2 detik
- C++
protoc --decode_rawjauh lebih cepat- Pada desktop CPU i7-6700, waktunya sekitar 0,017~0,022 detik
- Pada router pfSense, sekitar 0,12~0,14 detik
- Karena Python tidak mendukung raw decoding, dipilih cara berkomunikasi langsung dengan binary C++
protocmelaluisubprocess.Popen blackboxprotobufuntuk Burp Suite dapat mendekode raw Protobuf wire message, menyuntikkan nilai, lalu melakukan re-encode- Disarankan memakai versi asli Burp Suite, bukan fork PyPI
- Beberapa fork dapat menyebabkan stack overflow karena deep recursion
- Jika
os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] = "cpp"disetel sebelum importprotobuf, maka implementasi C++libprotobuf.soakan digunakan bila tersedia
protobuf_to_json(data)milikblackboxprotobufdapat membuat schema.protobest-guess, tetapi hasilnya sangat besar, sangat dalam nested-nya, dan tidak sempurna- Dump schema Python panjangnya lebih dari sekitar 250.000 karakter
- Ini dinilai cukup untuk mengekstrak detail iklan
Menonaktifkan bagian iklan dengan perubahan 1 byte
- Protobuf Wire Format dapat berubah encoding-nya saat di-decode/edit/re-encode tanpa schema asli
- Penyebabnya disebut mencakup penggunaan ZigZag encoding, ketidakmampuan menentukan tipe numerik, dan sifat non-deterministik urutan field object
- Solusinya adalah memanfaatkan backward compatibility Protobuf untuk membuat bagian iklan terlihat seperti field yang tidak dikenal
- Ini memanfaatkan perilaku software lama yang mengabaikan field tak dikenal saat membaca field baru
- Dengan mengubah 1 byte di titik kritis agar section yang deeply nested tampak seperti milik versi schema masa depan, Protobuf akan mengabaikannya
- Target field key
49399797harus ditemukan dengan varint tag scanning, bukan pencarian string biasa- Wire type-nya
2, yang berarti nested string/message length-delimited - Target tag dihitung sebagai
AA FF B8 BC 01 - Setelah 3 bit wire type di-shift out, field key
49399797dipulihkan
- Wire type-nya
- Penelusuran aktual dilakukan dengan lebih dulu mencari signature URL iklan seperti
/pagead/di raw byte Protobuf, lalu bergerak mundur di sekitarnya untuk menemukan target field tag dan field key- Target intercept contoh adalah
POST youtubei.googleapis.com:443/youtubei/v1/browse?key=... - Responsnya adalah
200,application/x-protobuf,1.87m - Pada log contoh,
49399797ditemukan di posisi4465, dan50195462di posisi4477
- Target intercept contoh adalah
- Dalam smoke test O(n), penghapusan iklan pada data Protobuf 1,8MiB bekerja dengan satu kali scan tanpa memori tambahan
- Target ditemukan pada byte ke-30.593
- Backtracking sekitar 600 byte dilakukan untuk menemukan field key yang akan diubah
- Tidak perlu lagi memblokir URL yang memuat
*.googleadservices.comatau/pagead/, karena request tersebut sejak awal tidak dibuat
Struktur add-on MITMProxy
- Skrip PoC disimpan sebagai
youtube.pydan dijalankan denganmitmdump --listen-port 8080 --listen-host 127.0.0.1 -s "youtube.py"- Prasyarat FreeBSD yang disebutkan adalah
pkg install protobuf,pkg install py38-pip,pip install jsonpath-ng
- Prasyarat FreeBSD yang disebutkan adalah
- Skrip terdiri dari kelas
Logger,trunc,KilledError,JSONPathReplacement,ProtobufDebugParser, danYouTubeAdBlocker - Regex host target intersepsi
YouTubeAdBlockeradalah\.youtube\.com|google\.(com|ca)|googleapis\.com|googleadservices\.com|googlevideo\.com- String pencarian URL iklan Protobuf adalah
b"/pagead/" - Batas pencarian adalah
80_000 - Tag field target adalah
50195462
- String pencarian URL iklan Protobuf adalah
- Rule pemblokiran permintaan memeriksa string URL parsial per host lalu mematikan flow
- Untuk target
youtube.com, ini mencakuppagead/,log_event?,stats/ads,stats/qoe?,ptracking?,generate_204,error_204,adformat=,activeview?,_ad_,ai?,sw.js, dan lainnya - Pada
sw.jsada komentar yang menyatakan service workers ditolak
- Untuk target
- Pada respons JSON, beberapa replacement JSONPath diterapkan
$.responseContext.serviceTrackingParams[*].params[?(@.key == 'yt_ad')].valuediubah menjadi"0"$..adPlacementsdiubah menjadi[]$..adPlacementRenderer,$..adPlacementConfig,$..playerAdParams,$..gutParamsdiubah menjadi{}$..adVideoIddiubah menjadi string kosong$..showCompanion,$..showInstream,$..useGutdiubah menjadiFalse
- Pada respons Protobuf, saat content type berisi
protobuf, body dijadikanbytearraydan/pagead/dicari dalam 80.000 byte pertamaTagBytes(self.target_field_tag, WIRETYPE_LENGTH_DELIMITED)digunakan untuk membuat byte tag target, lalu dibuat byte baru daritarget_field_tag - 1- Pencarian mundur dilakukan hingga tepat sebelum posisi
/pagead/untuk menemukan byte tag target - Jika ditemukan, byte tersebut ditimpa dengan byte baru dan body respons diganti dengan
flow.response.set_content(bytes(body))
- Dalam komentar, PoC ini disebut memblokir 90% iklan
- Di section lain juga ada field key lain, dan bisa jadi ada beberapa section iklan yang perlu dirusak
Cakupan penerapan dan keterbatasan
- Teknik ini dirangkum sebagai teknik yang sangat terspesialisasi untuk memblokir iklan YouTube di perangkat Apple atau traffic tracker seperti Instagram, WhatsApp, dan Facebook
- Kebutuhan CPU untuk mendekripsi/mengenkripsi ulang traffic HTTPS dinilai jauh melampaui kemampuan Raspberry Pi
- Setelah Apple TV di-jailbreak lalu ditambahkan root certificate pfSense, gateway pfSense dinilai dapat mendekripsi traffic Apple TV dan memblokirnya dengan memeriksa hostname iklan di header request
- Namun ini tetap tidak berlaku untuk iklan di iPhone, jailbreak iPhone lebih sulit, dan aplikasi perbankan bisa mendeteksinya lalu tidak berfungsi
- Jailbreak itu sendiri dianggap terlalu ekstrem
- Jika fake trusted CA memungkinkan, paket TLS dapat didekripsi menjadi plaintext dan pemblokiran URL bisa diterapkan
- Contoh URL yang diblokir adalah path YouTube
/pagead/viewthroughconversion/...dan/pagead/conversion/...
- Contoh URL yang diblokir adalah path YouTube
- Pada akhirnya, penulis menyiapkan router hardware dari nol, membagi LAN menjadi zona tepercaya dan tidak tepercaya, menambahkan pemblokiran iklan DNS dan proxy MITM transparan, lalu memblokir iklan YouTube dengan performa baik pada perangkat Apple yang terhubung ke jaringan
YouTube Premium dan dukungan untuk kreator
- Setelah memblokir iklan YouTube selama beberapa bulan, penulis mulai membayar YouTube Premium karena ingin mendukung kreator konten
- Ditambahkan catatan, “bisa dilakukan bukan berarti harus dilakukan”
- Harga YouTube Premium disebut naik dari CAD
$9.99/momenjadi$11.99/mo, sekitar$13.43/motermasuk pajak - Dalam eksperimen menonton iklan, penulis menonton YouTube sesekali selama sehari dengan laptop bersih dan mode penjelajahan privat
- Berdasarkan catatan, video yang ditonton ada 10
- Terpapar 8 iklan, dan hanya 2 di antaranya yang bisa dilewati
- Jika CPV diasumsikan USD
$0.15, biaya iklan per hari menjadi$1.20, dan ekstrapolasi per bulan sekitar USD$36/mo - Dalam perhitungan lain yang memakai angka Statista, pengiklan AS pada 2019 menghabiskan
$15.1 billiondi YouTube dan penduduk AS menonton916 billionvideo, sehingga rata-rata per tayangan adalah USD$0.0165- Jika perhitungan ini diterapkan, biaya per hari sekitar USD
$0.13, dan ekstrapolasi per bulan sekitar USD$3.96 - Nilai ini dinilai tidak mendekati Premium di kisaran USD
$10
- Jika perhitungan ini diterapkan, biaya per hari sekitar USD
- Jika ada klaim DMCA, pendapatan iklan bisa masuk ke pengaju klaim seperti Sony atau Viacom, bukan ke kreator
- Karena itu, tanpa disadari penonton mungkin sama sekali tidak memberi apa pun ke channel favoritnya
- Penulis menilai tidak mengherankan jika banyak kreator berpindah ke Patreon
2 komentar
Tulisan aslinya sangat panjang. Prosesnya memang menarik, tetapi poin utamanya adalah bahkan penulisnya sendiri pada akhirnya tetap berlangganan YouTube Premium untuk digunakan.
Komentar Hacker News
Secara keseluruhan ini hack yang keren, tetapi beberapa ungkapan tentang Protobuf terasa agak aneh
Yang dilakukan adalah sengaja merusak tag suatu field di Protobuf, dan mengabaikan nomor tag yang tidak dikenali bukanlah “cacat”, melainkan desain inti untuk ekstensibilitas
1,87MiB juga bukan ukuran yang terlalu besar, dan sepertinya pesan seperti ini tidak terus-menerus di-streaming, jadi penjelasan bahwa ini menjadi hambatan performa juga kurang meyakinkan
Encoding Protobuf tidak dirancang untuk membuat biaya decoding mahal, justru dirancang agar dapat di-decode secara efisien, dan bahkan tanpa skema
.protoasli pun bisa di-decode langsung denganUnknownFieldSetCara yang lebih baik tampaknya adalah memakai skema
.protopalsu yang hanya berisi satu field yang ingin dihapus. Metode memindai string lebih rentan salah karena urutan byte yang sama bisa saja muncul secara kebetulan di data lainJika urutan field berubah, hasil byte setelah re-encoding memang bisa berbeda, tetapi penerima harus memperlakukannya sebagai pesan yang sama, dan kecil kemungkinan aplikasi YouTube mendeteksi perubahan urutan field
Dari sudut pandang saya yang pernah mengerjakan Protobuf dulu, sepertinya penulis salah memahami bagian ini
Saya menghabiskan sebagian besar hidup di daerah pedesaan, dan kalau bukan Wi-Fi saya sendiri, ukuran sebesar ini pun dalam praktiknya adalah unduhan besar. Di mobile mungkin ada cara mengakalinya, tetapi Wi-Fi pedesaan masih kewalahan dengan struktur Web 2.0 dan biasanya dipakai pada kecepatan 2–4G
Di wilayah perkotaan yang punya populasi untuk menopang infrastrukturnya, 1,87MB umumnya sudah menjadi file kecil, tetapi sekitar pukul 6 sore ketika semua orang yang memakai koneksi kabel sedang streaming bisa menjadi pengecualian
without the C++ source proto files: saya membuat proyek bernama protodump yang menghasilkan file sumber.protodari binaryProyek ini meregenerasi definisi pesan dan field, termasuk nama aslinya, dan Anda hanya perlu mengambil binary dari kotak Apple TV
https://github.com/arkadiyt/protodump
Protobuf adalah teknologi yang pertama kali memperkenalkan saya pada IDL, dan saat itu terasa seperti ide ajaib. Saya makin terkejut karena menemukan Protobuf setelah sebelumnya membuat IDL sendiri yang asal-asalan
Jika tidak ingin menarik seluruh dependensi
protoc, Anda bisa menulis decoder Protobuf sederhana beberapa ratus baris sendiri: https://github.com/kubernetes/test-infra/blob/master/guberna... https://github.com/kubernetes/test-infra/blob/master/guberna...Sejak menemukan The Proxomitron lebih dari 20 tahun lalu, saya sudah memproses trafik lewat proxy man-in-the-middle untuk menghapus iklan dan menulis ulang halaman dengan hal-hal seperti CSS pengguna
Layanan seperti CloudFlare cenderung mengklasifikasikan saya sebagai “bot”, tetapi itu pun ada cara untuk mengakalinya meski tidak sederhana. Kasus seperti ini juga menunjukkan mengapa remote attestation berbahaya bagi kebebasan pengguna
Tampaknya ada beberapa proyek “penerus”, dan saya juga penasaran apakah ini khusus Windows. Saya sempat mencari secara ringan proxy sederhana yang bisa menyisipkan tautan lokal ke konten jarak jauh
Saat ini pi-hole yang dulu berjalan di Pi 4 saya pun sudah saya cabut. Saya menghabiskan berjam-jam agar bisa bekerja dengan baik bersama berbagai layanan, tetapi akhirnya menyerah, dan itu tidak sepadan dengan waktu untuk jaringan rumah
Yang benar-benar bekerja dengan baik adalah pemblokir iklan berbasis browser dan patcher aplikasi seperti ReVanced. Seiring tabungan bertambah, untuk kasus yang tidak bisa diselesaikan oleh keduanya seperti YouTube Premium, Hulu, Netflix, dan Max, saya makin condong membayar layanan bebas iklan saja
Saya tidak pernah memakainya untuk tujuan yang disebutkan di sini, tetapi dulu sangat bagus sebagai proxy di balik firewall perusahaan. Waktu itu firewall menuntut informasi login untuk koneksi keluar, sehingga banyak program tidak bisa mengakses internet
Privaxy yang dipaketkan dengan Docker jadi teringat. Ini adalah proxy man-in-the-middle yang kompatibel dengan daftar blokir UBlock Origin.
Mengejutkan melihat betapa banyaknya iklan dan skrip pelacakan di produk pintar, terutama TV. Dari pengujian sejauh ini, trafik yang tidak perlu melebihi 40%, dan eksperimen mengupas iklan dari aplikasi smart TV cukup menarik.
https://github.com/deetungsten/webui-privaxy adalah fork https://github.com/Barre/privaxy yang dibuat versi Docker-nya.
Saya sempat ingin mengubah fork itu agar frontend tidak memakai alamat
0.0.0.0yang di-hardcode, supaya container Docker benar-benar bisa diisolasi, tapi hidup keburu menyela. Sudah mencobanya di Apple TV?https://github.com/AdguardTeam/urlfilter
Tulisan ini menjadi jawaban yang sangat bagus untuk pertanyaan yang sering muncul, “bagaimana cara belajar menjadi hacker?”
Eksploit apa pun selalu menunjukkan dengan baik proses berpikir dan kerja tekun yang ada di dalamnya.
Ada bagian “pakai WireGuard — ada set instruksi enkripsi Intel AES-NI”, tetapi setahu saya WireGuard tidak memakai AES.
Secara umum, penulis tampaknya agak melebih-lebihkan kebutuhan CPU untuk enkripsi TLS, atau meremehkan performa komputer single-board modern.
Penjelasan bahwa kebutuhan CPU untuk mendekripsi dan mengenkripsi ulang trafik HTTPS di Raspberry Pi akan jauh terlampaui juga terasa janggal. Kalau pemrosesan TLS man-in-the-middle benar-benar tidak memungkinkan di RPi 4, saya akan cukup terkejut, bahkan jika memakai RSA murni di software sekalipun.
Di antara ponsel Android yang masih dipakai, ada juga yang CPU-nya lebih lemah daripada RPi 4, dan perangkat-perangkat itu tetap memakai TLS.
Jika ponsel Android yang lemah hanya bisa memproses trafik TLS 50Mb/s, itu mungkin bukan masalah besar dalam penggunaan nyata. Ponsel lambat biasanya terhubung ke jaringan yang lambat juga.
Sebaliknya, jika Anda punya internet gigabit di rumah, lalu ada perangkat lemah di antara semua komputer dan internet yang menjadi bottleneck di 50Mb/s, itu menjadi masalah besar.
Kebutuhan CPU TLS sangat bergantung pada target bandwidth. Pada bandwidth yang lebih tinggi, offloading ke akselerator bahkan praktis menjadi keharusan. Biaya handshake juga sulit diabaikan dan bisa membatasi jumlah koneksi per detik. Pada satu perangkat ini jarang menjadi masalah, tetapi pada jaringan perangkat secara keseluruhan bisa menjadi lebih besar.
Tulisan yang keren. Saya berharap ada cara melakukan man-in-the-middle pada perangkat yang tidak mengizinkan pemasangan CA kustom.
Saya punya perangkat IoT yang tidak mengekspos API lokal dan hanya menampilkan data melalui cloud, dan saya ingin menangkap trafik antara perangkat dan cloud.
Pada akhirnya, apakah tidak ada cara selain dump flash memory, mengganti CA, lalu mengunggahnya kembali?
Ada tulisan bagus yang bisa dicoba untuk mencegat perangkat IoT tanpa mengutak-atik hardware atau firmware:
https://robertheaton.com/2019/11/21/how-to-man-in-the-middle...
Jika itu memungkinkan, berarti bergantung pada cacat implementasi.
Sejujurnya, menurut saya beberapa perangkat yang sekarang masih memungkinkan pemasangan sertifikat tepercaya sendiri pun tidak akan lama lagi tetap seperti itu.
Metode baru untuk memblokir iklan di YouTube atau platform apa pun memang selalu muncul, tetapi beberapa bulan kemudian berubah dan menjadi tidak berguna.
Bagaimana kalau sebagai gantinya menyerang pengiklan? YouTube/Google tampaknya hanya melacak “klik”, tetapi apakah mereka juga melacak pembelian nyata?
Secara teori, jika cukup banyak bot palsu dan pengguna nyata mengklik iklan tetapi tidak membeli apa pun, anggaran iklan bisa dibakar habis. Seiring waktu, departemen pemasaran akan melihat bahwa di platform tertentu jumlah klik mencapai rekor tertinggi tetapi tingkat konversinya sangat rendah dibanding klik atau impresi, dan akhirnya bisa keluar dari platform itu.
Tulisan yang luar biasa. Begitu melihat tahap patch mitm, saya merasa ini akan menjadi tulisan yang istimewa, dan memang benar.
Bagian daftar isi “Tujuan baru: membuat YouTube percaya bahwa saya pria 70 tahun yang tinggal di Italia” sangat berkesan.
Dulu entah bagaimana penargetan iklan pernah dibuat percaya bahwa saya adalah orang yang ingin membeli piyama sutra yang bisa dicuci seharga 500 dolar untuk kekasih saya.
Iklannya sendiri hebat, tetapi saya penasaran berapa yang mereka bayar per tayangan.
Setelah beralih ke Apple TV, biasanya saya mendapat iklan lokal dengan penargetan wilayah yang salah. Rata-rata, mungkin itu justru lebih baik.
Ini bukan “cacat” pada Protobuf. Ketika byte diubah lalu didekode sebagai field di posisi lain, itu berfungsi sesuai rancangan
Sejak awal Protobuf adalah protokol berbasis nomor field dan prefiks panjang, membuat asumsi wajar bahwa byte tidak berubah selama transmisi, dan menyerahkan integritas kepada pihak yang membaca
Kalaupun itu disebut cacat, itu bukan cacat Protobuf melainkan cacat pada aplikasi YouTube untuk iOS; dan karena sebenarnya bukan cacat, sulit juga menyebutnya “eksploit”. Kecuali yang dimaksud adalah fakta bahwa dalam pertukaran Protobuf aplikasi YouTube iOS, hash payload yang dikembalikan tidak diperiksa
Setelah tulisan ini, kemungkinan besar mereka akan mulai memeriksanya
Itu bukan cacat, melainkan bekerja sesuai desain
Bagian yang mengatakan “Google membuat decoding, modifikasi, dan re-encoding mahal secara komputasi tanpa file proto sumber C++” juga aneh. Jika dilakukan dengan kode Python yang tidak dioptimalkan memang mahal, tetapi jika ditulis dalam C atau bahasa terkompilasi lain, memindai Protobuf 1,8 MB adalah hal sepele, ada atau tidak ada file sumber proto
Sepertinya membuat file Protobuf sulit didekode tanpa sumber bukanlah tujuan desainnya. Jika itu tujuannya, hasilnya bisa dibilang cukup buruk