- 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,pageadURLs आदि हटाए जा सकते थे, लेकिन iOS YouTube appapplication/x-protobufresponse में 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/bootingdelete करने की कोशिश करने को कहा गया - mini PC के 3 Gigabit ports का उपयोग कर VLAN के बजाय actual networks बनाए गए, और Alexa व Apple TV जैसे “phoning-home” devices को main network से अलग किया गया
- untrusted devices को
172.31.1.0/24private network में रखा गया - trusted LAN को
192.168/16पर रखा गया - IoT के लिए hardware LAN adblocker से होकर गुजरता है, और
1.1.1.1・9.9.9.9जैसे hard-coded DNS queries को intercept कर YouTube को DNS blocker bypass करने से रोकने की कोशिश की गई
- untrusted devices को
- 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_WANfirewall 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.comrequest में user का IP embed करता है - अगर
r5---sn-hpa7kn76.googlevideo.comजैसे transformed domains tunnel न हों, तो request गलत IP से बाहर जाती है और problem होती है - जरूरत
*.googlevideo.comwildcard tunneling की है, लेकिन NAT और firewall rule wildcard hostname नहीं, बल्कि IP पर काम करते हैं
- कहा गया कि YouTube हर
DNS क्वेरी आधारित IP ट्रैकिंग PoC
*.googlevideo.comको VPN के जरिए route करने के लिए Google Video DNS query hijack तरीका सोचा गया- तरीका यह था कि DNS query log को समय-समय पर track करके
*.googlevideo.comquery को alias list में जोड़ा जाए - अगर हर video unique और बदले हुए domain का इस्तेमाल करता है, तो हर video पर refresh किए बिना यह तरीका काम नहीं करेगा, ऐसा माना गया
- तरीका यह था कि DNS query log को समय-समय पर track करके
- नया लक्ष्य 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_domainsalias 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 की गई
- A record को
- अगले दिन 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 के रूप में मिलने वाले
squid3proxy को 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 था
- Python hook extensibility और UI की वजह से
- pfSense default environment में jail disabled था, इसलिए
ezjailmanually install करकेmitmproxyके लिए jail बनाया गयाezjail-admin create mitmproxy 'lo0|127.0.1.1'से jail बनाया गया- transparent proxy mode के लिए
allow.raw_sockets=1set किया गया - कहा गया कि 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.1virtual 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 किया गया mitmproxyidle state में भी काफी CPU इस्तेमाल कर रहा था, और माना गया कि per-request TLS certificate की real-time generation और excessive logging speed को काफी slow कर रहे हैंmitmdumpUI और excessive logging छोड़ देता है, इसलिए CPU load कम होगा, ऐसा माना गया
Web YouTube JSON ads हटाना
- Certificate Pinning ऐसी technique है जिसमें server या client expected certificate fingerprint पहले से जानता है, इसलिए MITMProxy certificate forgery काम नहीं करती
- problematic host को
--ignore-hostsoption से 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 की बड़ी संख्या मिली
playerAdsऔरplaybackTrackingsections शामिल थेyoutubeRemarketingUrlमेंhttps://www.youtube.com/pagead/viewthroughconversion/...थाgoogleRemarketingUrlमेंhttps://www.google.com/pagead/1p-user-list/...था
- 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 और
rangequery parameter देखकर ad video और desired video को कुछ हद तक अलग किया जा सकता था - iOS protocol
rangequery parameter याRangeheader का इस्तेमाल नहीं करता, और video chunk में&nr=2,&nr=3जैसे counter इस्तेमाल करता है - iOS ad blocking के लिए Protobuf response को reverse-engineer करना जरूरी था
- web version में URL और
- decoded Protobuf message में
has_unlimited_entitlement: False,has_premium_lite_entitlement: Falseentries मिलीं, लेकिन इन्हें 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_rawdesktop पर करीब 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++protocbinary से 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
49399797simple hex search से नहीं मिलती, और varint/tag encoding को ध्यान में रखना पड़ता है- wire type
2है, जिसका मतलब length-delimited nested string/message है - target field key
49399797का tag byte sequenceAA FF B8 BC 01बनता है 395198378 >> 3से wire type के 3 bits हटाने पर original field key49399797मिलती है
- wire type
- 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.87MiBapplication/x-protobufresponse में key49399797position4465पर, और key50195462position4477पर मिली - 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 कर देता है
YouTubeAdBlockerYouTube से जुड़े 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_000bytes है - target field tag
50195462है
- intercept target host regex है
- 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()hookallow_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 टिप्पणियां
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 से लौटे
bytesimmutable हैं, इसलिए copy तो वैसे भी करनी पड़ती हैGoogle protocol को इस तरह बदलने से पहले, जिससे पुराने app versions में ads बिल्कुल न दिखें, नया app पहले deploy करेगा; इसलिए basic certificate pinning या ad info extract करने में failure पर decoding को कम उदार बनाना ही इस blocking method को तुरंत रोकने के लिए काफी होगा। YouTube team शायद इस हिस्से को defect मानेगी
bytesobject immutable है, लेकिनbytearrayobject 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 में से जितनी ज़रूरत हो उतनी
.protofile में लिखकर code auto-generate करें और flag बदल दें। यह Python implementation से सस्ता है और proto बदलने पर update करना भी आसान है। unknown field tags को ignore करना Protobuf की एक अहम feature है, और existing deployments तोड़े बिना compatible schema changes संभव बनाती हैलगता है लेखक 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 करना चाहिए
अगर YouTube Premium के लिए pay करें तो क्या creators को support मिलता है? अगर हां, तो Patreon जैसे direct support की तुलना में कितना?
एक YouTube Premium subscription से individual creator को मिलने वाली income बहुत मामूली होगी, लेकिन ad blocker के साथ video देखने से तो बेहतर ही है
यह ad impressions पर नहीं बल्कि watch time पर आधारित है, इसलिए long-form content बनाने वाले creators को ज़्यादा फायदा होता है
मेरी girlfriend के YouTube account पर अजीब तरह से किसी भी device में login करने पर ads नहीं आते। Apple TV भी शामिल है, Premium नहीं है और कभी Premium रहा भी नहीं
जानना चाहता हूं कि internally कौन-सा flag set है जिससे ads बंद हैं
तभी जाकर लगा कि लोग शिकायत क्यों करते हैं, अब समझ आया
मैं 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 को टटोलता हुआ काफ़ी बारीक लेख था
उदाहरण के लिए, university में Wi‑Fi से device जोड़ने के लिए MAC address को allowlist में डालना या certificate install करना पड़ता था
हालांकि ऐसा करने पर कई enterprise environments में YouTube टूट सकता है, इसलिए पता नहीं वे सच में करेंगे या नहीं। फिर भी, अफ़सोस की बात है कि इसे रोकना बहुत आसान है
Apple TV पर इसे कुछ बार implement करने की कोशिश की, लेकिन बिल्कुल सफल नहीं हुआ। लगता है YouTube ने अब app में certificate pinning डाल दी है या कुछ ऐसा। जानना चाहूँगा कि हाल में किसी ने इसे चालू करवाया है या नहीं
[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 में चाहते हैं
मुझे एक script मिली जो Instagram page को बस image tags जैसा बना देती है ताकि केवल photos देखी जा सकें: https://greasyfork.org/en/scripts/5014-un-instagram
इसलिए यह इच्छाशक्ति की कमी से ज़्यादा उस numbness जैसी लगती है जो हमने विकसित कर ली है, और यह काफ़ी बुरा है। platform हमें इस्तेमाल करे, इसके बजाय हम platform का इस्तेमाल करें—इस दिशा में की गई मेहनत और creativity सम्मान के योग्य है
बच्चों से नियमित बात करता हूँ, और वे भी मानते हैं कि यह नुकसानदेह है, लेकिन resist करना उनके लिए बहुत कठिन है। मैं खुद भी कभी-कभी doomscrolling में खिंच जाता हूँ
जहाँ संभव था वहाँ Pi-hole से ad filtering set की है, लेकिन पूरा YouTube block नहीं करना चाहता। फिर भी family को protect करने के लिए आगे इसे गंभीरता से consider करना पड़ सकता है
engineering अच्छी है, लेकिन यह थोड़ा दुखद है कि अपने hardware या software को कुछ हद तक भी अपना जैसा इस्तेमाल करने के लिए इतना सब करना पड़ता है
YouTube पर ads होते हैं? browser इतना अच्छा block कर देता है कि पता ही नहीं था
असली समस्या यह है कि Apple TV experience आम web browser experience से कहीं खराब है। Apple ने hardware को इतना lock down कर रखा है कि यह पैसे देकर खरीदने वाले end consumer की तुलना में YouTube की ad revenue में ज़्यादा मदद करने वाली संरचना बन जाती है
घर के 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 करने के नए तरीके ढूँढती रही है