Files
OmniRoute/docs/i18n/sv/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 (Svenska)

🌐 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 · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW


Sanningskälla: 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/ Senast uppdaterad: 2026-09-02 — v3.8.51 Målgrupp: Utvecklare som underhåller leverantörsspecifika stealth-integrationer.

OmniRoute integreras med leverantörer vars edge-system aktivt skapar fingeravtryck av inofficiella klienter (TLS JA3/JA4, ordning på headers, JSON-brödtextens form, integritetstoken). Den här sidan dokumenterar de stealth-ytor som OmniRoute exponerar och var de är implementerade.

Juridiskt och etiskt meddelande

Stealth-funktionerna finns för att OmniRoute ska kunna fungera som ett kompatibilitetslager mellan användarägda officiella konton (Claude Code CLI, Codex, Antigravity, Cursor osv.) och OmniRoutes enhetliga API. De är inte avsedda för att kringgå bedrägeriidentifiering, dela autentiseringsuppgifter eller bryta mot leverantörernas användarvillkor. Underhållarna förväntar sig att operatörer följer de uppströmsvillkor som de godkände när kontona skapades.


Lager för TLS-fingeravtryck

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

Beständiga wreq-js-sessioner skapas lat efter behov per kontoomfattning och matchad proxy. Den processomfattande TlsClient-poolen innehåller högst 128 sessioner som utger sig för att vara Chrome 124 på macOS för uppströmsservrar bakom Cloudflare. TlsClient.fetch() avbryter felsäkert när den inbyggda exekveringsmiljön inte är tillgänglig; en anropare kan uttryckligen välja en reservlösning utanför denna wrapper.

  • Sessionsprofil: browser: "chrome_124", os: "macos"
  • Proxyupplösning (prioritetsordning): HTTPS_PROXYHTTP_PROXYALL_PROXY (även gemener)
  • Tidsgräns: TLS_CLIENT_TIMEOUT_MS (ärver från FETCH_TIMEOUT_MS, standardvärde 600000)
  • wreq-js-svaret är fetch-kompatibelt (headers, text(), json(), clone(), body).
  • Övervakning av första byte (open-sse/utils/tlsFirstByteWatchdog.ts, #12656): TlsClient.fetch() slutförs så snart uppströms-headers anländer, vilket innebär att enbart TLS_CLIENT_TIMEOUT_MS inte kan begränsa en brödtext som aldrig ger någon första byte. guardTlsFirstByte() låter brödtextens första read() konkurrera mot TLS_FIRST_BYTE_WATCHDOG_MS (standardvärde 10000, 0 inaktiverar den); en fungerande brödtext påverkas inte, medan en blockerad brödtext avbryter wreq-läsaren och låter den befintliga TLS-reservlogiken i proxyFetch gå vidare till direkt-/proxydispatchern (en begäran som inte säkert kan spelas upp igen, till exempel en POST med brödtext, genererar fortfarande ett undantag i stället för att tyst göras om).

Transport för leverantörer med webb-cookies — wreq-js 3.2.0

open-sse/services/tlsClientBase.ts är den gemensamma adaptern för de fem specialiserade webb-cookie-transporterna nedan. Varje tunn leverantörswrapper väljer en webbläsar-/OS-profil. Adaptern använder den gemensamma wreq-laddaren för exekveringsmiljön och transportpoolen i open-sse/utils/tlsClient.ts, med profil + OS + matchad proxy som nyckel, medan varje begäran använder cookieMode: "ephemeral". Konton och begäranden delar därför anslutningar på transportnivå, men aldrig en wreq-session eller cookie-behållare.

Leverantör Profil Emulerat OS Policy för strömmens EOF
Claude chrome_146 Linux inkludera [DONE]
Perplexity firefox_148 macOS inkludera event: end_of_stream
Grok chrome_146 Linux exkludera [DONE]
Notion chrome_146 Windows inkludera [DONE]
LMArena chrome_146 Windows ingen sentinel; stäng vid inbyggt EOF
  • Strömning använder det inbyggda svarets ReadableStream direkt; ingen temporär fil eller sidoprocess skapas.
  • Upp till 256 inledande byte inspekteras innan en ström exponeras. SSE-leverantörer buffrar fel som inte är SSE; Grok/LMArena mappar Cloudflare-utmaningar till 403 och HTML-mellansidor till 502.
  • Den inbyggda tidsgränsen för begäran omges fortfarande av en absolut hård JS-tidsgräns. Ett hängningstillstånd ogiltigförklarar och stänger endast den berörda profil-/OS-/proxytransporten innan den återskapas av nästa begäran.
  • Prioritetsordningen för proxyupplösning är proxyUrl per anrop → kontots/instrumentpanelens kontext för begäran → HTTPS_PROXY/HTTP_PROXY/ALL_PROXY (inklusive varianter med gemener). Upplösningsfel avbryter felsäkert i stället för att läcka en direktanslutning. LMArena gör avsiktligt upplösningen mot arena.ai.
  • byteResponse returnerar en innehållstypad data:-URL utan UTF-8-korruption.
  • Felen är TlsClientUnavailableError (paket/tillägg är inte tillgängligt), TlsClientHangError (tidsgränsen överskreds) och WreqTransportCapacityError (den gemensamma felkoden för sessionskapacitet) när samtliga 128 begränsade profil-/OS-/proxyplatser är aktiva eller håller på att stängas.

Den generiska TlsClient-sessionen ovan förblir specialiserad för beständigt webbläsarbaserat cookie-tillstånd. Båda vägarna återanvänder en gemensam cachad wreq-modulladdare och hook för processlivscykeln; deras pooler förblir separata eftersom deras cookie-livslängder avsiktligt skiljer sig åt.

Profilerna stöds av det låsta paketet, men verklig WAF-acceptans kan förändras oberoende av lokala kontraktstester. Validera ändringar av fingeravtryck mot ett uttryckligen auktoriserat aktivt konto innan paritet med en uppströmswebbläsare hävdas.


Claude Code Stealth-paket

När cliCompatMode är aktiverat omformar OmniRoute utgående Claude-förfrågningar så att de inte går att skilja från claude-cli-trafik. Tre moduler samarbetar:

claudeCodeFingerprint.ts

Beräknar det 3 tecken långa cc_version-fingeravtrycket som bäddas in i faktureringshuvudet:

SHA256(SALT + msg[4] + msg[7] + msg[20] + version)[:3]
  • FINGERPRINT_SALT = "59cf53e54c78" (hårdkodat; matchar den officiella klienten)
  • Indata: tecknen vid index 4, 7 och 20 i texten i det första användarmeddelandet + versionssträngen
  • Utdata: hexadecimalt prefix med 3 tecken

claudeCodeCCH.ts (Client Content Hash)

Integritetskontroll på serversidan som den officiella Claude Code CLI-klienten beräknar via Bun/Zig. OmniRoute implementerar den på nytt med xxhash-wasm:

  1. Serialisera innehållet med platshållaren cch=00000;
  2. xxhash64(bytes, seed) & 0xFFFFF
  3. Utfyllt med inledande nollor till 5 gemena hexadecimala tecken
  4. Ersätt cch=00000; med den beräknade tokenen

Konstanter:

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

claudeCodeObfuscation.ts

Infogar en Unicode-sammanfogare utan bredd (U+200D) efter det första tecknet i ”känsliga” klientnamn så att uppströmsfilter inte kan hitta dem med grep. Standardordlista:

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

Tillämpas på: system-block, allt messages[].content samt tools[].description / tools[].function.description. Kan åsidosättas av operatören via setSensitiveWords().

claudeCodeCompatible.tsanthropic-compatible-cc-*-leverantörer

För Anthropic-reläer från tredje part som endast accepterar ”äkta Claude Code”-trafik:

  • 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" som standard
  • Växlingsknappen ”Enable redact-thinking beta” per anslutning lägger till redact-thinking-2026-02-12 när en CC Compatible-uppström specifikt kräver redigerade resonemangsströmmar
  • Växlingsknappen ”Enable summarized thinking display” per anslutning lagrar providerSpecificData.requestDefaults.summarizeThinking och lägger till display: "summarized" i CC Compatible-resonemangsförfrågningar som inte redan har angett ett visningsläge
  • CONTEXT_1M_BETA_HEADER = "context-1m-2025-08-07" (Opus/Sonnet 4.x-familjen)
  • Standardsökväg: /v1/messages?beta=true

Närliggande moduler i samma paket:

  • claudeCodeConstraints.ts — regler för temperatur och cachekontroll
  • claudeCodeToolRemapper.ts — ommappning av verktygsnamn
  • claudeCodeExtraRemap.ts — extra normalisering av nyttolast

Antigravity Stealth

Antigravity-förfrågningar bevarar anroparens text byte för byte. OmniRoute infogar inte tecken utan bredd i promptar och byter inte namn på eller injicerar verktyg för att efterlikna en IDE-klient.

antigravityHeaderScrub.ts

Tar bort Stainless SDK-markörer (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) före vidarebefordran.

⚠️ Risk: ANTIGRAVITY_CREDITS=always (högriskområde för kontoavstängning)

ANTIGRAVITY_CREDITS=always (används av open-sse/executors/antigravity.ts) dirigerar varje förfrågan genom Antigravity AI Credit Overages (betalda Google-krediter) i stället för att låta Googles kostnadsfria kvot begränsa användningen. Detta är dokumenterat som en funktion, men det är den överlägset vanligaste rapporten om brott mot användarvillkoren som vi ser — flera Google Ultra-konton har stängts av med 403 / "service disabled for ToS violation" / insufficient_quota efter att ha körts i några timmar med =always.

Kontrollen uppströms sker på Googles sida och är inget som OmniRoute kan förhindra. Miljövariabelns namn och den befintliga dokumentationen får det att låta som en säker inställning att aktivera, men det är det inte.

Varför detta utlöser missbruksdetektering mer aggressivt än användning enbart inom gratiskvoten:

  • Ihållande automatiserade utgifter på ett enda Google-konto flaggas annorlunda än när gratiskvoten nås och användningen stoppas.
  • Kreditöverskridanden saknar hastighetstak, så en felkonfigurerad klient kan förbruka flera hundra USD på några minuter och se ut som återförsäljning av API-nycklar eller bottrafik.
  • Signalen förstärks när flera OmniRoute-användare parallellt nyttjar överskridandekrediter från samma externa IP-adress.

Rekommenderat förhållningssätt:

  1. Behåll standardvärdet ANTIGRAVITY_CREDITS=off om inte operatören uttryckligen accepterar riskerna med betalda krediter och kontoåtgärder. retry skickar den normala förfrågan först och injicerar krediter högst en gång efter ett berättigat kvotfel av typen 429; always injicerar krediter i den första förfrågan.
  2. Fördela belastningen mellan leverantörer via Auto-Combo (model: "auto" eller kr/glm/etc-combo) i stället för att överbelasta ett enskilt Antigravity-konto.
  3. Ange RPM-gränser per anslutning på Antigravity-leverantörens redigeringssida (Dashboard → Providers → Antigravity → anslutning → hastighetsgräns). 3060 RPM är en försvarbar övre gräns för ihållande användning.
  4. Använd stabil uppströmsnätverkstrafik som kontrolleras av operatören och undvik att dela ett konto mellan orelaterade användare eller arbetsbelastningar.
  5. Vid avstängning: överklaga via support.google.com → ”Restore Workspace/Account access” och inkludera exakt den svarstext för quota_exceeded / service disabled som Google skickade. Återställning kan inte garanteras.

Miljöreferensen dokumenterar konto- och kostnadskonsekvenserna för varje kreditläge.

Berörda punkter:

  • open-sse/executors/antigravity.ts — läser process.env.ANTIGRAVITY_CREDITS
  • src/lib/oauth/providers/antigravity.ts — autentiseringsuppgifter och deras hantering
  • Ursprunglig incidentrapport: diskussion #1183

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

Tabell per leverantör som låser den exakta ordningen på headers och fält i JSON-brödtexten, hämtad från mitmproxy-spårningar av de officiella CLI-verktygen. För närvarande registrerade: codex, claude, samt profiler som härleds vid körning i providerHeaderProfiles.ts för antigravity och github.

interface CliFingerprint {
  headerOrder: string[]; // skiftlägeskänslig
  bodyFieldOrder: string[]; // JSON-nycklar på toppnivå
  userAgent?: string | (() => string);
  extraHeaders?: Record<string, string>;
}

Aktivera eller inaktivera per leverantör via miljövariabler (se nedan). När detta är inaktiverat visas headers/brödtextnycklar i den ordning som Node/JSON gav dem — enkelt att skapa fingeravtryck från.


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

För CLI-verktyg vars binärfiler inte kan omdirigeras via OPENAI_BASE_URL kör OmniRoute en lokal TLS-terminerande proxy. Slutpunkterna finns under src/app/api/cli-tools/antigravity-mitm/.

Metod Slutpunkt Syfte
GET /api/cli-tools/antigravity-mitm Status — körs, pid, dnsConfigured, certExists
POST /api/cli-tools/antigravity-mitm Starta MITM (kräver apiKey + sudoPassword)
DELETE /api/cli-tools/antigravity-mitm Stoppa MITM
GET /api/cli-tools/antigravity-mitm/alias Lista modellalias
PUT /api/cli-tools/antigravity-mitm/alias Spara modellalias för ett verktyg

Målvärd som avlyssnas: daily-cloudcode-pa.googleapis.com (Antigravitys uppströmsserver).

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

  1. Generera ett självsignerat certifikat via selfsigned (RSA-2048, SHA-256, 1 år) — cert/generate.ts
  2. Installera certifikatet i systemets betrodda certifikatarkiv — cert/install.ts
  3. Lägg till hosts-posten 127.0.0.1 daily-cloudcode-pa.googleapis.comdns/dnsConfig.ts
  4. Starta src/mitm/server.cjs med ROUTER_API_KEY + MITM_LOCAL_PORT (standardvärde 443)
  5. Spara PID i <DATA_DIR>/mitm/.mitm.pid

Dynamisk identifiering av betrodda certifikatarkiv i Linux — cert/install.ts

getLinuxCertConfig() går igenom en prioriteringslista och väljer den första befintliga katalogen:

Distributionsfamilj Katalog Uppdateringskommando
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

Certifikatets filnamn: omniroute-mitm.crt. Fingeravtrycksmatchning via getCertFingerprint() (SHA-1 av DER).

Dessutom installerar updateNssDatabases() certifikatet i NSS-databaser per användare när certutil är tillgängligt: ~/.pki/nssdb, ~/snap/chromium/.../nssdb, alla Firefox-profiler (inklusive snap), under smeknamnet OmniRoute MITM Root CA.

macOS / Windows

  • macOS: security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain
  • Windows: PowerShell med förhöjda behörigheter → certutil -addstore Root

Autentisering

Alla MITM-slutpunkter kräver hanteringsautentisering (requireCliToolsAuth). Sudo-lösenordet cachelagras inom modulens omfång (aldrig i globalThis) och rensas vid stopMitm().

Åsidosättningar av User-Agent — miljövariabler (.env.example avsnitt 12)

Variabel Standardvärde
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

Används av open-sse/executors/base.ts::buildHeaders() via dynamisk uppslagning. Uppdatera dessa när leverantörer släpper nya CLI-versioner — inaktuella UA-strängar börjar avvisas som föråldrade klienter.

Växlar för CLI-kompatibilitetsläge (.env.example avsnitt 13)

Variabel Effekt
CLI_COMPAT_CODEX=1 Codex-fingeravtryck
CLI_COMPAT_CLAUDE=1 claude-cli-fingeravtryck
CLI_COMPAT_GITHUB=1 GitHub Copilot Chat-fingeravtryck
CLI_COMPAT_ANTIGRAVITY=1 Antigravity-fingeravtryck
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 Aktivera alla ovanstående

Leverantörens IP-adress bevaras alltid — växeln ändrar endast begärans representation på protokollnivå; den byter inte utgående IP-adress.


Sanering av inkommande huvuden

OmniRoute rensar inkommande klienthuvuden före vidarebefordran, så att en begäran som kommer från Cursor inte läcker User-Agent: Cursor/X.Y.Z till en Claude-uppströmsserver. Se src/shared/constants/upstreamHeaders.ts för spärrlistan, som hålls synkroniserad med Zod-schemana och enhetstesterna.


Uppdatera fingeravtryck när en leverantör byter dem

  1. Samla in trafik från det officiella CLI-verktyget med mitmproxy (TLS-avlyssning + dump)
  2. Extrahera JA3/JA4 och den exakta ordningen på huvudena
  3. Uppdatera den relevanta posten i CLI_FINGERPRINTS[...]
  4. Uppdatera det matchande standardvärdet för *_USER_AGENT i .env.example
  5. Om själva TLS-handskakningen har ändrats, uppdatera den relevanta leverantörswrappern eller alternativet browser: för wreq-js
  6. Kör de leverantörsspecifika TLS-testerna och ett manuellt kanarietest mot den aktiva leverantören
  7. Leverera i en patchversion; dokumentera i CHANGELOG.md

Tester

  • open-sse/services/__tests__/claudeTlsClient.test.ts — beteende för den delade TLS-wrappern
  • tests/unit/anthropic-cache-fingerprint.test.ts — determinism för fingeravtryck
  • tests/unit/chatgpt-web-source-retirement.test.ts — den gemensamma stealth-källan för ChatGPT Web förblir frånvarande medan Codex Web finns kvar

Se även