एक प्राइवेसी टेस्ट कोई डेटा कैसे नहीं रखता
प्राइवेसी टेस्ट एक ऐसा उपकरण है जो आपको दिखाता है कि वेबसाइटें आपके ब्राउज़र के बारे में क्या जान सकती हैं — कैनवास और GPU सिग्नल, फ़ॉन्ट, स्क्रीन, समय क्षेत्र, भाषा, नेटवर्क संकेत और वे शांत पहचानकर्ता जो किसी साइट को आपके लौटने पर आपको पहचानने देते हैं — और इससे विश्वसनीयता की समस्या पैदा होती है: निगरानी तकनीकों का प्रदर्शन करने वाले उपकरण को उसकी अपनी डेटा प्रथाओं से भी आंका जाता है, जो बाद में जोड़ा गया नीति पृष्ठ नहीं हो सकतीं। हमारे ब्राउज़र फ़िंगरप्रिंट टेस्ट के पीछे का डिज़ाइन नियम एक वाक्य में कहा जा सकता है: जो ब्राउज़र पढ़ सकता है, वह सर्वर कभी नहीं देखता। यह लेख बताता है कि उस नियम की कीमत क्या है, वह कहाँ झुकता है और कहाँ रुकता है। यदि आप पहले सिग्नलों की सूची चाहते हैं, तो वेबसाइटें आपके बारे में क्या जानती हैं से शुरू करें; यह लेख स्वयं सिग्नलों के बारे में नहीं, टेस्ट के नीचे की नलसाज़ी के बारे में है।
क्लाइंट-साइड पहले
ब्राउज़र स्वयं जो भी सिग्नल देता है, वह स्थानीय रूप से, आपकी मशीन पर, आपके टैब में पेज कोड द्वारा पढ़ा और दिखाया जाता है। कैनवास रेंडरिंग, WebGL रेंडरर स्ट्रिंग, ऑडियो कॉन्टेक्स्ट गुण, स्थापित फ़ॉन्ट की जाँच, स्क्रीन और विंडो ज्यामिति, रंग गहराई, स्पर्श समर्थन, भंडारण अनुमान, कंट्रास्ट और गति के बारे में मीडिया क्वेरी — यह सब वहीं गणना किया जाता है जहाँ यह खोजा जाता है और उस पेज में खींचा जाता है जिसे आप देख सकते हैं। पेज कोड ही एकमात्र चीज़ है जो कभी पूरी तस्वीर रखता है। कोई स्क्रिप्ट पैनल को पेलोड में इकट्ठा नहीं करती, कोई बीकन उसे घर नहीं ले जाता और कोई एनालिटिक्स घटना उसे सारांशित नहीं करती, क्योंकि जिस क्षण कोई पूरा फ़िंगरप्रिंट ब्राउज़र छोड़ता है, टेस्ट वही बन जाता है जिसके बारे में वह चेतावनी देता था।
वह क्रम — स्थानीय पहले, सर्वर अंत में, और सर्वर केवल उन कुछ कामों के लिए जो ब्राउज़र सचमुच अकेले नहीं कर सकता — आर्किटेक्चर की कोई विशेषता नहीं है; वह स्वयं आर्किटेक्चर है। अधिकांश प्राइवेसी उपकरण उल्टे बनाए जाते हैं: सब कुछ केंद्रीय रूप से इकट्ठा करो, फिर उसे हटाने, अनाम बनाने या थोड़े समय रखने का वादा करो। वे वादे निभाए जा सकते हैं, लेकिन वे वादे हैं, और पाठक के पास किसी हटाने का ऑडिट करने का कोई तरीका नहीं है। जो डिज़ाइन डेटा को कभी प्रसारित ही नहीं करता, वह वादे को कोड पथ के बारे में एक तथ्य से बदल देता है, और कोड पथों के बारे में तथ्य नेटवर्क टैब में जाँचे जा सकते हैं, जो ठीक वही मानक है जिसे किसी प्राइवेसी उपकरण को आमंत्रित करना चाहिए।
कीमत वास्तविक है और डिज़ाइन द्वारा स्वीकार की गई है। उपकरणों के पार कुछ भी नहीं है: कोई खाता नहीं जो आपका पीछा करे, कोई इतिहास नहीं जो सिंक हो, आपके दूसरे लैपटॉप पर आपके फ़िंगरप्रिंट से कोई तुलना नहीं, क्योंकि उन सबके लिए सर्वर को प्रति व्यक्ति कुछ रखना पड़ेगा। तुलनाएँ उसी तक सीमित हैं जो आपका अपना ब्राउज़र स्थानीय रूप से याद रखता है और नीचे वर्णित अनाम दैनिक काउंटरों तक। जब किसी सुविधा को सर्वर पर पूरे फ़िंगरप्रिंट की आवश्यकता होगी, तो उत्तर अधिक सावधान प्रतिधारण नीति नहीं है — उत्तर है नहीं। बाधा ही उत्पाद है।
तीन छोटे एंडपॉइंट, तीन अलग काम
तीन काम सचमुच पेज के भीतर नहीं किए जा सकते, और प्रत्येक को अपना छोटा एंडपॉइंट मिलता है जिसका अपना संकीर्ण काम है। पहला, /api/check/whoami, केवल वही लौटाता है जो कोई भी सर्वर उस अनुरोध में पहले से देखता है जिसने पेज लाया था: आपका नेटवर्क पता जैसा वह आया, वे हेडर जो आपके ब्राउज़र ने उसके साथ भेजे, और उस पते से जुड़ा मोटा भूगोल। आपको वे मान दिखाना कोई नई उजागरता नहीं जोड़ता, क्योंकि आप जिस भी सर्वर पर जाते हैं वह उन्हें प्राप्त करता है चाहे वह उन्हें दिखाए या न दिखाए; एंडपॉइंट केवल एकतरफ़ा खुलासे को दृश्यमान खुलासे में बदल देता है, और प्रतिक्रिया से आगे कुछ नहीं रखता।
दूसरा, /api/check/etag, केवल कैश-आधारित पहचान का प्रदर्शन करने के लिए मौजूद है, जो अगले खंड में समझाया गया है: यह एक यादृच्छिक कैश पहचानकर्ता देता है और बिल्कुल कुछ नहीं रखता — न जारी किए गए मानों की कोई तालिका, न इस बात का कोई रिकॉर्ड कि किसने पूछा। तीसरा काउंटर एंडपॉइंट है: यह किसी समाप्त रन से मुट्ठी भर मोटे मान स्वीकार करता है और चलते हुए कुल लौटाता है, ताकि पेज यह कह सके कि आपका विन्यास कितना आम है, बिना किसी के आपकी यात्रा को संग्रहीत किए। प्रत्येक एंडपॉइंट साइट के अन्य चेकर की तरह दर-सीमित है, क्योंकि छोटा और ईमानदार असीमित के बराबर नहीं है, और जिस डेमो एंडपॉइंट को ठोका जा सके वह अच्छे इरादे वाला दुरुपयोग सतह है।
पेज उन बाहरी सेवाओं के बारे में भी स्पष्ट है जिनसे वह आपके ब्राउज़र से सीधे संपर्क करता है, क्योंकि वे सेवाएँ भी आपका पता देखती हैं और उनके बारे में ईमानदारी डिज़ाइन का हिस्सा है। टेस्ट Cloudflare ट्रेस एंडपॉइंट पढ़ता है, यह प्रकट करने के लिए कि कौन-सा रिज़ॉल्वर आपके लिए उत्तर देता है, एक DNS इको सेवा से पूछता है, और यह दिखाने के लिए कि WebRTC-शैली की खोज क्या जान सकती है, दो सार्वजनिक STUN सर्वरों से कनेक्शन खोलता है। प्रत्येक का नाम पेज पर ही, उसके द्वारा उत्पादित परिणाम के बगल में दिया गया है — वही खुलासा अनुशासन जो हम VPN लीक और भेस जाँच में लागू करते हैं। जो प्राइवेसी टेस्ट चुपचाप तीसरे पक्षों को फ़ोन करे, वह अपने ही पाठ में असफल होगा।
ETag की चाल, ईमानदारी से समझाई गई
ETag HTTP कैशिंग का एक साधारण हिस्सा है: सर्वर किसी प्रतिक्रिया के साथ एक वैलिडेटर जोड़ता है, ब्राउज़र उसे कैश की गई प्रति के साथ संग्रहीत करता है, और अगली यात्रा पर ब्राउज़र वैलिडेटर को वापस भेजता है ताकि सर्वर «परिवर्तित नहीं» उत्तर दे सके और स्थानांतरण बचा सके। चाल यह है कि वैलिडेटर को सामग्री का वर्णन करना आवश्यक नहीं है। सर्वर प्रत्येक आगंतुक को एक अद्वितीय वैलिडेटर जारी कर सकता है, और ब्राउज़र हर पुनः सत्यापन पर उस अद्वितीय मान को वफ़ादारी से लौटाएगा — उस बिंदु पर सर्वर ब्राउज़र को ठीक उतनी ही विश्वसनीयता से पहचानता है जितनी किसी कुकी से, बिना कभी कोई कुकी सेट किए। कैश सत्यापन पहचानकर्ता का दोहरा काम करता है क्योंकि ब्राउज़र अपना काम सही ढंग से कर रहा है।
इसीलिए कुकी साफ़ करने से यह साफ़ नहीं होता: कुकी और कैश अलग-अलग भंडार हैं, अलग-अलग नियंत्रणों द्वारा, अलग-अलग समय-सारणियों पर खाली किए जाते हैं। और इसीलिए निजी या गुप्त विंडो इस चाल को तोड़ देती है — निजी विंडो अपने अलग कैश के साथ चलती है जो विंडो बंद होने पर फेंक दिया जाता है, इसलिए वैलिडेटर सत्र के साथ मर जाता है। हमारा एंडपॉइंट आने-जाने का प्रदर्शन करता है और कुछ संग्रहीत नहीं करता: पहचान स्वयं 304 प्रतिक्रिया द्वारा सिद्ध होती है, सर्वर द्वारा अपने यादृच्छिक मान को वापस आते देखने से, यात्राओं के बीच रखे गए किसी रिकॉर्ड से नहीं। प्रदर्शन उसी क्षण समाप्त हो जाता है जब पेज बंद होता है, जो ठीक वही गुण है जो इस तकनीक का उपयोग करने वाले वास्तविक ट्रैकर प्रदान नहीं करते।
एक ईमानदार छोटी-सी झुर्री है जिसका नाम लेना उचित है: एज कैश। यदि प्रतिक्रियाएँ किसी साझा CDN कैश से गुज़रतीं, तो पहले आगंतुक का पहचानकर्ता सभी को दिया जा सकता था, और प्रदर्शन यह दिखाता कि भीड़ एक ID साझा कर रही है बजाय इसके कि प्रत्येक ब्राउज़र का अपना हो। इसलिए यह एंडपॉइंट एज कैशिंग से पूरी तरह बाहर निकल जाता है — प्रत्येक अनुरोध मूल तक पहुँचता है, प्रत्येक आगंतुक को एक नया यादृच्छिक मान मिलता है, और कोई साझा कैश कभी कोई मान नहीं रखता। यह कॉन्फ़िगरेशन की एक छोटी-सी पंक्ति है, लेकिन यह उस प्रदर्शन के बीच का अंतर है जो तंत्र को सिद्ध करता है और उस प्रदर्शन के बीच जो गलती से उल्टा सिद्ध कर देता है।
लॉग की जगह काउंटर
एक प्रश्न को सचमुच सर्वर की आवश्यकता है: «मैं कितना असामान्य हूँ?» जो पेज कह सके आपका GPU आज M रनों में N बार दिखाई दिया, वह उस पेज से कहीं अधिक शिक्षाप्रद है जो केवल सिग्नल सूचीबद्ध कर सकता है, क्योंकि दुर्लभता ही फ़िंगरप्रिंट को पहचान योग्य बनाती है। लेकिन इसका स्पष्ट तरीके से उत्तर देना — हर यात्रा को लॉग करना, फिर गिनना — ठीक वही डेटाबेस बनाता है जिसके बारे में उपकरण चेतावनी देता है। इसलिए टेस्ट लॉग की जगह काउंटर रखता है: प्रति मान प्रति दिन एक संख्या। ऑपरेटिंग सिस्टम, ब्राउज़र परिवार, GPU स्ट्रिंग, समय क्षेत्र, पहली भाषा, स्क्रीन आकार वर्ग, फ़िंगरप्रिंट पहचानकर्ताओं के पहले आठ वर्ण, प्रत्येक व्यक्तिगत जाँच का परिणाम, और रन-अवधि की एक श्रेणी — प्रत्येक दैनिक कुल में एक निशान का योगदान देता है, और इसके अलावा कुछ नहीं रखा जाता।
सीमाएँ तंत्र से अधिक महत्वपूर्ण हैं। पूरा फ़िंगरप्रिंट कभी भेजा नहीं जाता, संग्रहीत होने की बात तो दूर; आपका पता काउंटर को बिल्कुल भेजा ही नहीं जाता। किसी काउंटर को उल्टी दिशा में पूछकर किसी व्यक्ति तक नहीं पहुँचा जा सकता, क्योंकि खोजने के लिए प्रति-आगंतुक कोई पंक्ति है ही नहीं — एकत्रीकरण गिनती के क्षण में होता है, संग्रहीत रिकॉर्डों पर बाद के रिपोर्टिंग चरण के रूप में नहीं। यही कारण है कि कुल दिन के अनुसार रीसेट होते हैं: जो काउंटर हमेशा के लिए जमा होता रहे, पर्याप्त बारीकी से काटा गया, वह संचय द्वारा चुपचाप फ़िंगरप्रिंट डेटाबेस बन जाएगा, और डिज़ाइन उस बहाव को बाद में माफ़ी माँगने के बजाय पहले से अस्वीकार करता है।
दो और विकल्प उन लोगों की रक्षा करते हैं जो यह लेख कभी नहीं पढ़ेंगे। Global Privacy Control सिग्नल भेजने वाले ब्राउज़र कभी गिने ही नहीं जाते — सिग्नल का अर्थ है «मुझे ट्रैक मत करो», और उसकी सबसे सम्मानजनक व्याख्या उन रनों को सावधानी से गिनने के बजाय उन्हें पूरी तरह बाहर करना है। बाकी सभी को पेज पर एक दृश्यमान ऑप्ट-आउट मिलता है, जो कोई गिनती होने से पहले सम्मानित किया जाता है। और जो रन 45 सेकंड में समाप्त नहीं होता, वह एक बार «अटका हुआ» के रूप में, उसकी अपनी श्रेणी में गिना जाता है: धीमापन और विफलता हमारे लिए संचालकों के रूप में दृश्यमान रहती है, एक एकल एकत्रित संख्या के रूप में, बिना किसी व्यक्तिगत आगंतुक का असफल रन के माध्यम से पीछा किए।
जो हमने न बनाने का निर्णय लिया
डिज़ाइन का सबसे शिक्षाप्रद हिस्सा छोड़ी गई चीज़ों की सूची है। कोई कनेक्शन-स्तरीय जाँच नहीं है: न TLS फ़िंगरप्रिंटिंग, न आपके हैंडशेक की JA3-शैली की रीडिंग। ईमानदार कारण वास्तुशिल्पीय है — इस साइट के लिए TLS उसके सामने खड़े CDN पर समाप्त होता है, इसलिए हमारे मूल पर ली गई हैंडशेक रीडिंग आपके ब्राउज़र की तुलना में CDN की बातचीत और सेटिंग्स का कहीं अधिक वर्णन करेगी। उसे «आपका TLS फ़िंगरप्रिंट» के रूप में प्रकाशित करना रंगमंच होगा: किसी और के नाम वाला एक विश्वसनीय दिखने वाला मान। जो प्राइवेसी उपकरण एक आत्मविश्वासी गलत रीडिंग छापता है, वह अपने उपयोगकर्ताओं को हर जगह आत्मविश्वासी गलत रीडिंगों पर भरोसा करना सिखाता है, जो खाली पैनल से भी बदतर है।
उसी अनुशासन ने बाकी छूटों को आकार दिया। काउंटर मोटे हैं क्योंकि बारीक काउंटर संचय द्वारा, एक समय में एक मासूम आयाम से, फ़िंगरप्रिंट डेटाबेस बन जाते हैं। पिछली यात्रा की स्मृति — «आपके पिछले रन के बाद से, ये मान बदल गए» — केवल आपके अपने ब्राउज़र के भंडारण में, आपकी मशीन पर रहती है, और कभी प्रसारित नहीं होती; जिस क्षण वह सिंक होती, वह इतिहास बन जाती, और इतिहास एक रिकॉर्ड है। जो सुविधाएँ सचमुच उपयोगी होतीं, वे उसी कारण से काट दी गईं जिस कारण से एंडपॉइंट छोटे रखे गए: जब डेटा की कीमत उपकरण का पूरा उद्देश्य हो, तो उपयोगिता कोई बचाव नहीं है।
अंत में, अवशिष्ट ईमानदारी की टिप्पणी, क्योंकि कोई भी डिज़ाइन लेख अपनी ही प्रशंसा पर समाप्त नहीं होना चाहिए। यह डिज़ाइन डेटा को न्यूनतम करता है; यह रीडिंगों को स्वयं कम पहचान योग्य नहीं बना सकता। आपका GPU, आपके फ़ॉन्ट, आपकी स्क्रीन और आपका समय क्षेत्र लगभग अद्वितीय चीज़ में संयोजित हो जाते हैं, चाहे कोई उन्हें संग्रहीत करे या न करे — यही वह खोज है जिसे दिखाने के लिए उपकरण मौजूद है। कोई डेटा न रखना आपको हमसे बचाता है। यह आपको तकनीक से नहीं बचाता, और ऐसा दिखावा करना ही वह एकमात्र सचमुच बेईमान सुविधा होगी जो हम दे सकते थे।