Files
OmniRoute/docs/i18n/nl/docs/security/STEALTH_GUIDE.md
Diego Rodrigues de Sa e Souza 8feea123bb feat(docs): mirror every docs/ page in all 65 locales (#14106)
* feat(docs): mirror every docs/ page in all 65 locales

Extends the documentation mirrors from the 22-page core set (#13940) to
every Markdown page under docs/: 152 sources x 65 locales = 9,880 mirrors
(6,208 new), language bars rewritten for the full locale list, state
adopted so the blocking drift gate now covers all 152 pages.

run-translation.mjs: an oversized block made only of table rows or list
items (PROVIDER_REFERENCE.md 244-row table, FREE_TIERS.md 71-item list) is
cut at item boundaries and rejoined without a blank line — the single
16-40 KB request outlived the backend socket for verbose scripts. 48
older mirrors whose tables had lost rows were retranslated with --force.

* docs(i18n): refresh mirrors for the sources the base changed since the branch cut

Section-level retranslation of the 29 docs (and README.md) whose source
or mirrors moved on release/v3.8.51 during the run, then state adoption;
the drift gate is green again on the merged tree.
2026-09-18 13:16:46 -03:00

24 KiB
Raw Blame History

Stealth Guide (Nederlands)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW


Waarheidsbron: open-sse/utils/tlsClient.ts, open-sse/services/{tlsClientBase,claudeTlsClient,perplexityTlsClient,grokTlsClient,notionTlsClient,lmarenaTlsClient,claudeCodeCCH,claudeCodeFingerprint,claudeCodeObfuscation,claudeCodeCompatible}.ts, open-sse/config/cliFingerprints.ts, src/mitm/ Laatst bijgewerkt: 2026-09-02 — v3.8.51 Doelgroep: Engineers die providerspecifieke stealth-integraties onderhouden.

OmniRoute integreert met providers waarvan de edge-infrastructuur actief niet-officiële clients fingerprint (TLS JA3/JA4, headervolgorde, vorm van de JSON-body, integriteitstokens). Deze pagina documenteert de stealth-oppervlakken die OmniRoute beschikbaar stelt en waar deze zijn geïmplementeerd.

Juridische en ethische kennisgeving

Stealth-functies bestaan zodat OmniRoute kan fungeren als compatibiliteitslaag tussen officiële accounts van gebruikers (Claude Code CLI, Codex, Antigravity, Cursor, enz.) en de uniforme API van OmniRoute. Ze zijn niet bedoeld om fraudedetectie te omzeilen, inloggegevens te delen of de servicevoorwaarden van providers te schenden. De beheerders verwachten dat operators zich houden aan de upstream-servicevoorwaarden waarmee ze bij het aanmaken van accounts hebben ingestemd.


TLS-fingerprintinglaag

open-sse/utils/tlsClient.ts — wreq-js (Chrome 124)

Permanente wreq-js-sessies worden per accountscope en opgeloste proxy lazy aangemaakt. De procesbrede TlsClient-pool bevat maximaal 128 sessies die zich voordoen als Chrome 124 op macOS voor upstreams achter Cloudflare. TlsClient.fetch() stopt veilig met een fout wanneer de native runtime niet beschikbaar is; een aanroeper kan buiten deze wrapper expliciet een fallback selecteren.

  • Sessieprofiel: browser: "chrome_124", os: "macos"
  • Proxyresolutie (prioriteit): HTTPS_PROXYHTTP_PROXYALL_PROXY (ook in kleine letters)
  • Time-out: TLS_CLIENT_TIMEOUT_MS (overgenomen van FETCH_TIMEOUT_MS, standaard 600000)
  • De wreq-js-respons is compatibel met fetch (headers, text(), json(), clone(), body).
  • Watchdog voor de eerste byte (open-sse/utils/tlsFirstByteWatchdog.ts, #12656): TlsClient.fetch() wordt voltooid zodra de upstreamheaders binnenkomen, waardoor TLS_CLIENT_TIMEOUT_MS alleen geen grens kan stellen aan een body die nooit een eerste byte oplevert. guardTlsFirstByte() laat de eerste read() van de body wedijveren met TLS_FIRST_BYTE_WATCHDOG_MS (standaard 10000; 0 schakelt deze uit); een gezonde body blijft onaangetast, terwijl bij een vastgelopen body de wreq-reader wordt geannuleerd en de bestaande TLS-fallbacklogica van proxyFetch kan terugvallen op de directe/proxydispatcher (een verzoek dat niet veilig opnieuw kan worden afgespeeld, bijvoorbeeld een POST met een body, genereert nog steeds een fout in plaats van stilzwijgend opnieuw te worden geprobeerd).

Transport voor webcookieproviders — wreq-js 3.2.0

open-sse/services/tlsClientBase.ts is de gedeelde adapter voor de vijf gespecialiseerde webcookietransporten hieronder. Elke dunne providerwrapper selecteert een browser-/OS-profiel. De adapter gebruikt de enkele wreq-runtimeloader en transportpool in open-sse/utils/tlsClient.ts, gesleuteld op profiel + OS + opgeloste proxy, terwijl elk verzoek cookieMode: "ephemeral" gebruikt. Accounts en verzoeken delen daardoor verbindingen op transportniveau, maar nooit een wreq-sessie of cookiejar.

Provider Profiel Geëmuleerd OS Beleid voor einde van stream
Claude chrome_146 Linux neem [DONE] op
Perplexity firefox_148 macOS neem event: end_of_stream op
Grok chrome_146 Linux sluit [DONE] uit
Notion chrome_146 Windows neem [DONE] op
LMArena chrome_146 Windows geen sentinel; sluit bij native EOF
  • Streaming verwerkt de native ReadableStream van de respons rechtstreeks; er wordt geen tijdelijk bestand of sidecar aangemaakt.
  • Er worden maximaal 256 initiële bytes geïnspecteerd voordat een stream beschikbaar wordt gesteld. SSE-providers bufferen niet-SSE-fouten; Grok/LMArena zetten Cloudflare-challenges om naar 403 en HTML-tussenpagina's naar 502.
  • De native time-out van het verzoek blijft ingekapseld door een absolute harde JS-deadline. Een vastgelopen verzoek maakt alleen het betrokken transport voor profiel/OS/proxy ongeldig en sluit dit voordat het bij het volgende verzoek opnieuw wordt aangemaakt.
  • De prioriteit voor proxyresolutie is per aanroep proxyUrl → verzoekgebonden account-/dashboardcontext → HTTPS_PROXY/HTTP_PROXY/ALL_PROXY (inclusief varianten in kleine letters). Resolutiefouten stoppen veilig met een fout in plaats van een directe verbinding te laten uitlekken. LMArena voert de resolutie bewust uit tegen arena.ai.
  • byteResponse retourneert een op inhoudstype gebaseerde data:-URL zonder UTF-8-corruptie.
  • Fouten zijn TlsClientUnavailableError (package/add-on niet beschikbaar), TlsClientHangError (deadline overschreden) en WreqTransportCapacityError (de gedeelde foutcode voor sessiecapaciteit) wanneer alle 128 begrensde profiel-/OS-/proxyslots actief zijn of worden gesloten.

De generieke TlsClient-sessie hierboven blijft gespecialiseerd voor permanente, browsergestuurde cookiestatus. Beide paden hergebruiken één gecachte wreq-moduleloader en proceslevenscyclushook; hun pools blijven gescheiden omdat hun cookielevensduren bewust verschillen.

De profielen worden door het vastgezette package ondersteund, maar daadwerkelijke WAF-acceptatie kan onafhankelijk van lokale contracttests veranderen. Valideer wijzigingen in fingerprints met een expliciet geautoriseerd liveaccount voordat je pariteit met een upstreambrowser claimt.


Claude Code Stealth-bundel

Wanneer cliCompatMode is ingeschakeld, past OmniRoute uitgaande Claude-verzoeken zo aan dat ze niet te onderscheiden zijn van claude-cli-verkeer. Drie modules werken hierbij samen:

claudeCodeFingerprint.ts

Berekent de 3 tekens lange cc_version-vingerafdruk die in de factureringsheader is opgenomen:

SHA256(SALT + msg[4] + msg[7] + msg[20] + version)[:3]
  • FINGERPRINT_SALT = "59cf53e54c78" (hardcoded; komt overeen met de officiële client)
  • Invoer: tekens op index 4, 7 en 20 van de tekst van het eerste gebruikersbericht + versietekenreeks
  • Uitvoer: hexadecimaal voorvoegsel van 3 tekens

claudeCodeCCH.ts (Client Content Hash)

Integriteitscontrole aan de serverzijde die de officiële Claude Code CLI via Bun/Zig berekent. OmniRoute implementeert deze opnieuw met xxhash-wasm:

  1. Serialiseer de body met de tijdelijke aanduiding cch=00000;
  2. xxhash64(bytes, seed) & 0xFFFFF
  3. Hexadecimale waarde van 5 kleine letters/tekens, links aangevuld met nullen
  4. Vervang cch=00000; door het berekende token

Constanten:

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

claudeCodeObfuscation.ts

Voegt een Unicode-zero-width joiner (U+200D) toe na het eerste teken van gevoelige clientnamen, zodat upstreamfilters er niet met grep naar kunnen zoeken. Standaardwoordenlijst:

opencode, open-code, cline, roo-cline, roo_cline, cursor, windsurf,
aider, continue.dev, copilot, avante, codecompanion

Toegepast op: system-blokken, alle messages[].content en tools[].description / tools[].function.description. Kan door de operator worden overschreven via setSensitiveWords().

claudeCodeCompatible.tsanthropic-compatible-cc-*-providers

Voor Anthropic-relays van derden die uitsluitend echt Claude Code-verkeer accepteren:

  • 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" standaard
  • De schakelaar Enable redact-thinking beta per verbinding voegt redact-thinking-2026-02-12 toe wanneer een CC Compatible-upstream specifiek geredigeerde redeneerstreams vereist
  • De schakelaar Enable summarized thinking display per verbinding slaat providerSpecificData.requestDefaults.summarizeThinking op en voegt display: "summarized" toe aan CC Compatible-redeneerverzoeken waarvoor nog geen weergavemodus was ingesteld
  • CONTEXT_1M_BETA_HEADER = "context-1m-2025-08-07" (Opus/Sonnet 4.x-familie)
  • Standaardpad: /v1/messages?beta=true

Gerelateerde modules in dezelfde bundel:

  • claudeCodeConstraints.ts — regels voor temperatuur en cachebeheer
  • claudeCodeToolRemapper.ts — hertoewijzing van toolnamen
  • claudeCodeExtraRemap.ts — aanvullende normalisatie van de payload

Antigravity Stealth

Antigravity-verzoeken behouden de tekst van de aanroeper byte voor byte. OmniRoute voegt geen zero-width-tekens toe aan prompts en hernoemt of injecteert geen tools om een IDE-client na te bootsen.

antigravityHeaderScrub.ts

Verwijdert Stainless SDK-markeringen (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) voordat het verzoek wordt doorgestuurd.

⚠️ Risico: ANTIGRAVITY_CREDITS=always (hoog risico op accountblokkering)

ANTIGRAVITY_CREDITS=always (gebruikt door open-sse/executors/antigravity.ts) routeert elk verzoek via Antigravity AI Credit Overages (betaalde Google-tegoeden), in plaats van de quota van Googles gratis abonnement als begrenzing te gebruiken. Dit is als functie gedocumenteerd, maar het is veruit de meest voorkomende melding van een ToS-schending die we zien — meerdere Google Ultra-accounts zijn geblokkeerd met 403 / "service disabled for ToS violation" / insufficient_quota nadat ze enkele uren met =always hadden gedraaid.

De upstreamhandhaving vindt plaats aan de kant van Google en kan niet door OmniRoute worden voorkomen. De naam van de omgevingsvariabele en de bestaande documentatie wekken de indruk dat dit een veilige instelling is om in te schakelen; dat is niet zo.

Waarom dit agressievere misbruikdetectie veroorzaakt dan uitsluitend gebruik van het gratis abonnement:

  • Aanhoudende geautomatiseerde uitgaven op één Google-account worden anders gemarkeerd dan gebruik waarbij het gratis abonnement het quotum bereikt en vervolgens stopt.
  • Overschrijdingen via tegoeden hebben geen snelheidslimiet, waardoor een verkeerd geconfigureerde client binnen enkele minuten voor honderden USD kan verbruiken en op doorverkoop van API-sleutels of botverkeer kan lijken.
  • Wanneer meerdere OmniRoute-gebruikers parallel overschrijdingstegoeden gebruiken vanaf hetzelfde externe IP-adres, wordt het signaal versterkt.

Aanbevolen aanpak:

  1. Behoud de standaardinstelling ANTIGRAVITY_CREDITS=off, tenzij de operator expliciet het risico van betaalde tegoeden en accounthandhaving accepteert. retry verzendt eerst het normale verzoek en injecteert na een in aanmerking komende quota-429 maximaal één keer tegoeden; always injecteert tegoeden bij het eerste verzoek.
  2. Verdeel de belasting over providers via Auto-Combo (model: "auto" of kr/glm/etc-combo) in plaats van één Antigravity-account volledig te belasten.
  3. Stel RPM-limieten per verbinding in op de bewerkingspagina van de Antigravity-provider (Dashboard → Providers → Antigravity → verbinding → snelheidslimiet). 3060 RPM is een verdedigbare bovengrens voor langdurig gebruik.
  4. Gebruik stabiele upstreamnetwerken die door de operator worden beheerd en vermijd het delen van één account tussen niet-gerelateerde gebruikers of workloads.
  5. Bij blokkering: dien bezwaar in via support.google.comRestore Workspace/Account access en voeg de exacte quota_exceeded- / service disabled-responsebody toe die Google heeft verzonden. Herstel is niet gegarandeerd.

De omgevingsreferentie documenteert de gevolgen voor het account en de uitgaven van elke tegoedmodus.

Raakvlakken:

  • open-sse/executors/antigravity.ts — leest process.env.ANTIGRAVITY_CREDITS
  • src/lib/oauth/providers/antigravity.ts — verwerking van referenties
  • Oorspronkelijke incidentmelding: Discussion #1183

CLI-fingerprintregister — open-sse/config/cliFingerprints.ts

Tabel per provider waarin de exacte volgorde van headers en JSON-bodyvelden wordt vastgelegd, zoals vastgelegd in mitmproxy-traces van de officiële CLI's. Momenteel geregistreerd: codex, claude, plus tijdens runtime afgeleide profielen in providerHeaderProfiles.ts voor antigravity en github.

interface CliFingerprint {
  headerOrder: string[]; // hoofdlettergevoelig
  bodyFieldOrder: string[]; // JSON-sleutels op het hoogste niveau
  userAgent?: string | (() => string);
  extraHeaders?: Record<string, string>;
}

Per provider in- of uitschakelen via omgevingsvariabelen (zie hieronder). Wanneer dit is uitgeschakeld, verschijnen headers/body-sleutels in de volgorde waarin Node/JSON ze heeft aangeleverd — eenvoudig te fingerprinten.


MITM-proxy (Antigravity, Linux/macOS/Windows)

Voor CLI's waarvan de binaire bestanden niet via OPENAI_BASE_URL kunnen worden omgeleid, voert OmniRoute een lokale proxy uit die TLS beëindigt. Endpoints bevinden zich onder src/app/api/cli-tools/antigravity-mitm/.

Methode Endpoint Doel
GET /api/cli-tools/antigravity-mitm Status — actief, pid, dnsConfigured, certExists
POST /api/cli-tools/antigravity-mitm MITM starten (vereist apiKey + sudoPassword)
DELETE /api/cli-tools/antigravity-mitm MITM stoppen
GET /api/cli-tools/antigravity-mitm/alias Modelaliassen weergeven
PUT /api/cli-tools/antigravity-mitm/alias Modelaliassen voor een tool opslaan

Onderschepte doelhost: daily-cloudcode-pa.googleapis.com (de upstream van Antigravity).

Opstartvolgorde (src/mitm/manager.ts::startMitm)

  1. Genereer een zelfondertekend certificaat via selfsigned (RSA-2048, SHA-256, 1 jaar) — cert/generate.ts
  2. Installeer het certificaat in het systeemvertrouwensarchief — cert/install.ts
  3. Voeg de hosts-vermelding 127.0.0.1 daily-cloudcode-pa.googleapis.com toe — dns/dnsConfig.ts
  4. Start src/mitm/server.cjs met ROUTER_API_KEY + MITM_LOCAL_PORT (standaard 443)
  5. Sla de PID permanent op in <DATA_DIR>/mitm/.mitm.pid

Dynamische detectie van het Linux-vertrouwensarchief — cert/install.ts

getLinuxCertConfig() doorloopt een prioriteitenlijst en selecteert de eerste bestaande map:

Distributiefamilie Map Updateopdracht
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

Certificaatbestandsnaam: omniroute-mitm.crt. Fingerprintvergelijking via getCertFingerprint() (SHA-1 van DER).

Daarnaast installeert updateNssDatabases() het certificaat in NSS-databases per gebruiker wanneer certutil beschikbaar is: ~/.pki/nssdb, ~/snap/chromium/.../nssdb, alle Firefox-profielen (inclusief snap), onder de bijnaam OmniRoute MITM Root CA.

macOS / Windows

  • macOS: security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain
  • Windows: PowerShell met verhoogde rechten → certutil -addstore Root

Authenticatie

Alle MITM-endpoints vereisen beheerauthenticatie (requireCliToolsAuth). Het sudo-wachtwoord wordt binnen het modulebereik gecachet (nooit in globalThis) en gewist bij stopMitm().


User-Agent-overschrijvingen — omgevingsvariabelen (.env.example sectie 12)

Variabele Standaardwaarde
CLAUDE_USER_AGENT claude-cli/2.1.258 (external, cli)
CODEX_USER_AGENT codex-cli/0.149.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

Gebruikt door open-sse/executors/base.ts::buildHeaders() via dynamische opzoeking. Verhoog deze wanneer providers nieuwe CLI-versies uitbrengen — verouderde UA-tekenreeksen worden uiteindelijk geweigerd als verouderde clients.

Schakelaars voor CLI-compatibiliteitsmodus (.env.example sectie 13)

Variabele Effect
CLI_COMPAT_CODEX=1 Codex-vingerafdruk
CLI_COMPAT_CLAUDE=1 claude-cli-vingerafdruk
CLI_COMPAT_GITHUB=1 GitHub Copilot Chat-vingerafdruk
CLI_COMPAT_ANTIGRAVITY=1 Antigravity-vingerafdruk
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 Schakel al het bovenstaande in

Het IP-adres van de provider blijft altijd behouden — de schakelaar wijzigt alleen de representatie van de aanvraag op de verbinding en verandert niet het uitgaande IP-adres.


Opschoning van inkomende headers

OmniRoute verwijdert inkomende clientheaders voordat ze worden doorgestuurd, zodat een aanvraag die van Cursor afkomstig is niet User-Agent: Cursor/X.Y.Z lekt naar een upstream van Claude. Zie src/shared/constants/upstreamHeaders.ts voor de uitsluitingslijst, die synchroon wordt gehouden met de Zod-schema's en unittests.


Vingerafdrukken bijwerken wanneer een provider ze roteert

  1. Leg officieel CLI-verkeer vast met mitmproxy (TLS-interceptie + dump)
  2. Extraheer JA3/JA4 en de letterlijke headervolgorde
  3. Werk de relevante vermelding CLI_FINGERPRINTS[...] bij
  4. Verhoog de overeenkomende standaardwaarde *_USER_AGENT in .env.example
  5. Als de TLS-handshake zelf is gewijzigd, werk dan de relevante providerwrapper of de optie browser: van wreq-js bij
  6. Voer de providerspecifieke TLS-tests en een handmatige canarytest tegen de live provider uit
  7. Publiceer dit in een patchrelease; documenteer het in CHANGELOG.md

Tests

  • open-sse/services/__tests__/claudeTlsClient.test.ts — gedrag van de gedeelde TLS-wrapper
  • tests/unit/anthropic-cache-fingerprint.test.ts — determinisme van vingerafdrukken
  • tests/unit/chatgpt-web-source-retirement.test.ts — de gemeenschappelijke stealthbron van ChatGPT Web blijft afwezig, terwijl Codex Web aanwezig blijft

Zie ook