Stealth Guide (Deutsch)
TLS-Fingerprinting-Schicht
Abschnitt betitelt „TLS-Fingerprinting-Schicht“open-sse/utils/tlsClient.ts — wreq-js (Chrome 124)
Abschnitt betitelt „open-sse/utils/tlsClient.ts — wreq-js (Chrome 124)“Persistente wreq-js-Sitzungen werden verzögert pro Kontobereich und aufgelöstem Proxy erstellt. Die
prozessweiten TlsClient-Pools enthalten höchstens 128 Sitzungen, die für
vorgelagerte Systeme hinter Cloudflare Chrome 124 unter macOS imitieren. TlsClient.fetch() schlägt geschlossen fehl, wenn die native Laufzeitumgebung
nicht verfügbar ist; ein Aufrufer kann außerhalb dieses Wrappers explizit einen Fallback auswählen.
- Sitzungsprofil:
browser: "chrome_124", os: "macos" - Proxy-Auflösung (Priorität):
HTTPS_PROXY→HTTP_PROXY→ALL_PROXY(auch in Kleinschreibung) - Zeitüberschreitung:
TLS_CLIENT_TIMEOUT_MS(wird vonFETCH_TIMEOUT_MSgeerbt, Standardwert 600000) - Die
wreq-js-Response ist Fetch-kompatibel (headers,text(),json(),clone(),body). - Watchdog für das erste Byte (
open-sse/utils/tlsFirstByteWatchdog.ts, #12656):TlsClient.fetch()wird aufgelöst, sobald die vorgelagerten Header eintreffen, sodassTLS_CLIENT_TIMEOUT_MSallein keinen Body begrenzen kann, der nie ein erstes Byte liefert.guardTlsFirstByte()lässt den erstenread()-Aufruf des Bodys gegenTLS_FIRST_BYTE_WATCHDOG_MSlaufen (Standardwert10000,0deaktiviert ihn); ein fehlerfreier Body bleibt unbeeinträchtigt, während bei einem blockierten Body der wreq-Reader abgebrochen wird und die bestehende TLS-Fallback-Logik vonproxyFetchzum direkten/Proxy-Dispatcher weiterlaufen kann (eine nicht wiederholungssichere Anfrage, z. B. ein POST mit einem Body, löst weiterhin einen Fehler aus, statt unbemerkt wiederholt zu werden).
Transport für Web-Cookie-Anbieter — wreq-js 3.2.0
Abschnitt betitelt „Transport für Web-Cookie-Anbieter — wreq-js 3.2.0“open-sse/services/tlsClientBase.ts ist der gemeinsam genutzte Adapter für die fünf nachfolgend aufgeführten spezialisierten
Web-Cookie-Transporte. Jeder schlanke Anbieter-Wrapper wählt ein Browser-/Betriebssystemprofil aus. Der Adapter
verwendet den zentralen wreq-Laufzeitlader und Transport-Pool in open-sse/utils/tlsClient.ts, indiziert nach
Profil + Betriebssystem + aufgelöstem Proxy, während jede Anfrage cookieMode: "ephemeral" verwendet. Konten und
Anfragen teilen sich daher Verbindungen auf Transportebene, jedoch niemals eine wreq-Sitzung oder einen Cookie-Speicher.
| Anbieter | Profil | Emuliertes Betriebssystem | Richtlinie für Stream-EOF |
|---|---|---|---|
| Claude | chrome_146 |
Linux | [DONE] einschließen |
| Perplexity | firefox_148 |
macOS | event: end_of_stream einschließen |
| Grok | chrome_146 |
Linux | [DONE] ausschließen |
| Notion | chrome_146 |
Windows | [DONE] einschließen |
| LMArena | chrome_146 |
Windows | kein Sentinel; bei nativem EOF schließen |
- Beim Streaming wird der native Response-
ReadableStreamdirekt verarbeitet; es wird keine temporäre Datei und kein Sidecar erstellt. - Bis zu 256 anfängliche Bytes werden geprüft, bevor ein Stream bereitgestellt wird. SSE-Anbieter puffern Nicht-SSE-
Fehler; Grok/LMArena ordnen Cloudflare-Challenges
403und HTML-Zwischenseiten502zu. - Die native Anfragezeitüberschreitung bleibt von einer absoluten harten JS-Deadline umschlossen. Bei einem Hänger wird nur der betroffene Profil-/Betriebssystem-/Proxy-Transport invalidiert und geschlossen, bevor er bei der nächsten Anfrage neu erstellt wird.
- Die Priorität der Proxy-Auflösung lautet: pro Aufruf gesetzte
proxyUrl→ anfragebezogener Konto-/Dashboard-Kontext →HTTPS_PROXY/HTTP_PROXY/ALL_PROXY(einschließlich Varianten in Kleinschreibung). Auflösungsfehler schlagen geschlossen fehl, statt eine direkte Verbindung offenzulegen. LMArena löst absichtlich gegenüberarena.aiauf. byteResponsegibt eine mit einem Inhaltstyp versehenedata:-URL ohne UTF-8-Beschädigung zurück.- Fehler sind
TlsClientUnavailableError(Paket/Add-on nicht verfügbar),TlsClientHangError(Deadline überschritten) undWreqTransportCapacityError(der gemeinsam genutzte Fehlercode für die Sitzungskapazität), wenn alle 128 begrenzten Profil-/Betriebssystem-/Proxy-Slots aktiv sind oder geschlossen werden.
Die oben beschriebene generische TlsClient-Sitzung bleibt auf persistenten, browsergestützten Cookie-
Zustand spezialisiert. Beide Pfade verwenden denselben zwischengespeicherten wreq-Modullader und Prozesslebenszyklus-Hook; ihre Pools bleiben
getrennt, da ihre Cookie-Lebensdauern bewusst unterschiedlich sind.
Die Profile werden vom angehefteten Paket unterstützt, die tatsächliche WAF-Akzeptanz kann sich jedoch unabhängig von lokalen Vertragstests ändern. Validieren Sie Fingerprint-Änderungen anhand eines ausdrücklich autorisierten Live-Kontos, bevor Sie Parität mit einem vorgelagerten Browser beanspruchen.
Claude-Code-Stealth-Bundle
Abschnitt betitelt „Claude-Code-Stealth-Bundle“Wenn cliCompatMode aktiviert ist, formt OmniRoute ausgehende Claude-Anfragen so um, dass sie nicht von claude-cli-Datenverkehr zu unterscheiden sind. Drei Module arbeiten dabei zusammen:
claudeCodeFingerprint.ts
Abschnitt betitelt „claudeCodeFingerprint.ts“Berechnet den 3-stelligen cc_version-Fingerabdruck, der in den Abrechnungs-Header eingebettet wird:
SHA256(SALT + msg[4] + msg[7] + msg[20] + version)[:3]FINGERPRINT_SALT = "59cf53e54c78"(fest codiert; entspricht dem offiziellen Client)- Eingaben: Zeichen an Index 4, 7 und 20 des Textes der ersten Benutzernachricht + Versionszeichenfolge
- Ausgabe: 3-stelliges Hex-Präfix
claudeCodeCCH.ts (Client Content Hash)
Abschnitt betitelt „claudeCodeCCH.ts (Client Content Hash)“Serverseitige Integritätsprüfung, die die offizielle Claude Code CLI über Bun/Zig berechnet. OmniRoute implementiert sie mit xxhash-wasm neu:
- Body mit dem Platzhalter
cch=00000;serialisieren xxhash64(bytes, seed) & 0xFFFFF- Mit Nullen aufgefüllte, 5-stellige Hex-Zeichenfolge in Kleinbuchstaben
cch=00000;durch das berechnete Token ersetzen
Konstanten:
- Seed:
0x6e52736ac806831e - Muster:
/\bcch=([0-9a-f]{5});/
claudeCodeObfuscation.ts
Abschnitt betitelt „claudeCodeObfuscation.ts“Fügt nach dem ersten Zeichen „sensibler“ Clientnamen einen Unicode-Zero-Width Joiner (U+200D) ein, sodass vorgeschaltete Filter sie nicht per grep finden können. Standardwortliste:
opencode, open-code, cline, roo-cline, roo_cline, cursor, windsurf,aider, continue.dev, copilot, avante, codecompanionAngewendet auf: system-Blöcke, alle messages[].content sowie tools[].description / tools[].function.description. Kann vom Betreiber über setSensitiveWords() überschrieben werden.
claudeCodeCompatible.ts — anthropic-compatible-cc-*-Provider
Abschnitt betitelt „claudeCodeCompatible.ts — anthropic-compatible-cc-*-Provider“Für Anthropic-Relays von Drittanbietern, die ausschließlich „echten Claude-Code“-Datenverkehr akzeptieren:
CLAUDE_CODE_COMPATIBLE_USER_AGENT = "claude-cli/2.1.258 (external, sdk-cli)"CLAUDE_CODE_COMPATIBLE_STAINLESS_PACKAGE_VERSION = "0.112.1"CLAUDE_CODE_COMPATIBLE_STAINLESS_RUNTIME_VERSION = "v26.3.0"anthropic-beta = "claude-code-20250219,interleaved-thinking-2025-05-14,effort-2025-11-24"standardmäßig- Der verbindungsspezifische Schalter „Enable redact-thinking beta“ fügt
redact-thinking-2026-02-12hinzu, wenn ein CC-Compatible-Upstream ausdrücklich Streams mit redigiertem Thinking erfordert - Der verbindungsspezifische Schalter „Enable summarized thinking display“ speichert
providerSpecificData.requestDefaults.summarizeThinkingund fügt CC-Compatible-Thinking-Anfragen, für die noch kein Anzeigemodus festgelegt wurde,display: "summarized"hinzu CONTEXT_1M_BETA_HEADER = "context-1m-2025-08-07"(Opus-/Sonnet-4.x-Familie)- Standardpfad:
/v1/messages?beta=true
Zugehörige Module im selben Bundle:
claudeCodeConstraints.ts— Regeln für Temperatur und Cache-SteuerungclaudeCodeToolRemapper.ts— Neuzuordnung von ToolnamenclaudeCodeExtraRemap.ts— zusätzliche Normalisierung der Nutzlast
Antigravity-Stealth
Abschnitt betitelt „Antigravity-Stealth“Antigravity-Anfragen bewahren den Text des Aufrufers Byte für Byte. OmniRoute fügt weder unsichtbare Zeichen in Prompts ein noch benennt es Tools um oder injiziert sie, um einen IDE-Client zu imitieren.
antigravityHeaderScrub.ts
Abschnitt betitelt „antigravityHeaderScrub.ts“Entfernt vor der Weiterleitung Markierungen des Stainless SDK (x-stainless-lang, x-stainless-package-version, x-stainless-os, x-stainless-arch, x-stainless-runtime, x-stainless-runtime-version, x-stainless-timeout, x-stainless-retry-count, x-stainless-helper-method).
⚠️ Risiko: ANTIGRAVITY_CREDITS=always (besonders hohes Kontosperrungsrisiko)
Abschnitt betitelt „⚠️ Risiko: ANTIGRAVITY_CREDITS=always (besonders hohes Kontosperrungsrisiko)“ANTIGRAVITY_CREDITS=always (verarbeitet von open-sse/executors/antigravity.ts) leitet jede Anfrage über Antigravity AI Credit Overages (kostenpflichtige Google-Guthaben) weiter, anstatt das Kontingent der kostenlosen Google-Stufe als Begrenzung wirken zu lassen. Dies ist als Funktion dokumentiert, stellt jedoch den mit Abstand häufigsten von uns beobachteten Bericht über Verstöße gegen die Nutzungsbedingungen dar — mehrere Google-Ultra-Konten wurden nach einigen Stunden Betrieb mit 403 / "service disabled for ToS violation" / insufficient_quota gesperrt, wenn =always verwendet wurde.
Die Durchsetzung auf Upstream-Seite erfolgt durch Google und kann von OmniRoute nicht verhindert werden. Der Name der Umgebungsvariable und die vorhandene Dokumentation lassen die Option wie eine sichere Einstellung erscheinen; das ist sie nicht.
Warum dies die Missbrauchserkennung aggressiver auslöst als eine ausschließliche Nutzung der kostenlosen Stufe:
- Kontinuierliche automatisierte Ausgaben über ein einzelnes Google-Konto werden anders eingestuft als eine kostenlose Nutzung, die beim Erreichen des Kontingents endet.
- Guthabenüberschreitungen haben keine Ratenobergrenze. Daher kann ein falsch konfigurierter Client innerhalb weniger Minuten mehrere hundert USD verbrauchen und wie ein Weiterverkauf von API-Schlüsseln oder Bot-Datenverkehr wirken.
- Wenn mehrere OmniRoute-Benutzer parallel von derselben externen IP auf Überschreitungsguthaben zugreifen, verstärkt dies das Signal.
Empfohlene Vorgehensweise:
- Behalten Sie die Standardeinstellung
ANTIGRAVITY_CREDITS=offbei, sofern der Betreiber das Risiko kostenpflichtiger Guthaben und kontobezogener Durchsetzungsmaßnahmen nicht ausdrücklich akzeptiert.retrysendet zunächst die normale Anfrage und injiziert Guthaben höchstens einmal nach einer zulässigen kontingentbedingten 429-Antwort;alwaysinjiziert Guthaben bereits bei der ersten Anfrage. - Verteilen Sie die Last über Auto-Combo auf mehrere Provider (
model: "auto"oderkr/glm/etc-Combo), anstatt ein einzelnes Antigravity-Konto auszulasten. - Legen Sie verbindungsspezifische RPM-Limits fest – auf der Bearbeitungsseite des Antigravity-Providers (Dashboard → Providers → Antigravity → connection → rate limit). 30–60 RPM sind eine vertretbare Obergrenze für den Dauerbetrieb.
- Verwenden Sie eine stabile, vom Betreiber kontrollierte Upstream-Netzwerkanbindung und vermeiden Sie es, ein Konto für voneinander unabhängige Benutzer oder Workloads freizugeben.
- Bei einer Sperrung: Legen Sie über
support.google.com→ „Restore Workspace/Account access“ Einspruch ein und geben Sie dabei den exakten von Google gesendeten Antwort-Body mitquota_exceeded/service disabledan. Eine Wiederherstellung ist nicht garantiert.
Die Referenz zu den Umgebungsvariablen dokumentiert die Auswirkungen der einzelnen Guthabenmodi auf Konto und Ausgaben.
Berührungspunkte:
open-sse/executors/antigravity.ts— liestprocess.env.ANTIGRAVITY_CREDITSsrc/lib/oauth/providers/antigravity.ts— Anmeldedaten-Weiterleitung- Ursprünglicher Vorfallbericht: Diskussion #1183
CLI-Fingerprint-Registry — open-sse/config/cliFingerprints.ts
Abschnitt betitelt „CLI-Fingerprint-Registry — open-sse/config/cliFingerprints.ts“Anbieterspezifische Tabelle, die die exakte Reihenfolge der Header und der JSON-Body-Felder festlegt, wie sie aus mitmproxy-Traces der offiziellen CLIs erfasst wurde. Derzeit registriert: codex, claude sowie zur Laufzeit abgeleitete Profile in providerHeaderProfiles.ts für antigravity und github.
interface CliFingerprint { headerOrder: string[]; // Groß-/Kleinschreibung beachten bodyFieldOrder: string[]; // JSON-Schlüssel auf oberster Ebene userAgent?: string | (() => string); extraHeaders?: Record<string, string>;}Kann je Anbieter über Umgebungsvariablen aktiviert oder deaktiviert werden (siehe unten). Wenn dies deaktiviert ist, erscheinen Header und Body-Schlüssel in der Reihenfolge, die Node/JSON vorgibt — dadurch sind sie leicht per Fingerprinting identifizierbar.
MITM-Proxy (Antigravity, Linux/macOS/Windows)
Abschnitt betitelt „MITM-Proxy (Antigravity, Linux/macOS/Windows)“Für CLIs, deren Binärdateien nicht über OPENAI_BASE_URL umgeleitet werden können, führt OmniRoute einen lokalen TLS-terminierenden Proxy aus. Die Endpunkte befinden sich unter src/app/api/cli-tools/antigravity-mitm/.
| Methode | Endpunkt | Zweck |
|---|---|---|
| GET | /api/cli-tools/antigravity-mitm |
Status — läuft, pid, dnsConfigured, certExists |
| POST | /api/cli-tools/antigravity-mitm |
MITM starten (erfordert apiKey + sudoPassword) |
| DELETE | /api/cli-tools/antigravity-mitm |
MITM stoppen |
| GET | /api/cli-tools/antigravity-mitm/alias |
Modellaliase auflisten |
| PUT | /api/cli-tools/antigravity-mitm/alias |
Modellaliase für ein Tool speichern |
Abgefangener Zielhost: daily-cloudcode-pa.googleapis.com (Antigravity-Upstream).
Startsequenz (src/mitm/manager.ts::startMitm)
Abschnitt betitelt „Startsequenz (src/mitm/manager.ts::startMitm)“- Selbstsigniertes Zertifikat über
selfsignederzeugen (RSA-2048, SHA-256, 1 Jahr) —cert/generate.ts - Zertifikat im Vertrauensspeicher des Systems installieren —
cert/install.ts - Hosts-Eintrag
127.0.0.1 daily-cloudcode-pa.googleapis.comhinzufügen —dns/dnsConfig.ts src/mitm/server.cjsmitROUTER_API_KEY+MITM_LOCAL_PORTstarten (Standardwert:443)- PID unter
<DATA_DIR>/mitm/.mitm.pidspeichern
Dynamische Erkennung des Vertrauensspeichers unter Linux — cert/install.ts
Abschnitt betitelt „Dynamische Erkennung des Vertrauensspeichers unter Linux — cert/install.ts“getLinuxCertConfig() durchläuft eine Prioritätenliste und wählt das erste vorhandene Verzeichnis aus:
| Distributionsfamilie | Verzeichnis | Aktualisierungsbefehl |
|---|---|---|
| Debian / Ubuntu | /usr/local/share/ca-certificates |
update-ca-certificates |
| Arch / CachyOS / Manjaro | /etc/ca-certificates/trust-source/anchors |
update-ca-trust |
| Fedora / RHEL / CentOS | /etc/pki/ca-trust/source/anchors |
update-ca-trust |
| openSUSE | /etc/pki/trust/anchors |
update-ca-certificates |
Zertifikatsdateiname: omniroute-mitm.crt. Fingerprint-Abgleich über getCertFingerprint() (SHA-1 des DER-Formats).
Zusätzlich installiert updateNssDatabases() das Zertifikat in benutzerspezifischen NSS-Datenbanken, wenn certutil verfügbar ist: ~/.pki/nssdb, ~/snap/chromium/.../nssdb, alle Firefox-Profile (einschließlich snap), unter dem Anzeigenamen OmniRoute MITM Root CA.
macOS / Windows
Abschnitt betitelt „macOS / Windows“- macOS:
security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain - Windows: PowerShell mit erhöhten Rechten →
certutil -addstore Root
Authentifizierung
Abschnitt betitelt „Authentifizierung“Alle MITM-Endpunkte erfordern eine Verwaltungs-Authentifizierung (requireCliToolsAuth). Das sudo-Passwort wird im Modul-Scope zwischengespeichert (niemals in globalThis) und bei stopMitm() gelöscht.
User-Agent-Überschreibungen — Umgebungsvariablen (.env.example Abschnitt 12)
Abschnitt betitelt „User-Agent-Überschreibungen — Umgebungsvariablen (.env.example Abschnitt 12)“| Variable | Standardwert |
|---|---|
CLAUDE_USER_AGENT |
claude-cli/2.1.258 (external, cli) |
CODEX_USER_AGENT |
codex-cli/0.155.0 (Windows 10.0.26200; x64) |
GITHUB_USER_AGENT |
GitHubCopilotChat/0.54.0 |
ANTIGRAVITY_USER_AGENT |
antigravity/2.0.1 linux/arm64 google-api-nodejs-client/10.3.0 |
KIRO_USER_AGENT |
AWS-SDK-JS/3.0.0 kiro-ide/1.0.0 |
QODER_USER_AGENT |
Qoder-Cli |
CURSOR_USER_AGENT |
Cursor/3.4 |
Wird von open-sse/executors/base.ts::buildHeaders() über eine dynamische Suche verwendet. Aktualisieren Sie diese Werte, wenn Anbieter neue CLI-Versionen veröffentlichen — veraltete UA-Zeichenfolgen werden zunehmend mit der Begründung abgelehnt, dass die Clients nicht mehr aktuell sind.
Umschalter für den CLI-Kompatibilitätsmodus (.env.example Abschnitt 13)
Abschnitt betitelt „Umschalter für den CLI-Kompatibilitätsmodus (.env.example Abschnitt 13)“| Variable | Wirkung |
|---|---|
CLI_COMPAT_CODEX=1 |
Codex-Fingerabdruck |
CLI_COMPAT_CLAUDE=1 |
claude-cli-Fingerabdruck |
CLI_COMPAT_GITHUB=1 |
GitHub-Copilot-Chat-Fingerabdruck |
CLI_COMPAT_ANTIGRAVITY=1 |
Antigravity-Fingerabdruck |
CLI_COMPAT_KIRO=1 |
Kiro |
CLI_COMPAT_CURSOR=1 |
Cursor |
CLI_COMPAT_KIMI_CODING=1 |
Kimi Coding |
CLI_COMPAT_KILOCODE=1 |
KiloCode |
CLI_COMPAT_CLINE=1 |
Cline |
CLI_COMPAT_ALL=1 |
Alle oben genannten Optionen aktivieren |
Die Anbieter-IP bleibt immer erhalten — der Umschalter verändert lediglich das Übertragungsbild der Anfrage; er wechselt nicht den IP-Ausgang.
Bereinigung eingehender Header
Abschnitt betitelt „Bereinigung eingehender Header“OmniRoute bereinigt eingehende Client-Header vor der Weiterleitung, damit bei einer von Cursor eingehenden Anfrage nicht User-Agent: Cursor/X.Y.Z an einen Claude-Upstream weitergegeben wird. Die Negativliste finden Sie unter src/shared/constants/upstreamHeaders.ts; sie wird mit den Zod-Schemas und Unit-Tests synchron gehalten.
Aktualisieren von Fingerabdrücken bei Änderungen durch einen Anbieter
Abschnitt betitelt „Aktualisieren von Fingerabdrücken bei Änderungen durch einen Anbieter“- Offiziellen CLI-Datenverkehr mit
mitmproxyerfassen (TLS-Abfangen + Dump) - JA3/JA4 und die exakte Header-Reihenfolge extrahieren
- Den entsprechenden Eintrag
CLI_FINGERPRINTS[...]aktualisieren - Den passenden Standardwert
*_USER_AGENTin.env.exampleaktualisieren - Falls sich der TLS-Handshake selbst geändert hat, den entsprechenden Anbieter-Wrapper oder die wreq-js-Option
browser:aktualisieren - Die anbieterspezifischen TLS-Tests und einen manuellen Canary-Test gegen den Live-Anbieter ausführen
- In einem Patch-Release ausliefern und in
CHANGELOG.mddokumentieren
open-sse/services/__tests__/claudeTlsClient.test.ts— Verhalten des gemeinsam genutzten TLS-Wrapperstests/unit/anthropic-cache-fingerprint.test.ts— Determinismus des Fingerabdruckstests/unit/chatgpt-web-source-retirement.test.ts— stellt sicher, dass die gemeinsame ChatGPT-Web-Stealth-Quelle weiterhin nicht vorhanden ist, während Codex Web bestehen bleibt
Siehe auch
Abschnitt betitelt „Siehe auch“- RESILIENCE_GUIDE.md — was passiert, wenn ein Stealth-Pfad einen
403-Fehler erhält - TROUBLESHOOTING.md
- ENVIRONMENT.md — vollständige Referenz der Umgebungsvariablen
- CLI-TOOLS.md — Bedienerperspektive auf den MITM-Workflow
HagiCode
HagiCode ist ein agentischer Coding-Arbeitsplatz mit strukturierten Workflows, Multi-Agent-Ausführung und Hero-Dungeon-Ansichten.
Mit einem intelligenteren, schnelleren und unterhaltsameren agentischen Workflow wird aus Ideen nutzbare Software.

- SmartStrukturierte Workflows machen aus Absichten einen umsetzbaren Weg von der Idee bis zur Auslieferung.
- EfficientMulti-Agent-Workflows führen Recherche, Umsetzung und Prüfung parallel aus.
- FunHero Dungeon macht lange Coding-Sitzungen anschaulich und gemeinschaftlich.