Zum Inhalt springen
OmniRoute source

Stealth Guide (Deutsch)

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 von FETCH_TIMEOUT_MS geerbt, 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, sodass TLS_CLIENT_TIMEOUT_MS allein keinen Body begrenzen kann, der nie ein erstes Byte liefert. guardTlsFirstByte() lässt den ersten read()-Aufruf des Bodys gegen TLS_FIRST_BYTE_WATCHDOG_MS laufen (Standardwert 10000, 0 deaktiviert ihn); ein fehlerfreier Body bleibt unbeeinträchtigt, während bei einem blockierten Body der wreq-Reader abgebrochen wird und die bestehende TLS-Fallback-Logik von proxyFetch zum 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).
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-ReadableStream direkt 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 403 und HTML-Zwischenseiten 502 zu.
  • 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über arena.ai auf.
  • byteResponse gibt eine mit einem Inhaltstyp versehene data:-URL ohne UTF-8-Beschädigung zurück.
  • Fehler sind TlsClientUnavailableError (Paket/Add-on nicht verfügbar), TlsClientHangError (Deadline überschritten) und WreqTransportCapacityError (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.


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:

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

Serverseitige Integritätsprüfung, die die offizielle Claude Code CLI über Bun/Zig berechnet. OmniRoute implementiert sie mit xxhash-wasm neu:

  1. Body mit dem Platzhalter cch=00000; serialisieren
  2. xxhash64(bytes, seed) & 0xFFFFF
  3. Mit Nullen aufgefüllte, 5-stellige Hex-Zeichenfolge in Kleinbuchstaben
  4. cch=00000; durch das berechnete Token ersetzen

Konstanten:

  • Seed: 0x6e52736ac806831e
  • Muster: /\bcch=([0-9a-f]{5});/

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, codecompanion

Angewendet 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-12 hinzu, wenn ein CC-Compatible-Upstream ausdrücklich Streams mit redigiertem Thinking erfordert
  • Der verbindungsspezifische Schalter „Enable summarized thinking display“ speichert providerSpecificData.requestDefaults.summarizeThinking und 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-Steuerung
  • claudeCodeToolRemapper.ts — Neuzuordnung von Toolnamen
  • claudeCodeExtraRemap.ts — zusätzliche Normalisierung der Nutzlast

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.

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:

  1. Behalten Sie die Standardeinstellung ANTIGRAVITY_CREDITS=off bei, sofern der Betreiber das Risiko kostenpflichtiger Guthaben und kontobezogener Durchsetzungsmaßnahmen nicht ausdrücklich akzeptiert. retry sendet zunächst die normale Anfrage und injiziert Guthaben höchstens einmal nach einer zulässigen kontingentbedingten 429-Antwort; always injiziert Guthaben bereits bei der ersten Anfrage.
  2. Verteilen Sie die Last über Auto-Combo auf mehrere Provider (model: "auto" oder kr/glm/etc-Combo), anstatt ein einzelnes Antigravity-Konto auszulasten.
  3. 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.
  4. Verwenden Sie eine stabile, vom Betreiber kontrollierte Upstream-Netzwerkanbindung und vermeiden Sie es, ein Konto für voneinander unabhängige Benutzer oder Workloads freizugeben.
  5. 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 mit quota_exceeded / service disabled an. 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 — liest process.env.ANTIGRAVITY_CREDITS
  • src/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.


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).

  1. Selbstsigniertes Zertifikat über selfsigned erzeugen (RSA-2048, SHA-256, 1 Jahr) — cert/generate.ts
  2. Zertifikat im Vertrauensspeicher des Systems installieren — cert/install.ts
  3. Hosts-Eintrag 127.0.0.1 daily-cloudcode-pa.googleapis.com hinzufügen — dns/dnsConfig.ts
  4. src/mitm/server.cjs mit ROUTER_API_KEY + MITM_LOCAL_PORT starten (Standardwert: 443)
  5. PID unter <DATA_DIR>/mitm/.mitm.pid speichern

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: security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain
  • Windows: PowerShell mit erhöhten Rechten → certutil -addstore Root

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.


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“
  1. Offiziellen CLI-Datenverkehr mit mitmproxy erfassen (TLS-Abfangen + Dump)
  2. JA3/JA4 und die exakte Header-Reihenfolge extrahieren
  3. Den entsprechenden Eintrag CLI_FINGERPRINTS[...] aktualisieren
  4. Den passenden Standardwert *_USER_AGENT in .env.example aktualisieren
  5. Falls sich der TLS-Handshake selbst geändert hat, den entsprechenden Anbieter-Wrapper oder die wreq-js-Option browser: aktualisieren
  6. Die anbieterspezifischen TLS-Tests und einen manuellen Canary-Test gegen den Live-Anbieter ausführen
  7. In einem Patch-Release ausliefern und in CHANGELOG.md dokumentieren

  • open-sse/services/__tests__/claudeTlsClient.test.ts — Verhalten des gemeinsam genutzten TLS-Wrappers
  • tests/unit/anthropic-cache-fingerprint.test.ts — Determinismus des Fingerabdrucks
  • tests/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


OmniRoute-Quellcode (a58000c7685f)

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.

HagiCode-Hauptoberfläche im hellen Design
  • 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.
HagiCode besuchen