- ChatGPT में संदेश भेजते समय Cloudflare Turnstile program चलता है, जो browser fingerprint के साथ-साथ React application state तक की जांच करता है
- Decrypt किए गए program में 55 properties इकट्ठी की जाती हैं, और browser, network, application — इन 3 layers में verification process चलता है
- केवल उसी वास्तविक SPA environment में पास होना संभव है जहाँ React rendering पूरी हो चुकी हो, इसलिए headless browser या simple bot requests fail हो जाती हैं
- इकट्ठा किया गया fingerprint encrypt होकर
OpenAI-Sentinel-Turnstile-Token में बदल जाता है, और इसके साथ Signal Orchestrator तथा Proof of Work modules भी अतिरिक्त रूप से चलते हैं
- Decryption key केवल Cloudflare server को पता होती है, इसलिए privacy boundary तकनीक नहीं बल्कि policy से तय होने वाली संरचना बनती है
ChatGPT में संदेश भेजते समय Cloudflare Turnstile के काम करने की संरचना का विश्लेषण
- ChatGPT में हर message send पर browser के अंदर Cloudflare Turnstile program अपने-आप चलाया जाता है
- Network traffic से 377 Turnstile programs को decrypt करने के नतीजे में पता चला कि यह सामान्य browser fingerprint collection से आगे बढ़कर React application state तक की जांच करता है
- केवल browser fingerprint spoof करने वाले bots इससे पास नहीं हो सकते, और verification pass करने के लिए ChatGPT की SPA (single-page application) को पूरी तरह render करना पड़ता है
Encryption structure और decryption process
- Turnstile bytecode server response के
turnstile.dx field में आता है, और हर request पर 28,000 characters लंबी base64 string के रूप में encrypt रहता है
- बाहरी encryption layer को
p token और XOR operation से decrypt किया जा सकता है, और ये दोनों values उसी HTTP request के भीतर exchange होती हैं
- Decrypt होने के बाद परिणाम 89 VM instructions वाले JSON-format bytecode के रूप में मिलता है
- इसके अंदर 19KB आकार का एक अतिरिक्त encrypted blob मौजूद होता है, जिसे एक अलग XOR key से encrypt किया गया है
- Key bytecode के अंदर float literal value (जैसे 97.35) के रूप में शामिल होती है, जिसे server बनाकर browser तक भेजता है
- 50 requests में सभी बार इसी तरीके से valid JSON decryption की पुष्टि हुई
- पूरा decryption process नीचे दिए गए 5 चरणों से बना है
- Request से
p token पढ़ना
- Response से
turnstile.dx पढ़ना
XOR(base64decode(dx), p) → बाहरी bytecode बनता है
- 19KB blob के बाद वाले 5-argument instruction से आखिरी argument को key के रूप में निकालना
XOR(base64decode(blob), str(key)) → अंदरूनी program decrypt करना (417~580 instructions)
Decrypt किए गए program के inspection items
- अंदरूनी program 28 instructions (opcode) वाले custom VM पर चलता है, और हर request में floating-point register addresses को random तरीके से बदला जाता है
- कुल 55 properties इकट्ठी की जाती हैं, और 377 samples में सभी में वही items शामिल थे
-
Layer 1: Browser fingerprint
- WebGL से जुड़ी 8 properties:
UNMASKED_VENDOR_WEBGL, UNMASKED_RENDERER_WEBGL, WEBGL_debug_renderer_info आदि
- Screen info की 8 properties:
colorDepth, pixelDepth, width, height, availWidth, availHeight, availLeft, availTop
- Hardware की 5 properties:
hardwareConcurrency, deviceMemory, maxTouchPoints, platform, vendor
- Font measurement की 4 properties: hidden div बनाकर
fontFamily, fontSize, getBoundingClientRect, innerText से rendering size मापना
- DOM traversal की 8 properties:
createElement, appendChild, removeChild, style, position, visibility, ariaHidden आदि
- Storage की 5 properties:
storage, quota, estimate, setItem, usage
- Result को
localStorage की key 6f376b6560133c2c में store किया जाता है ताकि page reloads के बीच यह बना रहे
-
Layer 2: Cloudflare network
- Edge headers की 5 properties:
cfIpCity, cfIpLatitude, cfIpLongitude, cfConnectingIp, userRegion
- ये values केवल Cloudflare network के जरिए ही मौजूद होती हैं, इसलिए origin server तक सीधे पहुंचने वाले bots में ये missing या mismatched हो जाती हैं
-
Layer 3: Application state
- React internal structures की 3 properties:
__reactRouterContext, loaderData, clientBootstrap
- ये items केवल तब मौजूद होते हैं जब ChatGPT की React application पूरी तरह render हो चुकी हो और SSR hydration पूरी हो गई हो
- ऐसे headless browsers जो सिर्फ HTML load करते हैं या JS bundles नहीं चलाते, या ऐसे bot frameworks जो React को वास्तव में execute नहीं करते, वे fail हो जाते हैं
Token generation process
- 55 properties collect करने के बाद, program 116-byte encrypted blob को decrypt करके 4 final instructions चलाता है
JSON.stringify(fingerprint) → store → XOR(json, key) → RESOLVE
- Result value को
OpenAI-Sentinel-Turnstile-Token header में बदला जाता है और सभी conversation requests में शामिल किया जाता है
Sentinel के अतिरिक्त components
- Turnstile के अलावा दो अतिरिक्त verification modules भी मौजूद हैं
-
Signal Orchestrator
- 271 instructions से बना है
keydown, pointermove, click, scroll, paste, wheel event listeners install करता है
window.__oai_so_* की 36 properties को track करके key input timing, mouse speed, scroll pattern, idle time, paste events आदि को monitor करता है
- Fingerprint collection के अलावा यह behavior-based biometric authentication layer की भूमिका निभाता है
-
Proof of Work
- 25-field fingerprint + SHA-256 hashcash पर आधारित
- Difficulty 400K~500K range की uniform random होती है, और 72% मामलों में 5ms से कम समय में solve हो जाती है
ai, createPRNG, cache, solana, dump, InstallTrigger, data जैसी 7 binary detection flags शामिल हैं (100 samples में सभी 0)
- यह computation cost बढ़ाता है, लेकिन मुख्य defense mechanism नहीं है
Token को decrypt कौन कर सकता है और security implications
- अंदरूनी program की XOR key server बनाकर bytecode में शामिल करता है, इसलिए केवल वही server जो
turnstile.dx बनाता है key जानता है
- User और system operator के बीच privacy boundary cryptographic restriction नहीं बल्कि policy decision से परिभाषित होती है
- Obfuscation का उद्देश्य है
- fingerprint collection items को static analysis से छिपाना
- website operator (OpenAI) को raw fingerprint values सीधे पढ़ने से रोकना
- हर token को unique बनाकर reuse (replay) रोकना
- Cloudflare inspection items बदल दे तब भी बाहरी लोगों के लिए पहचानना कठिन बनाना
- लेकिन encryption उसी data stream के भीतर key और XOR operation पर आधारित है, इसलिए यह analysis resistance स्तर की obfuscation भर है
Collection और analysis statistics
| मद |
मान |
| Decrypt किए गए programs |
377/377 (100%) |
| Observe किए गए unique users |
32 |
| प्रति program properties की संख्या |
55 (सभी समान) |
| Instructions की संख्या |
417–580 (औसत 480) |
| XOR keys (50 samples) |
41 |
| Signal Orchestrator properties |
36 |
| Proof of Work fields |
25 |
| PoW solve time |
72% मामलों में 5ms से कम |
Analysis methodology
- केवल कानूनी प्रक्रिया से इकट्ठा किया गया traffic इस्तेमाल किया गया
- व्यक्तिगत user data सार्वजनिक नहीं किया गया
- सभी traffic को participants की सहमति से observe किया गया
- Sentinel SDK (
sdk.js, 1,411 lines) पर manual deobfuscation और offline decryption किया गया
- Decryption Python का उपयोग करके offline environment में किया गया
अभी कोई टिप्पणी नहीं है.