Zum Inhalt springen

Wie Bot-Erkennung funktioniert – und warum Clearcote die Engine patcht

Der übliche Ansatz patcht navigator.webdriver, spooft den WebGL-Vendor und überschreibt navigator.plugins per Skript. Erkennungssysteme schlagen trotzdem an – und der Grund ist struktureller Natur, nicht eine weitere Eigenschaft, die übersehen wurde.

Kohärenz, gezeichnet: Unabhängige Signale, die einander bestätigen, ergeben zusammen eine einzige Identität. Die beiden unverbundenen Punkte – ein gespoofter Wert, hinter dem nichts steht – sind die Nahtstelle, an der ein Abgleich ansetzt.

Ein JavaScript-Spoof verrät sich selbst

Ein JS-Spoof ist eine Funktion an einer Stelle, an die eine native gehört. Ein Erkennungsskript lässt den zurückgegebenen Wert beiseite und prüft, ob das, was ihn zurückgibt, nativ ist:

Das IndizWarum es einen JS-Spoof entlarvt
Selbstverrat über toStringEine native Methode ergibt als String function get vendor() { [native code] }; ein Override liefert seinen eigenen Quelltext – ein einziges .toString() entlarvt ihn.
Deskriptor / hasOwnPropertygetOwnPropertyDescriptor legt umdefinierte Properties offen, und hasOwnProperty('toString') liefert bei einer manipulierten Funktion true, wo eine native false liefert.
TypeError bei falschem thisNative Getter werfen bei falschem Receiver einen ganz bestimmten TypeError; ein naiver Shim bleibt still – und genau diese Stille ist das Signal.
Frische Referenz aus einem anderen RealmEin Erkennungsskript holt sich ein unberührtes Function.prototype.toString aus einem frischen iframe oder Web Worker und wendet es auf Ihren Getter an – aus einem anderen Realm als dem Ihres Main-World-Patches. Heraus kommt Ihr Quelltext. Erwischt.

Clearcote hat keine solche Schicht. Der Getter für navigator.userAgent ist der C++-Getter: Er meldet [native code], weil er nativer Code ist, identisch in jedem Realm – ob Main Frame, iframe oder Worker. Es gibt kein JavaScript-Hijacking, das sich erkennen ließe.

Die drei Ebenen der Bot-Erkennung

Moderne Anti-Bot-Systeme lesen drei strukturell verschiedene Oberflächen aus, an drei getrennten Stellen. Ein einzelnes Tool deckt selten alle drei ab:

EbeneDie IndizienWo die Lösung ansetztClearcote
A · Treiber / Binarycdc_-Variablen von ChromeDriver, die Oberfläche des WebDriver-ProtokollsDirekt über CDP steuern, chromedriver weglassen✅ ein schlichtes Chromium-Binary – keine Treiber-Artefakte
B · CDP-NebeneffekteLeaks durch Runtime.enable, injizierte Init-Skripte, Ausführung in der Main World, der Standard-Viewport von AutomatisierungstoolsDie Steuerungs- bzw. CDP-Client-Schicht✅ die Engine neutralisiert das Leak durch Runtime.enable, das SDK injiziert standardmäßig keine Skripte, und die Start-Defaults vermeiden den Standard-Viewport von Automatisierungstools (wo Ihr Client eigene Skripte ausführt, bleibt ihm überlassen)
C · Fingerprint-OberflächeCanvas, WebGL, Audio, Schriften, navigator, TLS – über Main Frame, iframes und Worker hinwegDie Engine (C++), weil JS-Overrides sich selbst verraten✅ genau das ist Clearcote

Worauf es am meisten ankommt: keine Naht zwischen Spoof und Realität

Weil die Steuerung in der Engine sitzt, stammen das JavaScript, das eine Seite sieht, und der Netzwerk-Handshake darunter aus ein und demselben echten Chromium. Es gibt keine Naht zwischen gespooftem JS und echtem TLS, die ein Abgleich aufdecken könnte – genau die Schwachstelle, an der injektionsbasierte Tools auffliegen. Ein --fingerprint-Seed erzeugt eine einzige, in sich konsistente Maschine über Canvas, WebGL, Audio, Schriften und Hardware hinweg. Der TLS- und HTTP/2-Handshake darunter stammt von der Engine selbst, und er passt, weil die Persona genau die Version meldet, die die Engine tatsächlich ist – lassen Sie brandVersion ungesetzt, damit das so bleibt.

Und wenn das Rauschen selbst das Indiz ist, schalten Sie es ab – Canvas und WebGL liefern dann ihre natürlichen Werte, während der Identitäts-Spoof aktiv bleibt (gerendertes Audio und Client-Rects werden ohnehin nie verrauscht, und die Skalare für Rate und Latenz des AudioContext folgen weiterhin der Persona; warum, steht hier):

javascript
await launch({ fingerprint: "u1", fingerprintNoise: false });   // identity on, per-site farbling off

Ohne Rauschen teilen sich Identitäten auf demselben Rechner einen Canvas-Hash. canvasNoise: false schaltet nur Canvas 2D ab und behält das WebGL-Rauschen bei (lizenzierter Build, 150 r12+).

Kohärenz von Netzwerk und Locale

Die Persona ist nur die halbe Miete: Auch Zeitzone, Sprache und WebRTC-Adresse müssen zu dem Ort passen, von dem der Traffic kommt. Hinter einem Proxy starten Sie mit geoip – das SDK ermittelt die Exit-IP des Proxys, setzt Zeitzone, Sprachliste, Geolocation und WebRTC-Adresse für diese Region und bricht den Start ab, wenn es keine Region ermitteln kann. Ohne diese Option folgt die Zeitzone der Sprache (en-US bedeutet New York), egal in welchem Land der Proxy steht. Die Optionen finden Sie unter Playwright & Puppeteer.

Deshalb patcht Clearcote die C++-Engine, statt JavaScript zu injizieren. Was Sie steuern können, steht unter Fingerprint-Flags; wie die Engine alle Signale gemeinsam kohärent hält, unter Architektur.