- uBlock Origin कमिट में Firefox नेटवर्क प्रोसेसिंग में CNAME uncloaking फ्लो को दोबारा लिखा गया है और DNS lookup से मिले IP को
details.ipमें दर्शाने के लिए बदला गया है - मौजूदा
cnamesMap cache हटा दिया गया है और उसकी जगहdnsList,dnsDict,dnsWritePtrआधारित 256-एंट्री ring buffer और60000msTTL cache ने ले ली है - DNS lookup के लिए
browser.dns.resolve(hn, [ 'canonical_name' ])का उपयोग होता है, और परिणाम केcanonicalNameऔरaddresses[0]को क्रमशः CNAME और IP के रूप में इस्तेमाल किया जाता है - CNAME exception handling में 1st-party, ignore list, root document शर्तें बरकरार हैं, और IPv4 address या
[से शुरू होने वाले hostname को दोबारा lookup से बाहर रखा जाता है - Chromium का minimum version
80.0और Opera का minimum version67.0कर दिया गया है, जबकि hidden setting केcnameMaxTTLdefault value को हटा दिया गया है
Firefox DNS cache संरचना का पुनर्लेखन
platform/firefox/vapi-background-ext.jsमें CNAME uncloaking से जुड़ा कोड global Map-केंद्रित संरचना से बदलकर class के अंदर की DNS cache संरचना में ले जाया गया है- पहले के global state
cnameUncloakEnabledऔरcnamesMap की जगह अब cache को इन फ़ील्ड्स से मैनेज किया जाता हैdnsList: ring bufferdnsWritePtr: अगला write positiondnsMaxCount: अधिकतम256dnsDict: hostname से ring buffer index की mappingdnsEntryTTL:60000ms
- constructor में
canUncloakCnamesऔरcnameUncloakEnabledकोtrueसे initialize किया जाता है
request processing flow
onBeforeSuspendableRequest(details)request URL से hostname निकालने के बाद पहलेdnsFromCache(hn)से cache जांचता है- अगर cached DNS entry में
ipहो तो उसेdetails.ipमें सेट किया जाता है - बेसिक
super.onBeforeSuspendableRequest(details)कॉल का परिणाम अगर cancel या redirect जैसी स्थिति में खत्म हो जाए, तो वही परिणाम सीधे लौटाया जाता है - अगर cached DNS entry
Promiseनहीं है, तोonAfterDNSResolution(hn, details, dnsEntry)के जरिए आगे की processing जारी रहती है - अगर DNS re-lookup की शर्तें पूरी नहीं होतीं या
details.proxyInfo?.proxyDNSमौजूद हो, तो अतिरिक्त DNS processing नहीं की जाती
DNS lookup और storage का तरीका
dnsShouldResolve(hn)खाली hostname,[से शुरू होने वाले hostname, और IPv4 address फ़ॉर्म को DNS lookup target से बाहर रखता हैdnsResolve(hn, details)ring buffer की मौजूदा position पर hostname दर्ज करता है औरdnsAPI.resolve(hn, [ 'canonical_name' ])को कॉल करता है- lookup सफल होने पर
dnsToCache(hn, rec, details)चलता है, और विफल होने परdnsToCache(hn)के जरिए cache में खाली entry छोड़ दी जाती है dnsToCacheनई cache entry मेंhnऔर expiry timestamp को स्टोर करता है- अगर
cnameFromRecordकोई मान लौटाता है, तो उसेdnsEntry.cnameमें स्टोर किया जाता है - अगर
ipFromRecordकोई मान लौटाता है, तो उसेdnsEntry.ipमें स्टोर किया जाता है
- अगर
dnsFromCacheमें अगर cache entryPromiseहो तो उसे वैसे ही लौटाया जाता है, और expired entry कोdnsListऔरdnsDictसे हटा दिया जाता है
CNAME और IP लागू होने की शर्तें
cnameFromRecord(hn, record, details)तब CNAME नहीं लौटाता जबrecord.canonicalNameमौजूद न हो या मूल hostname के बराबर हो- अगर
cnameIgnore1stPartyचालू हो, तो CNAME और मूल hostname का domain समान होने पर उसे बाहर रखा जाता है - अगर
cnameIgnoreListमौजूद हो, तो उस regex से match न होने वाले CNAME को बाहर रखा जाता है - अगर
cnameIgnoreRootDocumentचालू हो, तो request hostnamedetails.documentUrl || details.urlके hostname के समान होने पर उसे बाहर रखा जाता है ipFromRecord(record)तब पहला addressaddresses[0]लौटाता है जबrecord.addressesarray हो और खाली न हो
URL rewrite और आगे की filtering
onAfterDNSResolutionमें अगर DNS entry में CNAME हो औरcnameUncloakEnabledचालू हो, तोuncloakURLके जरिए URL को rewrite किया जाता है- URL बदलते समय पुराना URL
details.aliasURLमें स्टोर किया जाता है और नया URLdetails.urlमें लागू किया जाता है - अगर DNS entry का IP मौजूद हो और वह मौजूदा
details.ipसे अलग हो, तोdetails.ipको update किया जाता है - बेस class के
onBeforeSuspendableRequest(details)को दोबारा केवल तभी कॉल किया जाता है जब CNAME rewrite या IP change वास्तव में हुआ हो uncloakURLURL के अंदर hostname की स्थिति ढूंढ़कर उसे CNAME से बदलता है, औरcnameReplayFullURLमान के अनुसार या तो पूरा URL जोड़ा जाता है या सिर्फ path के शुरुआती हिस्से तक रखा जाता है
settings और manifest बदलाव
setOptionsसेcnameMaxTTLकी processing हटा दी गई है- option change पर पुराने
cnamesMap को reset करने की जगहdnsList.fill(null)औरdnsDict.clear()से DNS cache खाली किया जाता है src/js/background.jsकी hidden setting defaults सेcnameMaxTTL: 120हटा दिया गया हैplatform/chromium/manifest.jsonमेंminimum_chrome_versionको73.0से बदलकर80.0किया गया हैplatform/opera/manifest.jsonमेंminimum_opera_versionको60.0से बदलकर67.0किया गया है
1 टिप्पणियां
Hacker News की राय
लगता है शीर्षक गलत है। uBlock Origin कई सालों से इस फीचर को सपोर्ट कर रहा था, बस यह सिर्फ Firefox पर संभव था
यह मामला पूरी तरह नया फीचर नहीं, बल्कि उस code की refactoring जैसा लगता है
हालांकि एक domain के कई IP होने पर browser कौन-सा IP चुनेगा, यह पता नहीं होता, इसलिए यह परफेक्ट नहीं है
अगर कोई ज्यादा सटीक और neutral शीर्षक सुझाए, तो फिर बदल सकते हैं। हालांकि बिना अतिरिक्त context वाले GitHub commits आम तौर पर HN thread के लिए बहुत अच्छे नहीं होते
मुझे अभी तक सीधे नुकसान नहीं हुआ है, लेकिन अगर Chrome सच में uBO को खत्म कर देता है, तो switch कर सकूं इसलिए मैं अपने extensions को पहले से Firefox के लिए फिर से ठीक कर रहा हूं
कुछ releases के भीतर आ जाएगा, इसलिए तैयार रहना चाहिए
ज्यादा से ज्यादा
background.service_workerकोbackground.scriptsमें बदलना होगा, सचमुच बस key name बदलना हैuBlock Origin Firefox को बेहतर बनाने वाली चीजों में से एक है, और Chrome वगैरह की जगह Firefox इस्तेमाल करने का बड़ा कारण भी है
यह इंटरनेट को सच में browse करने लायक बनाता है
10 साल से ज्यादा समय में कुछ sites पर display issues थे, लेकिन उन sites में Chrome पर भी issues थे
निजी तौर पर मुझे ads आधुनिक समाज के cancer जैसे लगते हैं। white lies और दूसरी तरह के झूठ, manipulation सब मिला हुआ है, और उसमें इतना पैसा बहता है कि उसमें सम्मान करने लायक कुछ भी नहीं बचता
Brave भी अच्छी quality का project है, इसलिए backup के तौर पर इस्तेमाल करता हूं, और कभी-कभी window tiling और कहीं बेहतर tab management के कारण Vivaldi भी साथ में इस्तेमाल करता हूं
CNAME cloaking का मतलब क्या यह है कि ad sites wildcard record की ओर इशारा करने वाले randomly generated subdomains इस्तेमाल करती हैं?
आम तौर पर जब आप contentsite.com visit करते हैं, तो ads adsite.com से serve होते हैं। ad blocking rules adsite.com को block कर दें तो ads नहीं दिखते
CNAME cloaking में main site adsite.contentsite.com जैसे subdomain को adsite.com की ओर point कराती है। तब ad blocker के सामने लगभग असंभव काम आ जाता है: उसे ऐसे लाखों subdomains block करने पड़ते हैं जो normal site का हिस्सा लगते हैं
legitimate site लगातार subdomains बदल सकती है, और ad blocker के पास यह जानने का कोई तरीका नहीं होता कि कौन-सा subdomain normal content है और कौन-सा ad। ऊपर से content उसी domain से serve होता है, इसलिए कुछ cookie policies bypass करके users को बेहतर track भी किया जा सकता है
यह update resolved IP के आधार पर filtering rules set करने की सुविधा देता है
यह Manifest V3 क्यों खराब है इसका अच्छा उदाहरण है। definition के हिसाब से यह ऐसा काम कर ही नहीं सकता, और runtime code-based heuristics भी संभव नहीं हैं
यह advertisers के साथ arms race है, और Google दोनों तरफ हथियार बेचने वाला dealer है। वह users को जीतने के लिए जरूरी चीजें नहीं देगा
बेशक यह सब browser vendor, यानी Google, पर निर्भर है कि वह यह API add करना चाहता है या नहीं। अगर “runtime code” से imperative processing की जा सके, तो browser makers built-in support जोड़ने से पहले user space में innovation हो सकता है
इसलिए यह कहना गलत है कि कोई खास feature “definition के हिसाब से” असंभव है
[1] https://blog.mozilla.org/addons/2022/05/18/manifest-v3-in-fi...
CNAME cloaking उदाहरण के लिए, मान लें कि SaaS provider A, company Q को एक शानदार ad tracking software देना चाहता है
पुराने तरीके में A, company Q से कहता कि वह
https://q-company.exampleपर मौजूद अपनी वेबसाइट में, जैसे https://A-ads-tracking.example की script डाल देतब uBlock Origin द्वारा इस्तेमाल की जाने वाली block lists में “A-ads-tracking.example domain पर जाने वाली requests को रोकें” जैसा rule बन जाता, और ads block हो जाते
CNAME cloaking में SaaS provider A अपना ad tracking service A-ads-tracking.example domain पर नहीं, बल्कि जैसे 29.1.2.3 जैसे किसी खास IP address पर रखता है। और अहम बात यह है कि SaaS A, company Q से कहता है कि वह q-company.example का एक subdomain बनाए और उसका CNAME record 23.1.2.3 की ओर point करे। इसे media.q-company.example जैसा plausible नाम दे दिया जाता है
Company Q द्वारा वह CNAME set करने के बाद अगर वह वेबसाइट में
media.q-company.examplescript tag जोड़ दे, तो SaaS A उस साइट के सभी users को track कर सकता है। इस तरह की bypass layer के कारण company Q के owner और public block lists के बीच असल में एक अनंत cat-and-mouse game बन जाता हैइस समस्या से बचने के लिए uBlock Origin जैसे extension चलाने वाले software को browser request के target domain के साथ-साथ उस domain का actual IP address भी देख पाना चाहिए। यह commit उस behavior को सक्षम करने, या कम-से-कम उस code को बेहतर ढंग से काम कराने से जुड़ा लगता है
उदाहरण के लिए
media.q-company.example,q-company.ads-tracking.exampleकी ओर point करने वाला CNAME हो सकता है, और फिरq-company.ads-tracking.exampleके पास IP देने वाला A record होता हैBrowser intermediate DNS name extensions को देता है या नहीं, यह मुझे नहीं पता। इसलिए uBlock जैसी चीज़ों को IP lists पर निर्भर रहना पड़ सकता है, लेकिन pihole जैसी DNS-based filtering
ads-tracking.exampleके लिए rule से सीधे block कर सकती हैजो भी हो, browser-based और DNS-based malicious blockers दोनों इस्तेमाल करना अच्छा है
यह धीमा है और गलतियों की संभावना रहती है, लेकिन आदत पड़ जाए तो आसान हो जाता है, और इस तरह की बेकार चालबाजियों से पूरी तरह immune बना देता है
क्या Chrome uBO को block करने वाला है? मैं latest स्थिति हमेशा follow नहीं कर पाता
मुझे पता है कि third-party cookies अब allow की जा रही हैं, तो शायद कुछ संभावना हो सकती है
uBO को यह पहचानने और फिर उसे load होने से रोकने के लिए जिन core APIs की ज़रूरत होती है, उन्हें हटाया जा रहा है
Google का दावा है कि यह “performance” या “security” की वजह से है। बेशक, असल में जिस “performance” या “security” पर बड़ा असर पड़ता है, वह नुकसानदेह या ad-related downloads शुरू होने से पहले उन्हें पहचानने, intercept करने और रोकने की क्षमता है
https://developer.chrome.com/docs/extensions/develop/migrate...
https://www.bleepingcomputer.com/news/google/google-chrome-w...
अगर आप केवल Manifest V3 support करने वाला Chromium version इस्तेमाल करते हैं, तो यह छिपा दिया जाता है
क्या कुछ DNS servers में ऐसा feature नहीं होता जो server द्वारा resolve किए गए CNAME जैसा काम करता है? यानी admin कोई ऐसा record डालता है जो किसी दूसरे DNS name की ओर point करता है, लेकिन client को बस A या AAAA record ही दिखता है
uBO में यह feature काफी पहले से था। 1.34.0 से, और advanced settings में 1.25.0 से था
https://github.com/gorhill/uBlock/wiki/Dashboard:-Settings#u...
मुझे याद है यह लगभग 2021 के आसपास था
Brave, Edge, Opera में uBO की स्थिति क्या है?
https://brave.com/blog/brave-shields-manifest-v3/
हालांकि इसकी सख्त जरूरत नहीं है। Brave में अपना built-in ad blocker काफी powerful है, और आखिरी बार जब मैंने check किया था, वह native code में compile था, uBO से ज्यादा performant था, और वही ad lists भी पूरी तरह support करता था