- Beim Senden einer Nachricht in ChatGPT wird das Cloudflare-Turnstile-Programm ausgeführt und prüft nicht nur den Browser-Fingerprint, sondern auch den Status der React-Anwendung
- Das entschlüsselte Programm sammelt 55 Eigenschaften und führt ein Prüfverfahren in drei Schichten aus: Browser, Netzwerk und Anwendung
- Es kann nur in einer realen SPA-Umgebung bestehen, in der React vollständig gerendert wurde; Headless-Browser oder einfache Bot-Anfragen scheitern
- Der gesammelte Fingerprint wird verschlüsselt und in
OpenAI-Sentinel-Turnstile-Token umgewandelt; zusätzlich werden die Module Signal Orchestrator und Proof of Work ausgeführt
- Nur die Cloudflare-Server kennen den Entschlüsselungsschlüssel, wodurch die Grenze der Privatsphäre nicht technisch, sondern politisch festgelegt wird
Analyse der Funktionsweise von Cloudflare Turnstile beim Senden von ChatGPT-Nachrichten
- Bei jeder Nachrichtenübertragung in ChatGPT wird im Browser automatisch das Cloudflare-Turnstile-Programm ausgeführt
- Die Entschlüsselung von 377 Turnstile-Programmen aus dem Netzwerkverkehr zeigte, dass über das übliche Sammeln von Browser-Fingerprints hinaus auch der Status der React-Anwendung geprüft wird
- Bots, die nur einfache Browser-Fingerprints fälschen, bestehen nicht; um die Prüfung zu bestehen, muss die SPA (Single-Page-Application) von ChatGPT vollständig gerendert werden
Verschlüsselungsstruktur und Entschlüsselungsprozess
- Der Turnstile-Bytecode wird im Feld
turnstile.dx der Serverantwort übermittelt und ist bei jeder Anfrage als 28.000 Zeichen langer base64-String verschlüsselt
- Die äußere Verschlüsselungsschicht lässt sich mit dem
p-Token und einer XOR-Operation entschlüsseln; beide Werte werden innerhalb derselben HTTP-Anfrage ausgetauscht
- Das entschlüsselte Ergebnis ist Bytecode im JSON-Format, bestehend aus 89 VM-Befehlen
- Im Inneren befindet sich ein zusätzlicher verschlüsselter Blob von 19 KB, der mit einem anderen XOR-Schlüssel verschlüsselt ist
- Der Schlüssel ist als Float-Literalwert (z. B. 97.35) im Bytecode enthalten und wird vom Server erzeugt und an den Browser gesendet
- Bei allen 50 Anfragen wurde bestätigt, dass auf diese Weise gültiges JSON entschlüsselt werden konnte
- Der gesamte Entschlüsselungsprozess besteht aus den folgenden 5 Schritten
- Das
p-Token aus der Anfrage lesen
turnstile.dx aus der Antwort lesen
XOR(base64decode(dx), p) → Erzeugung des äußeren Bytecodes
- Aus dem 5-Argument-Befehl hinter dem 19-KB-Blob das letzte Argument als Schlüssel extrahieren
XOR(base64decode(blob), str(key)) → Entschlüsselung des inneren Programms (417 bis 580 Befehle)
Prüfmerkmale des entschlüsselten Programms
- Das innere Programm läuft auf einer benutzerdefinierten VM mit 28 Befehlen (Opcodes); dabei werden die Adressen der Gleitkomma-Register bei jeder Anfrage zufällig geändert
- Insgesamt werden 55 Eigenschaften gesammelt; alle 377 Stichproben enthielten dieselben Merkmale
-
Layer 1: Browser-Fingerprint
- 8 WebGL-bezogene Eigenschaften:
UNMASKED_VENDOR_WEBGL, UNMASKED_RENDERER_WEBGL, WEBGL_debug_renderer_info usw.
- 8 Bildschirminformationen:
colorDepth, pixelDepth, width, height, availWidth, availHeight, availLeft, availTop
- 5 Hardware-Merkmale:
hardwareConcurrency, deviceMemory, maxTouchPoints, platform, vendor
- 4 Font-Messungen: Nach dem Erstellen eines versteckten div wird die Rendergröße über
fontFamily, fontSize, getBoundingClientRect und innerText gemessen
- 8 DOM-Abfragen:
createElement, appendChild, removeChild, style, position, visibility, ariaHidden usw.
- 5 Speichermerkmale:
storage, quota, estimate, setItem, usage
- Die Ergebnisse werden unter dem Schlüssel
6f376b6560133c2c in localStorage gespeichert und bleiben über Seiten-Neuladungen hinweg erhalten
-
Layer 2: Cloudflare-Netzwerk
- 5 Edge-Header:
cfIpCity, cfIpLatitude, cfIpLongitude, cfConnectingIp, userRegion
- Diese Werte existieren nur über das Cloudflare-Netzwerk; Bots, die direkt auf den Origin-Server zugreifen, erhalten fehlende oder inkonsistente Werte
-
Layer 3: Anwendungszustand
- 3 interne React-Strukturen:
__reactRouterContext, loaderData, clientBootstrap
- Diese Merkmale existieren nur, wenn die React-Anwendung von ChatGPT vollständig gerendert wurde und die SSR-Hydration abgeschlossen ist
- Headless-Browser, die nur HTML laden oder keine JS-Bundles ausführen, sowie Bot-Frameworks, die React nicht tatsächlich ausführen, scheitern
Prozess der Token-Erzeugung
- Nachdem 55 Eigenschaften gesammelt wurden, entschlüsselt das Programm einen verschlüsselten Blob von 116 Byte und führt 4 abschließende Befehle aus
JSON.stringify(fingerprint) → store → XOR(json, key) → RESOLVE
- Das Ergebnis wird in den Header
OpenAI-Sentinel-Turnstile-Token umgewandelt und in alle Gesprächsanfragen aufgenommen
Zusätzliche Komponenten von Sentinel
- Neben Turnstile gibt es zwei weitere Prüfmodule
-
Signal Orchestrator
- Besteht aus 271 Befehlen
- Installiert Event-Listener für
keydown, pointermove, click, scroll, paste, wheel
- Verfolgt 36 Eigenschaften unter
window.__oai_so_* und überwacht Tastatureingabe-Timing, Mausgeschwindigkeit, Scrollmuster, Leerlaufzeit und Einfügeereignisse
- Dient zusätzlich zur Fingerprint-Erfassung als verhaltensbasierte biometrische Authentifizierungsschicht
-
Proof of Work
- Basiert auf einem Fingerprint mit 25 Feldern plus SHA-256-hashcash
- Die Schwierigkeit ist eine gleichverteilte Zufallszahl im Bereich 400K bis 500K; 72 % werden in höchstens 5 ms gelöst
- Enthält 7 binäre Erkennungs-Flags wie
ai, createPRNG, cache, solana, dump, InstallTrigger, data (in allen 100 Stichproben jeweils 0)
- Erhöht die Rechenkosten, ist aber nicht das zentrale Verteidigungsmittel
Wer den Token entschlüsseln kann und was das sicherheitstechnisch bedeutet
- Da der XOR-Schlüssel des inneren Programms vom Server erzeugt und in den Bytecode eingebettet wird, kennt nur der Server, der
turnstile.dx erzeugt hat, den Schlüssel
- Die Grenze der Privatsphäre zwischen Nutzer und Systembetreiber wird durch politische Entscheidungen statt durch kryptografische Beschränkungen definiert
- Ziel der Obfuskation ist es,
- die gesammelten Fingerprint-Merkmale vor statischer Analyse zu verbergen
- zu verhindern, dass der Website-Betreiber (OpenAI) rohe Fingerprint-Werte direkt auslesen kann
- jeden Token eindeutig zu machen und so Wiederverwendung (Replay) zu verhindern
- Änderungen der Prüfmerkmale durch Cloudflare von außen schwer erkennbar zu machen
- Die Verschlüsselung erfolgt jedoch über Schlüssel und XOR-Operation innerhalb desselben Datenstroms und ist daher nur eine der Analyseabwehr dienende Obfuskation
Erhebungs- und Analyse-Statistiken
| Punkt |
Wert |
| Entschlüsselte Programme |
377/377 (100 %) |
| Beobachtete eindeutige Nutzer |
32 |
| Anzahl Eigenschaften pro Programm |
55 (alle identisch) |
| Anzahl Befehle |
417–580 (Durchschnitt 480) |
| XOR-Schlüssel (50 Stichproben) |
41 |
| Signal-Orchestrator-Eigenschaften |
36 |
| Proof-of-Work-Felder |
25 |
| PoW-Lösungszeit |
72 % in höchstens 5 ms |
Analysemethodik
- Es wurde nur rechtmäßig erhobener Datenverkehr verwendet
- Es werden keine personenbezogenen Nutzerdaten veröffentlicht
- Sämtlicher Datenverkehr wurde mit Zustimmung der Teilnehmenden beobachtet
- Das Sentinel-SDK (
sdk.js, 1.411 Zeilen) wurde manuell deobfuskiert und offline entschlüsselt
- Die Entschlüsselung erfolgte offline mit Python
1 Kommentare
Hacker-News-Kommentare
Hallo, ich bin Nick und arbeite im Integrity-Team von OpenAI
Diese Prüfung ist Teil von Schutzmaßnahmen zur Missbrauchsprävention auf der Plattform, etwa gegen Bots, Scraping und Betrug
Ziel ist es, GPU-Ressourcen echten Nutzern bevorzugt zuzuteilen, damit wir auch kostenlosen und nicht eingeloggten Nutzern weiterhin Zugang bieten können
Wir überwachen Seitenladezeit, Zeit bis zum ersten Token, Payload-Größe und Ähnliches und konzentrieren uns darauf, den Overhead zu minimieren
Für die meisten Nutzer sind die Auswirkungen gering, nur ein sehr kleiner Teil könnte leichte Verzögerungen bemerken
Außerdem bewerten wir laufend Verbesserungen der Genauigkeit, damit Missbrauch schwieriger wird und gleichzeitig die False-Positive-Rate sinkt
Ich verstehe Nicks Erklärung, frage mich aber, ob wir weiterhin in einer Welt leben werden, in der man zwischen Privatsphäre und Funktionalität wählen muss
Es gibt Eingabeverzögerungen, Ruckler beim Rendern und sogar komplette Hänger
Ich erlebe das sowohl auf einem iPhone 16 mit Safari als auch auf einem MacBook Pro M3 mit Chrome
Halb im Scherz wird vorgeschlagen, doch einfach Cloudflares datenschutzfeindliches Tool laufen zu lassen und das Ergebnis zu teilen
Ich bin Pro-Abonnent, und mein ganzes Team gibt pro Monat mehr als 2.000 Dollar aus
Aber wenn ich ein VPN (Mullvad) nutze, wird die Chat-Oberfläche selbst im eingeloggten Zustand oft unterbrochen oder läuft in Timeouts
Es wäre gut, wenn zahlende Nutzer den Dienst unabhängig von der VPN-Nutzung stabil verwenden könnten
Beschwerde darüber, dass Cloudflare das Web wegen „verdächtiger“ Browser oder IPs fast unbenutzbar macht
Es wird beschrieben, dass man allein wegen Firefox in der Captcha-Hölle landet
VPNs, datenschutzorientierte Browser, seltene IP-Bereiche – gerade datenschutzbewusste Nutzer geraten am häufigsten hinein
Bots umgehen solche Filter hingegen mühelos
Die Person selbst nutzt Firefox, sieht aber nur ein normales Maß an Captchas
CGNAT ist bei mir deaktiviert; vielleicht macht das den Unterschied
Die Bank hat die Identität bereits bestätigt, daher sei schwer nachzuvollziehen, dass die Website nicht unterscheiden kann, ob man ein Mensch ist
Da OpenAI kostenloses ChatGPT auch für nicht eingeloggte Nutzer anbietet, scheint man es davor schützen zu wollen, als kostenlose API missbraucht zu werden
In der Android-App läuft ein Play-Integrity-Check, während die Claude-App nur ein Login verlangt und keine solche Prüfung hat
Es habe überrascht, dass nach Eingabe einer Frage selbst ohne Cookies oder Konto eine Antwort erschien
Im Vergleich zur API ist das Abo-Modell viel günstiger, daher muss Missbrauch verhindert werden
Ein SPA-Load-Check ist keine große Hürde, und wer davon weiß, hat meist ohnehin die technischen Mittel, ihn zu umgehen
Andere Unternehmen bauen ebenfalls eigene Anti-Bot-Systeme
Interessant ist, dass bestimmte Eigenschaften erst existieren, wenn die React-App von ChatGPT vollständig gerendert ist
Das ist Bot-Erkennung auf der Anwendungsschicht statt auf Browser-Ebene
Ich dachte, die meisten fortgeschrittenen Erkennungssysteme funktionieren ohnehin so; daher frage ich mich, was an dieser Entdeckung besonders bedeutsam ist
Der Autor hätte klarer erklären sollen, warum einem dieses Problem wichtig sein sollte
Letztlich geht es darum, dass OpenAI möchte, dass Nutzer die offizielle React-App verwenden; ich verstehe nicht ganz, warum das ein Problem sein soll
Aus technischer Sicht interessant
Soweit ich weiß, hat Turnstile standardmäßig keine site-spezifische Konfiguration; daher frage ich mich, wie OpenAI Turnstile-Daten mit der eigenen API kombiniert hat
Unverständnis darüber, warum Bot-Betreiber nicht einfach Windows 11-VMs + Chrome verwenden
Mit Memory-Deduplication könne man 50 VMs gleichzeitig betreiben, und auf AWS liege man bei 1 Cent pro 1.000 Seitenaufrufen, also extrem günstig
Mit IP-Rotation, Standort-Spoofing, Spracheinstellungen, eingebauten Parsern und vielen weiteren Optionen; die Wechselkosten sind niedrig, daher lohnt sich Eigenbau kaum
Er ist deutlich teurer als einfachere Methoden
Wie vorgeschlagen wären Linux-Container statt Windows viel leichter und effizienter
Kritik, der Artikel wirke wie ein schlampig zusammengeschriebener Text von ChatGPT
In den Jahren 2023 bis 2024 wurde eine Erweiterung namens KeepChatGPT genutzt
Interessant war, dass sie ohne API funktionierte, indem sie sich als Nutzer ausgab
Später wurde sie wegen Geminis Auftauchen und häufiger Fehler nicht mehr verwendet, aber die Option, das KI-Panel nach rechts zu verschieben, gefiel mir
KeepChatGPT GitHub-Link
Diese Methode wird vom Anti-Bot-System von OpenAI überhaupt nicht erkannt
Frage, ob die Integration zwischen Cloudflare und der App eine maßgeschneiderte Funktion über Standard-Turnstile hinaus ist oder ob sie nur Enterprise-Kunden zur Verfügung steht