1 पॉइंट द्वारा GN⁺ 2025-03-19 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Apple TV और इंटरनेट के बीच pfSense-आधारित MITM प्रॉक्सी रखकर HTTPS को decrypt किया गया, फिर YouTube द्वारा भेजे जाने वाले Protobuf response को modify कर Apple devices पर ad slots register न होने देने वाला यह एक PoC है
  • मौजूदा DNS blockers और VPN routing YouTube ads और मुख्य video के same domain और infrastructure इस्तेमाल करने की वजह से DNS TTL, IP mismatch, 403 errors, ASN leak जैसी सीमाओं से टकराते हैं
  • Squid experiment performance और configuration issues के कारण रोक दिया गया, और बाद में FreeBSD jail में mitmproxy/mitmdump के जरिए TLS traffic decrypt कर JSON और Protobuf responses को सीधे बदलने की approach अपनाई गई
  • Web YouTube में JSON के adPlacements, playerAdParams, pagead URLs आदि हटाए जा सकते थे, लेकिन iOS YouTube app application/x-protobuf response में ad slots और tracking information रखता था, इसलिए Protobuf structure को handle करना पड़ा
  • अंतिम तरीका /pagead/ string के पास field tag को reverse direction में खोजकर 50195462 जैसे tags को target_field_tag - 1 में बदलने वाला linear scan और 1-byte modification है, जो full decoding के बिना real-time processing के लिए उपयुक्त performance देता है

लक्ष्य और शुरुआती network design

  • लक्ष्य FreeBSD और pfSense आधारित router बनाकर Apple TV और iPhone पर pre-roll, mid-roll, end-roll YouTube ads को पूरे network level पर block करना था
  • Apple TV और external internet के बीच man-in-the-middle proxy रखने से HTTPS traffic decrypt किया जा सकता है, और Google द्वारा YouTube ads भरने के लिए इस्तेमाल किए जाने वाले Protocol Buffer data को पढ़ा जा सकता है
  • कई महीनों तक YouTube ad blocking implement करने के बाद YouTube Premium के लिए भुगतान शुरू किया, और बताया कि “कर सकते हैं” और “करना चाहिए” अलग बातें हैं
  • ads और tracking block करने के कारणों में privacy tracking, bandwidth waste, clickbait, cryptojacking बताए गए
    • माना गया कि network traffic का 25–40% ads, tracking scripts, fingerprint.js, googletagmanager.js, Hotjar जैसे real-time analytics loaders हो सकते हैं
    • समझाया गया कि CoinHive.js जैसा crypto-mining JavaScript computer को overheat कर सकता है या उसका दुरुपयोग कर छोटी रकम कमा सकता है

pfSense hardware और basic settings

  • पूरे SMB network को protect करने के लिए VM, Docker image, Raspberry Pi की performance पर्याप्त नहीं है, इसलिए packet routing, decryption और monitoring के लिए dedicated hardware चाहिए माना गया
  • इस्तेमाल किया गया router hardware AES-NI instruction set वाला mini PC, DDR4 RAM, mSATA SSD, और pfSense flashing के लिए USB drive था
    • example configuration J4125 mini PC, 32GiB DDR4 RAM, 128GiB mSATA SSD है
    • 128GB storage logs, SSD wear घटाने, packet capture, NPM और Docker edge cache के लिए पर्याप्त माना गया
  • pfSense installation image लगभग 360MB है, और Etcher AppImage से USB drive पर flash किया जा सकता है
  • पहली setup के बाद AES-NI “Yes (inactive)” दिखा, इसलिए System › Advanced › Miscellaneous में जाकर manually enable किया गया
  • 32GiB RAM का उपयोग करते हुए /var और /tmp को generous RAM disk allocation दिया गया, और 128GiB SSD से wear-leveling की उम्मीद रखते हुए RAM-disk backup हर घंटे चलाने के लिए configure किया गया
  • Dashboard में S.M.A.R.T. widget जोड़ा गया ताकि SSD anomalies detect की जा सकें

DNS blocking, network separation, pfBlockerNG

  • पहले Raspberry Pi पर Pi-hole को DNS-level ad blocker के रूप में इस्तेमाल किया जाता था, और pfSense में pfBlockerNG-devel install कर ads, malicious content blocking और geo-blocking test किया गया
  • अगर pfb_dnsbl service start न हो या status tab में [ Missing CRON task ] दिखे, तो empty file /var/run/booting delete करने की कोशिश करने को कहा गया
  • mini PC के 3 Gigabit ports का उपयोग कर VLAN के बजाय actual networks बनाए गए, और Alexa व Apple TV जैसे “phoning-home” devices को main network से अलग किया गया
    • untrusted devices को 172.31.1.0/24 private network में रखा गया
    • trusted LAN को 192.168/16 पर रखा गया
    • IoT के लिए hardware LAN adblocker से होकर गुजरता है, और 1.1.1.19.9.9.9 जैसे hard-coded DNS queries को intercept कर YouTube को DNS blocker bypass करने से रोकने की कोशिश की गई
  • pfSense के पीछे सभी clients local Unbound DNS server इस्तेमाल करें, इसके लिए NAT rules configure किए गए
    • DNS query interception संभव करने के लिए पहले DNS over TLS block करना होगा माना गया
    • iPhone encrypted DNS traffic blocking के बारे में Privacy Warning दिखा सकता है, लेकिन upstream DNS requests Cloudflare तक encrypted जाती हैं, ऐसा कहा गया
    • NAT reflection disable रखना चाहिए ताकि external internet DNS server तक access न कर सके
  • Non_WAN firewall alias बनाकर WAN को छोड़कर बाकी interfaces की local DNS query port 53 को localhost पर redirect किया गया
  • YouTube ads और मुख्य video same domain से deliver होते हैं, इसलिए pfBlockerNG या Pi-hole जैसे domain-name blockers से केवल ads को filter करना मुश्किल था

VPN bypass experiment और failure points

  • ad blocking के बजाय YouTube ad algorithm को धोखा देकर user को advertisers के लिए कम attractive दिखाने का experiment भी किया गया
    • pfSense router से YouTube location-tracking traffic को VPN के जरिए कम viewers वाले region में route करने की कोशिश की गई
    • लक्ष्य था कि YouTube account पर पहचान “70 वर्षीय पुरुष, Italy निवासी” जैसी बने
  • pfSense में OpenVPN के बजाय WireGuard का उपयोग कर Apple TV का पूरा traffic VPN से भेजने का baseline experiment किया गया
    • FreeBSD WireGuard package install कर tunnel add और enable किया गया
    • NordLynx setup के लिए Linux VM में sudo wg showconf nordlynx से private key की पुष्टि की गई और pfSense में copy की गई
  • test result में laptop पर Google Italian में दिखा, और Apple TV का YouTube भी Italian में बदल गया
    • ads अभी भी कुछ आ रहे थे, लेकिन पहले से कम बताए गए
    • Netflix और Amazon Prime में problems आईं, और लगा कि CSS या font files block हो रही हैं या thumbnails load नहीं हो रहे
    • Apple TV का पूरा traffic VPN से न भेजने की चेतावनी दी गई, और माना गया कि Netflix और Prime VPN provider और geofencing को अच्छी तरह detect करते हैं
  • बाद में Apple TV के सिर्फ YouTube traffic को VPN में भेजने के लिए www.youtube.com, youtube.com, googlevideo.com, accounts.google.com, googleapis.com, gstatic.com आदि targets पर firewall policy rule configure किया गया
    • नतीजतन YouTube user को Milan में मानता है, जबकि Netflix और Prime Video उसे Canada में मानते हैं
    • ads “few and far between” स्तर तक कम हो गए बताए गए
  • एक दिन बाद DNS race condition दिखी
    • pfSense hostname alias default रूप से हर 300 seconds में resolve होता है
    • YouTube DNS TTL 1,440 seconds, यानी 24 minutes हो सकता है
    • अगर Alias Daemon द्वारा resolve किया गया IP और actual client को मिला IP अलग हो जाए, तो policy YouTube traffic को tunnel नहीं कर पाएगी
  • कुछ YouTube videos 403 Forbidden के साथ play नहीं हुए
    • कहा गया कि YouTube हर googlevideo.com request में user का IP embed करता है
    • अगर r5---sn-hpa7kn76.googlevideo.com जैसे transformed domains tunnel न हों, तो request गलत IP से बाहर जाती है और problem होती है
    • जरूरत *.googlevideo.com wildcard tunneling की है, लेकिन NAT और firewall rule wildcard hostname नहीं, बल्कि IP पर काम करते हैं

DNS क्वेरी आधारित IP ट्रैकिंग PoC

  • *.googlevideo.com को VPN के जरिए route करने के लिए Google Video DNS query hijack तरीका सोचा गया
    • तरीका यह था कि DNS query log को समय-समय पर track करके *.googlevideo.com query को alias list में जोड़ा जाए
    • अगर हर video unique और बदले हुए domain का इस्तेमाल करता है, तो हर video पर refresh किए बिना यह तरीका काम नहीं करेगा, ऐसा माना गया
  • नया लक्ष्य Python 3 और pfSense REST API से DNS query को monitor करके IP पकड़ना, response को थोड़ी देर hold करना, फिर IP को VPN tunneling rule में जोड़कर DNS reply को release करना था
  • pfSense REST API install करके https://pfsense/api/v1/firewall/alias पर GET request भेजी गई और VPN_domains alias query किया गया
  • Unbound DNS Resolver के Python module को explore करके DNS-query message log करने में सफलता मिली
    • उस समय Python version 3.8 था
    • Unbound Python module के examples Python 2.4 आधारित थे, इसलिए 2to3 या formatting की जरूरत पड़ सकती है, ऐसा माना गया
  • PoC script DNS response से A/AAAA record IP निकालकर pfSense alias में जोड़ती है
    • A record को ipaddress.IPv4Address(d.rr_data[j][2:]).exploded से process किया गया
    • AAAA record को ipaddress.IPv6Address(d.rr_data[j][2:]).exploded से process किया गया
    • alias TTL 1 घंटे और capacity 500 set की गई
  • अगले दिन Unbound DNS Resolver segfault हो गया, और हर बार IP जोड़ने पर pfSense rule reload करना पड़ता था, जिससे pfSense बहुत slow हो गया

Squid से mitmproxy पर स्विच

  • नया लक्ष्य Squid-परिवार के proxy को research और install करना, trusted fake CA certificate बनाना, फिर TLS traffic को decrypt करने की दिशा में बदल गया
  • Squid experiment में pfSense package के रूप में मिलने वाले squid3 proxy को test किया गया कि क्या वह requirements पूरी करता है
    • /squid_cache के लिए dedicated folder बनाया गया और cache size 8GiB set की गई
    • Transparent HTTPS support की उम्मीद थी
  • Squid और SquidGuard को एक दिन configure करने के बाद छोड़ दिया गया
    • speed बहुत slow थी
    • ACL setup झंझट वाला था
    • https://http/* से जुड़ा issue था
    • SquidGuard URL filter list update में बहुत ज्यादा समय लग रहा था
    • Squid UI पर्याप्त नहीं था
  • इसके बाद Python में लिखे mitmproxy का इस्तेमाल करने का फैसला हुआ
    • Python hook extensibility और UI की वजह से SSLSplit की जगह mitmproxy चुना गया
    • pfSense का FreeBSD version 12.2-Stable, 64-bit build था
  • pfSense default environment में jail disabled था, इसलिए ezjail manually install करके mitmproxy के लिए jail बनाया गया
    • ezjail-admin create mitmproxy 'lo0|127.0.1.1' से jail बनाया गया
    • transparent proxy mode के लिए allow.raw_sockets=1 set किया गया
    • कहा गया कि raw socket blocked हो तो Transparent mode failure या Cannot open connection, no hostname given. जैसे errors आ सकते हैं
  • Linux tarball binary चलाना FreeBSD पर fail हुआ
    • ELF interpreter /lib64/ld-linux-x86-64.so.2 not found आया
    • libdl.so.2, libz.so.1, libpthread.so.0, libc.so.6 भी नहीं मिले
  • jail के अंदर pkg install mitmproxy चलाया गया, और installation के लिए 50 packages, 206MiB extra space, और 33MiB download की जरूरत पड़ी
  • MITMProxy को LAN से accessible बनाने के लिए 127.0.1.1 virtual IP को localhost से जोड़ा गया, और NAT rule से [Private IPs]:8080 को temporary तौर पर 127.0.1.1:8080 पर forward किया गया
  • MITMProxy द्वारा auto-generated CA PEM file ~/.mitmproxy/mitmproxy-ca-cert.pem है, और इस CA cert को test device के Trusted Root Store में install किया गया
  • mitmproxy idle state में भी काफी CPU इस्तेमाल कर रहा था, और माना गया कि per-request TLS certificate की real-time generation और excessive logging speed को काफी slow कर रहे हैं
    • mitmdump UI और excessive logging छोड़ देता है, इसलिए CPU load कम होगा, ऐसा माना गया

Web YouTube JSON ads हटाना

  • Certificate Pinning ऐसी technique है जिसमें server या client expected certificate fingerprint पहले से जानता है, इसलिए MITMProxy certificate forgery काम नहीं करती
  • problematic host को --ignore-hosts option से proxy bypass कराया जा सकता है
    • उदाहरण के तौर पर apple.com:443, icloud.com:443 को ignore किया गया
  • YouTube access के दौरान page ads unencrypted header के साथ MITMProxy में दिखे, और simple regex blocking की संभावना पर विचार किया गया
  • YouTube ad blocking script apply करने के लिए mitmdump में --scripts "youtube.py" जोड़ा गया
  • smoke-test filter URL substring के आधार पर ad requests block करता है
    • youtube.com: /pagead/, /log_event?, /stats/ads, /stats/qoe?, /ptracking?, /generate_204, el=adunit, adformat=, /activeview?
    • google.com, google.ca: /pagead/
    • ggpht.com: .
  • जिन requests को block करना था, वे MITMProxy और DevTools Network panel में सचमुच blocked दिखीं, लेकिन ads फिर भी दिखते रहे और कभी-कभी ads अपने-आप skip हो गए या playback fail हुआ
  • बाद में JSON payload के अंदर ad-related URLs की बड़ी संख्या मिली
  • YouTube UI और HTTP workflow को cookies और service workers तक analyze करने के बाद कहा गया कि pre-roll, post-roll, mid-video ads सभी हटाना संभव हो गया
  • इस stage पर router से YouTube web ads के JSON payload में से ads हटाए जा सकते थे

iOS YouTube और Protobuf समस्या

  • YouTube iOS app, web version जैसे API call के Protobuf version में बहुत मिलते-जुलते data दिखाता है
  • Protobuf में key numeric होती है और बदल भी सकती है, इसलिए JSONPath से advertisement section ढूंढने का तरीका इस्तेमाल नहीं किया जा सकता
  • YouTube आगे दिखाए जाने वाले ads की एक बड़ी list payload में भेजता है, और कहा जाता है कि जब वह list खत्म हो जाती है तो जल्द ही एक और बड़ी list आ जाती है
  • Protobuf payload में “Telus,” “Samsung TV,” “Boxing Week,” “Buy now” जैसे strings दिखे
  • iOS YouTube protocol, web traffic से अलग था
    • web version में URL और range query parameter देखकर ad video और desired video को कुछ हद तक अलग किया जा सकता था
    • iOS protocol range query parameter या Range header का इस्तेमाल नहीं करता, और video chunk में &nr=2, &nr=3 जैसे counter इस्तेमाल करता है
    • iOS ad blocking के लिए Protobuf response को reverse-engineer करना जरूरी था
  • decoded Protobuf message में has_unlimited_entitlement: False, has_premium_lite_entitlement: False entries मिलीं, लेकिन इन्हें toggle करने के बजाय heuristics पर वापस लौटे
  • करीब 500KiB raw Protobuf को Python pure implementation से decode करना बहुत धीमा था
    • i7-6700 desktop पर Python result करीब 2.06~2.11 seconds था
    • pfSense router पर Python result करीब 22.8~24.2 seconds था
    • C++ protoc --decode_raw desktop पर करीब 0.017~0.022 seconds था, और pfSense router पर करीब 0.12~0.14 seconds था

Protobuf decoding और schema extraction की कोशिश

  • Python में raw Protobuf decoding supported नहीं होने के कारण C++ libprotobuf.so को सीधे इस्तेमाल करने के बजाय subprocess.Popen के जरिए C++ protoc binary से communicate करने का तरीका चुना गया
  • ad video response को fuzz करते हुए empty 200, 404, 503, truncated response body, ad video के कुछ हिस्सों को null करना आदि आजमाया गया, लेकिन iOS app धीमा होने के बाद crash हो गया या ad screen पर अटक गया
  • URL blocking से app की प्रतिक्रिया trigger हुई, और video response chunk में session metadata भी मौजूद था
  • Burp Suite के लिए blackboxprotobuf raw Protobuf wire message को decode करने, content inject करने और फिर encode करके Protobuf endpoint behavior verify करने देता है
    • PyPI fork नहीं, बल्कि original Burp Suite version इस्तेमाल करने को कहा गया है
    • कुछ forks में deep recursion के कारण stack overflow या infinite recursion की समस्या है
    • C++ bindings इस्तेमाल करने पर करीब 500KiB raw Protobuf को कुछ seconds में transcode किया जा सकता है
  • Generated schema perfect नहीं था और बड़ा व गहराई तक nested था, और pretty-print धीमा था, लेकिन ad details ढूंढने के लिए पर्याप्त था
  • Android YouTube APK से असली .proto या schema file extract करने के लिए PBTK, Apktool, dex2jar, Java Decompiler आजमाए गए
    • PBTK ने सिर्फ 59-byte proto file extract की
    • Java में Protobuf classes और getter/setter थे, लेकिन true schema files नहीं मिल सके, इसलिए काम रोक दिया गया

अंतिम turning point: Protobuf field tag में 1 byte change

  • decrypted network traffic और Protobuf fuzzing के नतीजों से observed हुआ कि ads किसी खास video के slots में registered होते हैं
    • slot types में pre-roll, mid-roll, end-roll, full-page, ad pods शामिल हैं
    • ad URL block करने पर “कोई non-existent ad ने slot reserve कर लिया” जैसी error आती है और UI panic होता है
  • मूल schema के बिना decode, edit, re-encode करने पर modified encoding निकलती है; ZigZag इस्तेमाल हुआ है या नहीं, या int32, int64, sint32/64, varint जैसे numeric types कौन से हैं, यह पता नहीं चलता, और object field order भी आम तौर पर nondeterministic होता है, इसलिए इसे problematic माना गया
  • Protobuf की backward compatibility और UnknownFieldSet behavior में bypass की संभावना मिली
    • जब added field वाला message old software पढ़ता है, तो unknown field हो सकता है
    • किसी specific field key को दूसरे value में बदलने पर ads और tracking information वाली पूरी sub-structure unavailable state में जा सकती है, ऐसा माना गया
  • उदाहरण के तौर पर field key 49399797 को 49399796 में बदलकर उस ad/tracking sub-structure को unknown field जैसा बनाने का idea पेश किया गया
  • field key 49399797 simple hex search से नहीं मिलती, और varint/tag encoding को ध्यान में रखना पड़ता है
    • wire type 2 है, जिसका मतलब length-delimited nested string/message है
    • target field key 49399797 का tag byte sequence AA FF B8 BC 01 बनता है
    • 395198378 >> 3 से wire type के 3 bits हटाने पर original field key 49399797 मिलती है
  • Protobuf bytes में /pagead/ जैसी classic ad URL signature खोजकर field search range तय की गई, और वहां से पीछे जाकर बदलने वाला field tag और field key ढूंढे गए
  • example intercept log में youtubei.googleapis.com:443/youtubei/v1/browse?key=... POST request के 1.87MiB application/x-protobuf response में key 49399797 position 4465 पर, और key 50195462 position 4477 पर मिली
  • O(n) smoke test में 1.8MiB Protobuf data को extra memory के बिना एक बार scan किया गया
    • target 1.8MiB में 30,593वें byte पर मिला
    • करीब 600 bytes backtracking से denature करने वाला field key मिला
  • जब यह तरीका काम करने लगा, तो अब *.googleadservices.com या /pagead/ वाली URL को block करने की जरूरत नहीं रही, और वह request शुरू में ही generate नहीं होती

MITMProxy add-on script की संरचना

  • MITMProxy add-on script को networked Apple device पर YouTube ads block करने के proof of concept के रूप में दिया गया है
    • फ़ाइल का नाम youtube.py है
    • चलाने का उदाहरण: mitmdump --listen-port 8080 --listen-host 127.0.0.1 -s "youtube.py"
    • FreeBSD prerequisites हैं pkg install protobuf, pkg install py38-pip, pip install jsonpath-ng
  • script में content creators को support करने के लिए ads को 5% allow करने वाला fairness function शामिल है
    • in_allowed_ads_window() मौजूदा समय हर घंटे के 0वें मिनट से 2वें मिनट के बीच हो तो ad blocking skip कर देता है
  • YouTubeAdBlocker YouTube से जुड़े domains को intercept करता है और JSON या Protobuf response में बदलाव करके ad information हटाता है
    • intercept target host regex है \.youtube\.com|google\.(com|ca)|googleapis\.com|googleadservices\.com|googlevideo\.com
    • Protobuf ad detection string है b"/pagead/"
    • search limit 80_000 bytes है
    • target field tag 50195462 है
  • request stage blocklist में YouTube host के pagead/, log_event?, stats/ads, stats/qoe?, ptracking?, generate_204, error_204, adformat=, activeview?, _ad_, ai?, sw.js आदि शामिल हैं
  • web YouTube के लिए JSON replacement ad-related fields को हटाता या disable करता है
    • yt_ad को "0" में बदलता है
    • adPlacements को [] में बदलता है
    • adPlacementRenderer, adPlacementConfig, playerAdParams, gutParams को {} में बदलता है
    • adVideoId को "" में बदलता है
    • showCompanion, showInstream, useGut को False में बदलता है
  • load() hook HTTP/2 को disable करता है और anticomp=True, mode="transparent" सेट करता है
  • running() hook allow_hosts को update करता है ताकि intercept केवल YouTube-related domains पर लागू हो
  • response() hook अगर content-type में protobuf हो, तो response body के पहले 80,000 bytes में /pagead/ ढूंढता है
    • मिलने पर TagBytes(self.target_field_tag, WIRETYPE_LENGTH_DELIMITED) से target tag bytes बनाता है
    • target_field_tag - 1 के tag bytes को नए bytes के रूप में बनाता है
    • /pagead/ position से पहले reverse search करके target tag ढूंढता है
    • उस position के bytes को target_field_tag - 1 से संबंधित bytes से replace करता है
    • modified Protobuf content को flow.response.set_content(bytes(body)) से वापस डालता है
  • code comments बताते हैं कि यह PoC पहले ही 90% ads block कर देता है, और यह भी जोड़ते हैं कि दूसरे sections में भी अलग field key हो सकती हैं और कई ad sections हो सकते हैं जिन्हें neutralize करना पड़ेगा

Performance, सीमाएं, target users

  • final technique Protobuf के उस feature का उपयोग करती है जो schema change के लिए backward-compatible रहने हेतु unknown fields को allow करता है, साथ ही compact format की single-byte edit sensitivity का फायदा उठाती है
  • critical spot पर 1 byte बदलकर deeply nested section को future schema version का हिस्सा जैसा दिखाया जाए, तो Protobuf उसे ignore कर सकता है और ad information हट सकती है
  • Google एक बड़ा Protobuf response लौटाता है जिसमें iOS app layout तक शामिल होता है, और example payload 1.8MiB है
  • पूरे payload को parse करने के लिए C++/Swift जैसे native code की जरूरत होती है, और कहा गया है कि Python decoding कई गुना धीमी है जिससे connection timeout होता है
  • web-based JSON में पूरे payload को parse, edit और re-serialize करना पड़ता है, लेकिन Protobuf technique केवल linear scan और तेज backtrack करती है, इसलिए यह microseconds में process हो जाती है, real-time adblocking के लिए उपयुक्त है और blocklist की जरूरत नहीं पड़ती
  • Apple device के सभी *.googleadservices.com और /pagead/* URLs Protobuf payload से आते हैं, और payload से ad data गायब हो जाए तो ये requests भी अपने आप गायब हो जाते हैं
  • YouTube app ad URL fetch करने की कोशिश नहीं करता, इसलिए अनुभव तेज लगता है, और ads video slot में register नहीं होते इसलिए content सीधे play होता है
  • इस तरीके को Apple-device YouTube ads या Instagram, WhatsApp, Facebook tracker traffic block करने के लिए highly specialized technique के रूप में पेश किया गया है
  • कहा गया है कि HTTPS traffic को decrypt/re-encrypt करने की CPU requirement Raspberry Pi की performance से काफी ज्यादा है
  • चूंकि यह उन Apple-device owners को target करता है जो OS compromise नहीं करना चाहते, इसलिए user base और भी narrow माना गया है

YouTube Premium और ad cost experiment

  • YouTube Premium की कीमत CAD $9.99/mo या CAD $11.99/mo है और tax सहित लगभग CAD $13.43/mo पड़ती है, इसलिए यह reasonable है या नहीं, इसे लेकर अनिश्चितता जताई गई है
  • एक clean laptop और private browsing के साथ एक दिन तक YouTube को बीच-बीच में देखने का ad impression experiment किया गया
    • watch history में “देखे गए” videos सिर्फ 10 थे
    • 10 videos के कुछ हिस्से देखते समय 8 ads दिखे
    • skippable ads सिर्फ 2 थे और दोनों skip किए गए
  • rough CPV को USD $0.15 मानें तो एक दिन के 8 ads का advertiser cost 8 x $0.15 = $1.20 है, और इसे महीने पर extrapolate करें तो लगभग USD $36/mo होता है
  • Statista data के आधार पर US ad spend को total views से divide करने वाली calculation भी पेश की गई
    • 2019 में US advertisers ने YouTube पर $15.1 billion खर्च किए
    • कहा गया कि US residents ने 916 billion videos देखे
    • average $15.1B / 916B = USD $0.0165 per view है
    • author के मामले में इसे प्रति दिन लगभग USD $0.13 और प्रति माह लगभग USD $3.96 के advertiser cost के बराबर calculate किया गया
  • ad experiment के दौरान hardware mute किया गया था और अक्सर नजरें हटाई गईं, इसलिए author ने माना कि उन पर खर्च हुआ ad budget waste हुआ
  • फिर भी वे creators को support करना चाहते हैं, और Google उनके बारे में क्या track करता है इसे लगातार monitor करते हुए 3 महीने का Premium trial आजमाने की बात कहते हैं
  • वे चिंता जताते हैं कि DMCA claim दर्ज होते ही सारी ad revenue creator के बजाय claimant को जा सकती है, और जोड़ते हैं कि कई creators का Patreon पर जाना हैरान करने वाला नहीं है

अंतिम summary

  • hardware router को शुरू से setup किया और LAN को trusted/untrusted zones में अलग किया
  • traditional DNS ad blocking setup किया
  • transparent MITM proxy जोड़ा
  • अंततः network से जुड़े Apple devices पर YouTube ads को अच्छी performance के साथ block कर सके, ऐसा बताया गया
  • वे लिखते हैं कि मुश्किल हिस्सा खत्म हो चुका है, इसलिए YouTube Premium payment पर विचार करेंगे, लेकिन trackers अब भी मजबूती से block रहेंगे

1 टिप्पणियां

 
GN⁺ 2025-03-19
Hacker News की राय
  • यह Protobuf फॉर्मैट की खामी से ज़्यादा ऐसा लगता है कि लेखक ने field number को किसी बड़े, इस्तेमाल न हो रहे number में बदल दिया है
    तरीका यह है कि Protobuf bytes में /pagead/ जैसे ad URL signatures खोजकर field range पकड़ी जाती है, फिर वहां से पीछे जाकर target field tag और field key ढूंढकर उसे निष्क्रिय किया जाता है; यह किसी खामी की बजाय intended behavior के ज़्यादा करीब है
    अगर tag ढूंढने जितनी मेहनत करनी ही है, तो उसके पास वाली varint length पढ़कर उन bytes को skip करना भी बहुत बड़ा अतिरिक्त काम नहीं है। buffer copy करना पड़ेगा या bytes खिसकाने पड़ेंगे, लेकिन PoC script में भी mitmproxy API से लौटे bytes immutable हैं, इसलिए copy तो वैसे भी करनी पड़ती है

    • protocol level पर यह expected तरीके से काम करता है, लेकिन ad data structure में unknown field आने पर Google का error न देना और उसे ऐसा treat करना जैसे ad ही नहीं है, यही loophole लगता है
      Google protocol को इस तरह बदलने से पहले, जिससे पुराने app versions में ads बिल्कुल न दिखें, नया app पहले deploy करेगा; इसलिए basic certificate pinning या ad info extract करने में failure पर decoding को कम उदार बनाना ही इस blocking method को तुरंत रोकने के लिए काफी होगा। YouTube team शायद इस हिस्से को defect मानेगी
    • bytes object immutable है, लेकिन bytearray object immutable नहीं है
  • एक छोटे C++/Go proxy से भी यही काम काफी कम overhead में किया जा सकता है। इतनी well-defined task के लिए mitmproxy से जूझने की तुलना में यह ज़्यादा stable और कम मेहनत वाला होगा
    अगर सारा traffic proxy से भेजेंगे तो SNI interception इस्तेमाल करने पर भी performance घटेगी। pfSense के साथ भी यही है; एक simple Linux server और basic iptables rules से pfSense की abstraction layers से लड़ाई किए बिना काम हो सकता है
    reverse-engineered proto fields में से जितनी ज़रूरत हो उतनी .proto file में लिखकर code auto-generate करें और flag बदल दें। यह Python implementation से सस्ता है और proto बदलने पर update करना भी आसान है। unknown field tags को ignore करना Protobuf की एक अहम feature है, और existing deployments तोड़े बिना compatible schema changes संभव बनाती है

    • YouTube experience को जानबूझकर धीमा बनाना और videos के बीच switching को भी सुस्त रखना शायद बेहतर हो सकता है। खासकर Shorts की लत काफी कम हो सकती है
    • ऐसा करने का तरीका detail में share करने वाली blog post का इंतज़ार रहेगा
    • अच्छा होगा अगर आप खुद एक guide लिखें कि inefficiency कहां है और simpler software से उसे कैसे कम किया जा सकता है
      लगता है लेखक comments में उठे कई points से पहले से वाकिफ था, और article भी काफी thorough है। उसने Python और C++ में benchmarks किए और final implementation तो Protobuf decoding तक नहीं करता। कई mitm solutions भी आज़माए, और pfSense को simple security router के तौर पर नहीं बल्कि VLAN और VPN के साथ सिर्फ Apple TV traffic को target करने के लिए इस्तेमाल कर रहा है
      यह comment बहुत सस्ता और नीचा दिखाने वाला लग रहा है। original post ऐसी नहीं है, इसलिए अगर ऐसा कहना है तो community के लिए खुद prove करना चाहिए
    • क्या कोई lightweight proxy recommend कर सकता है जो macOS पर चले और घर के दूसरे devices को भी service दे सके?
  • अगर YouTube Premium के लिए pay करें तो क्या creators को support मिलता है? अगर हां, तो Patreon जैसे direct support की तुलना में कितना?

    • Patreon की तुलना में ज़्यादा नहीं होगा, लेकिन कई YouTubers देखते हों तो यह उम्मीद करना भी मुश्किल है कि सबके Patreon subscribe किए जाएं
      एक YouTube Premium subscription से individual creator को मिलने वाली income बहुत मामूली होगी, लेकिन ad blocker के साथ video देखने से तो बेहतर ही है
    • माना जाता है कि regular ad-view से मिलने वाली view की तुलना में YouTube Premium views से creator को बड़ा share मिलता है। क्योंकि ad skip कर देने पर revenue नहीं होता। हालांकि Premium users कम हैं, इसलिए अब भी limits हैं
    • recent जानकारी कम है, लेकिन जब इसे पहली बार Youtube Red के रूप में launch किया गया था, तब यह आम तौर पर per-view ad revenue से काफी ज़्यादा था
    • ads से ज़्यादा और Patreon से कम
      यह ad impressions पर नहीं बल्कि watch time पर आधारित है, इसलिए long-form content बनाने वाले creators को ज़्यादा फायदा होता है
  • मेरी girlfriend के YouTube account पर अजीब तरह से किसी भी device में login करने पर ads नहीं आते। Apple TV भी शामिल है, Premium नहीं है और कभी Premium रहा भी नहीं
    जानना चाहता हूं कि internally कौन-सा flag set है जिससे ads बंद हैं

    • account username और email DM कर दें, मैं check करके ठीक कर सकता हूं
    • आपकी girlfriend शायद ads के control group में आ गई है। इसे ads देखने वाले लोगों के behavior से compare करके यह समझने में इस्तेमाल किया जा सकता है कि ads users पर क्या असर डालते हैं
    • यह holdback experiment में भी हो सकता है। ads चलाने जैसी feature metrics पर क्या असर डालती है, यह देखने के लिए कुछ users को holdback group में रखना common है, और Google में काम करते समय मैंने भी ऐसे experiments किए थे
    • बहुत पहले Google Music subscription होने पर YouTube ads बंद हो जाते थे। service बंद होने या subscription cancel करने के बाद भी 6 महीने से ज़्यादा समय तक YouTube ads वापस नहीं आए
      तभी जाकर लगा कि लोग शिकायत क्यों करते हैं, अब समझ आया
    • Twitch पर मुझे यही experience हो रहा है
      मैं ad blocker इस्तेमाल नहीं करता, फिर भी login करते ही website और mobile app, कहीं भी ads नहीं आते। Twitch Turbo भी नहीं है और Amazon Prime भी अब नहीं है। दूसरी Turbo benefits भी नहीं हैं, इसलिए पूरी तरह Turbo के रूप में flagged भी नहीं हूं
      पता नहीं पहले bug bounty करते समय इधर-उधर छेड़छाड़ करते हुए account profile गलती से टूट गया था या नहीं, लेकिन अगर वे यह benefit बनाए रखते हैं तो मैं और detail भी दे सकता हूं
      अजीब बात यह है कि मुझे याद है, पहले hospital में दवाओं के असर में दर्द से बेहाल सिर्फ TV देखना चाहता था, लेकिन Twitch ads इतने ज़्यादा थे कि लगभग breakdown हो गया था। फिर 1–2 साल बाद अचानक एहसास हुआ कि मैंने कई सालों से ads देखे ही नहीं
      शायद कोई बहुत पुराना, भुला दिया गया ad-free A/B test है और उसे साफ करने लायक नहीं समझा गया, इसलिए बचा हुआ है। इसकी वजह से सालों से फायदा मिला और मैंने Twitch को किसी भी दूसरे platform से ज़्यादा देखा। UK में Twitch Turbo £12/month है, करीब $15.50, यानी global स्तर पर भी महंगा है, और US व Europe के $12/€12 की तुलना में काफी खराब deal है
  • Apple TV और बाहरी इंटरनेट के बीच man-in-the-middle proxy रखने पर HTTPS traffic को decrypt किया जा सकता है, यह काफ़ी चौंकाने वाला था
    आम तौर पर मुझे लगा था कि यह काम नहीं करना चाहिए, लेकिन बाद में यह जानकर फिर अलग तरह से हैरानी हुई कि Apple TV के certificate store में CA जोड़ा जा सकता है। पूरे stack को टटोलता हुआ काफ़ी बारीक लेख था

    • Apple certificate जोड़ने का समर्थन क्यों करता है, इसका अंदाज़ा लगाएँ तो संभवतः इसलिए कि enterprise या education environments में Apple TV को AirPlay box की तरह इस्तेमाल करते समय IT और device management requirements से मेल बैठाया जा सके
      उदाहरण के लिए, university में Wi‑Fi से device जोड़ने के लिए MAC address को allowlist में डालना या certificate install करना पड़ता था
    • Google YouTube app में SSL certificate पर sign करने वाली CA की जाँच भर करके इस तरीके को आसानी से रोक सकता है
      हालांकि ऐसा करने पर कई enterprise environments में YouTube टूट सकता है, इसलिए पता नहीं वे सच में करेंगे या नहीं। फिर भी, अफ़सोस की बात है कि इसे रोकना बहुत आसान है
    • Apple TV में CA जोड़ पाना मैंने सोचा नहीं था। शायद इसलिए नहीं पता था क्योंकि मैंने कभी Apple TV से ऐसे resources access नहीं किए जिनकी valid certificate chain न हो
    • ज़्यादातर devices CA जोड़ने की अनुमति देते हैं, लेकिन आजकल लगभग सभी apps certificate pinning इस्तेमाल करते हैं और system certificate store को ignore कर देते हैं। YouTube ऐसा नहीं करता, यह बहुत हैरान करने वाला है
    • विडंबना यह है कि Android TV कम-से-कम 7.x version में इसकी अनुमति नहीं देता। untrusted Let's Encrypt certificate को bypass करने की कोशिश में यह बात मुश्किल से पता चली
  • Apple TV पर इसे कुछ बार implement करने की कोशिश की, लेकिन बिल्कुल सफल नहीं हुआ। लगता है YouTube ने अब app में certificate pinning डाल दी है या कुछ ऐसा। जानना चाहूँगा कि हाल में किसी ने इसे चालू करवाया है या नहीं

    • अगर समय लगाने को तैयार हैं, तो Frida [0] में खोजबीन कर सकते हैं। pinned certificate भी समस्या नहीं है
      [0] https://frida.re/docs/home/
  • जिन घटिया online services को इस्तेमाल करने पर मजबूर किया जाता है, उन्हें पूरे network पर block करने की हर कोशिश मुझे पसंद है
    ad blocking भी अच्छी है, लेकिन काश YouTube Shorts या Instagram Reels जैसी aggressive infinite scroll चीज़ों को पूरे network पर आसानी से और ज़्यादा तरीकों से रोका जा सकता
    Instagram पर मैं बस जिन लोगों को follow करता हूँ उनकी posts और stories देखना चाहता हूँ, ध्यान खींचने के लिए design किए गए बेवकूफ़ाना videos recommend न हों। यह शायद मेरी इच्छाशक्ति की कमी दिखाता हो, लेकिन अक्सर कुछ देख ही लेता हूँ और ज़िंदगी के 15 मिनट गंवा देता हूँ

    • इस्तेमाल करना मजबूरी नहीं है। इस्तेमाल न करें, या पैसे दे सकते हैं
      Internet users ने आम तौर पर पैसे न देने वाला विकल्प चुना है, इसलिए कोई न कोई लागत उठाता है। कुल मिलाकर internet users उन लोगों को reward नहीं करते जो ads नहीं दिखाते। वे content चाहते हैं, लेकिन आम तौर पर free में चाहते हैं
    • app हटाएँ, webpage इस्तेमाल करें, और ऐसा browser इस्तेमाल करें जो user scripts allow करता हो
      मुझे एक script मिली जो Instagram page को बस image tags जैसा बना देती है ताकि केवल photos देखी जा सकें: https://greasyfork.org/en/scripts/5014-un-instagram
    • मुझे लगता है ये tactics हमारी प्राकृतिक curiosity और उसके आसपास की aesthetics का फायदा उठाती हैं
      इसलिए यह इच्छाशक्ति की कमी से ज़्यादा उस numbness जैसी लगती है जो हमने विकसित कर ली है, और यह काफ़ी बुरा है। platform हमें इस्तेमाल करे, इसके बजाय हम platform का इस्तेमाल करें—इस दिशा में की गई मेहनत और creativity सम्मान के योग्य है
    • parent के रूप में यह बात खास तौर पर relatable है। बच्चों को algorithm में फँसते देखना मुश्किल है
      बच्चों से नियमित बात करता हूँ, और वे भी मानते हैं कि यह नुकसानदेह है, लेकिन resist करना उनके लिए बहुत कठिन है। मैं खुद भी कभी-कभी doomscrolling में खिंच जाता हूँ
      जहाँ संभव था वहाँ Pi-hole से ad filtering set की है, लेकिन पूरा YouTube block नहीं करना चाहता। फिर भी family को protect करने के लिए आगे इसे गंभीरता से consider करना पड़ सकता है
    • Instagram की infinite scroll रोकने के लिए यह app बहुत अच्छी रही: https://www.distractionfreeapps.com/index.html
  • engineering अच्छी है, लेकिन यह थोड़ा दुखद है कि अपने hardware या software को कुछ हद तक भी अपना जैसा इस्तेमाल करने के लिए इतना सब करना पड़ता है

    • इस मामले में device आपका है। लेकिन YouTube या उसके content तक आपका ownership claim करने का कोई आधार नहीं दिखता
    • 30 डॉलर के Android box पर NewPipe APK डाल दें, तो यह काम लगभग 10 साल पहले से संभव था
  • YouTube पर ads होते हैं? browser इतना अच्छा block कर देता है कि पता ही नहीं था
    असली समस्या यह है कि Apple TV experience आम web browser experience से कहीं खराब है। Apple ने hardware को इतना lock down कर रखा है कि यह पैसे देकर खरीदने वाले end consumer की तुलना में YouTube की ad revenue में ज़्यादा मदद करने वाली संरचना बन जाती है

    • Linux, Windows, Android पर मुझे ads बिल्कुल नहीं दिखते। कभी-कभी iPad पर YouTube देखने की कोशिश करता हूँ तो हैरानी होती है कि ads कितने बार-बार और परेशान करने वाले हैं
      घर के Pi-hole network से बाहर iPad पर web देखने पर भी यही होता है। समझ नहीं आता लोग इसे रोज़ कैसे झेलते हैं
      iPad work-issued device है, इसलिए personal use में ज़्यादा नहीं इस्तेमाल करता, लेकिन जब भी करता हूँ, याद आ जाता है कि यह कितना irritate करता है
      अजीब बात है कि iPad मिलने से पहले लगा था कि यह सिर्फ content consumption के लिए उपयोगी होगा, लेकिन असल में यह work resources को जल्दी remote access करने में बहुत convenient है, और normal web browsing तथा streaming media में ads से ढकी हुई wasteland में फँसा हुआ device है
  • अगर ad-free YouTube चाहिए तो https://yewtu.be या कोई दूसरा Invidious instance https://docs.invidious.io/instances/ इस्तेमाल कर सकते हैं
    YouTube और Invidious के बीच arms race है, और कभी-कभी Invidious काम नहीं करता, लेकिन team हमेशा YouTube को bypass करके बिना ads के videos deliver करने के नए तरीके ढूँढती रही है

    • title में “on AppleTV” होने की एक वजह है। alternative clients या frontends वहाँ काम नहीं करते
    • Roku TV जैसी जगहों पर browser नहीं होता, इसलिए यह तरीका काम नहीं करता