Files
OmniRoute/docs/i18n/cs/docs/security/SOCKET_DEV_FINDINGS.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

17 KiB

Socket.dev / supply-chain finding attestation (Čeština)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇩🇰 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 · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW


Tento dokument je správcem vytvořené potvrzení k šesti nálezům AI-detected potential malware nahlášeným u omniroute@3.8.5 a k nápravným opatřením použitým v omniroute@3.8.6. Existuje proto, aby:

  1. Provozovatelé bezpečnostních kontrol měli jediný referenční dokument, který mohou citovat, když potřebují vyhodnotit nálezy ve vztahu ke skutečnému zdrojovému kódu.
  2. Budoucí AI skenery mohly zohlednit správcem podepsané prohlášení, že každá označená cesta je záměrná, volitelná a zdokumentovaná.
  3. Existoval písemný záznam o tom, proč má každé místo volání právě tuto podobu — aby budoucí refaktorizace omylem znovu nezavedla vzorec, který byl záměrně odstraněn.

Pokud provozujete skener, který po vydání nápravných opatření ve v3.8.6 znovu označí kterékoli z níže uvedených míst volání, založte prosím issue se záznamem kontroly a my zde toto potvrzení rozšíříme.


§1 — Instalace kořenové CA pro MITM (77484.js)

Zdrojové soubory:

  • src/mitm/cert/install.ts — veřejné installCert() / uninstallCert(), platformně specifické installCertWindows/Mac/Linux.
  • src/mitm/systemCommands.ts — sdílené pomocné funkce execFile / spawn / PowerShell používané instalačními cestami.

Spouštěč: uživatel klikne na „Povolit MITM proxy“ v místním řídicím panelu na /dashboard/cli-tools/mitm. Trasa je dostupná pouze přes loopback — viz pevné pravidlo č. 17 v CLAUDE.md a src/server/authz/routeGuard.ts::isLocalOnlyPath(). Uniklý JWT zpřístupněný prostřednictvím tunelu nemůže tuto cestu kódu spustit.

Prováděné privilegované operace (podle platformy):

OS Příkaz(y)
Windows certutil -addstore Root <cert> prostřednictvím UAC
macOS sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain <cert>
Linux sudo cp <cert> <distro-trust-dir> + sudo update-ca-certificates (Debian) / sudo update-ca-trust (RHEL/SUSE)
Linux+Firefox/Chromium aktualizace databáze NSS pro jednotlivé profily prostřednictvím certutil -d sql:<profile>

Jde o stejné příkazy, jaké používají mitmproxy, Charles Proxy, Fiddler a Caddy. Jejich přítomnost v OmniRoute je zdokumentována v docs/security/STEALTH_GUIDE.md.

Nápravná opatření ve v3.8.6:

  • runElevatedPowerShell() již nepoužívá -EncodedCommand <base64utf16le>. Payload se zvýšenými oprávněními se zapisuje do dočasného souboru .ps1 vytvořeného pro každé volání (režim 0o600, uvnitř soukromého adresáře mkdtempSync) a odkazuje se na něj pomocí -File. Soubor je odstraněn v bloku finally. Tím se odstraňuje učebnicový vzorec zvyšování oprávnění prostřednictvím PowerShellu a base64, který označil AI klasifikátor Socket.dev.
  • installCertWindows obsahuje vložený blok SECURITY-AUDITOR-NOTE: odkazující sem.

Proč tuto funkcionalitu zachováváme: MITM proxy je zdokumentovaná funkce používaná v docs/security/STEALTH_GUIDE.md a docs/frameworks/MITM-PROXY.md. Její odstranění by narušilo sadu funkcí agent-bridge.


§2 — Import přihlašovacích údajů ze Zedu (app/api/providers/zed/import/route.js)

Zdrojové soubory:

  • src/app/api/providers/zed/discover/route.ts (novinka ve v3.8.6)
  • src/app/api/providers/zed/import/route.ts
  • src/lib/zed-oauth/keychain-reader.ts
  • src/lib/zed-oauth/credentialFingerprint.ts (novinka ve v3.8.6)

Spouštěč: uživatel klikne na „Importovat ze Zedu“ na stránce Poskytovatelé v místním řídicím panelu. Přístup ke koncovému bodu je chráněn pomocí requireManagementAuth. Samotný editor Zed zapisuje API klíče svých poskytovatelů do systémové klíčenky pod zdokumentovanými názvy služeb — viz https://zed.dev/docs/ai/llm-providers.

Chování ve v3.8.5 (to, které označil Socket.dev):

POST /import vyhledal přihlašovací údaje a během jediného požadavku je automaticky uložil do místního úložiště SQLite. Žádné potvrzení pro jednotlivé účty, žádný otisk, pouze „nalezeno N tokenů, všechny importovány“.

Zmírnění rizika ve v3.8.6 — dvoufázové potvrzení:

  1. POST /api/providers/zed/discover vrací { candidates: [{ provider, service, account, fingerprint }] }. Nezpracovaný token se nikdy nepřenáší. Otisk je sha256(service|account|token).slice(0,16).
  2. Řídicí panel zobrazí seznam kandidátů, operátor vybere, které z nich chce importovat, a odešle { confirmedAccounts: [{ service, account, fingerprint }] } na POST /api/providers/zed/import.
  3. Koncový bod pro import znovu načte klíčenku na serveru a provede filtrování podle (service, account, fingerprint). Pozměněná nebo opakovaně použitá odpověď z vyhledání nemůže koncový bod pro import přimět k uložení nesouvisejícího tokenu — pokud se aktuální token od vyhledání změnil, otisk již neodpovídá a přihlašovací údaj je přeskočen.

Proměnná prostředí OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP=true zachovává chování z v3.8.5 pro operátory, kteří dosud neaktualizovali svou automatizaci. Bude odstraněna ve v3.9.

Proč tuto funkci ponecháváme: Import ze Zedu je nejpřívětivější způsob prvotního nastavení pro uživatele, kteří již Zed používají a chtějí zkopírovat své klíče poskytovatelů do OmniRoute, aniž by je museli znovu vkládat.


§3 — execFile / spawn / PowerShell se zvýšenými oprávněními (21843.js)

Zdrojové soubory: src/mitm/systemCommands.ts.

Důvod označení: balíček znovu exportuje execFileWithPassword, runElevatedPowerShell a sdílenou pomocnou funkci quotePowerShell. Klasifikátor AI služby Socket.dev je vyhodnocuje jako obecnou „sadu nástrojů pro spouštění na hostiteli a zvyšování oprávnění“. V rámci OmniRoute se používají pouze v cestě instalace certifikátu MITM (§1) a prostřednictvím execFileWithPassword ke spouštění příkazů sudo.

Zmírnění rizika ve v3.8.6:

  • Refaktorizace runElevatedPowerShell (viz §1).
  • Vložený blok SECURITY-AUDITOR-NOTE: u funkcí runElevatedPowerShell i execFileWithPassword dokumentuje volající uvedené na seznamu povolených a pevně stanovený seznam spustitelných souborů.
  • Volání spawn() ve funkci execFileWithPassword obsahuje značku nosemgrep se seznamem povolených spustitelných souborů, které smí pomocná funkce přijmout — neexistuje žádná cesta z uživatelského vstupu do finalCommand/finalArgs.

§4 / §6 — Správce služby 9router (api/services/9router/{start,restart}/route.js)

Zdrojové soubory:

  • src/app/api/services/9router/_lib.ts — továrna správce.
  • src/app/api/services/9router/{start,stop,restart,status,install,update,auto-start}/route.ts.
  • src/lib/services/ServiceSupervisor.ts — obecné spouštění / dotazování na stav / vyrovnávací paměť protokolů.

Spouštěč: uživatel klikne na „Instalovat“ / „Spustit“ na stránce vložených služeb v místním řídicím panelu.

Již zavedená ochranná opatření:

  • Všechny trasy /api/services/* mají podle src/server/authz/routeGuard.ts přístup pouze LOCAL_ONLY (pevné pravidlo č. 17). Vynucení přístupu přes loopback proběhne před jakoukoli kontrolou ověření — uniklý token JWT se k nim nedostane.
  • Řádek databáze pro 9router je vytvořen s hodnotami status='not_installed', auto_start=0 (viz src/lib/db/migrations/071_services.sql:19). Služba se při prvním spuštění nespustí.
  • Funkce spawn() je volána s cestou k binárnímu souboru vrácenou funkcí resolveSpawnArgs(apiKey, PORT) v src/lib/services/installers/ninerouter.ts, která představuje pevný seznam podporovaných binárních souborů.
  • Stdout/stderr se ukládá do vyrovnávací paměti v paměti (limit 5 MB, viz _lib.ts) — na disk se nic nezapisuje, pokud uživatel nepovolí protokolování v řídicím panelu.

Zmírnění rizika ve v3.8.6: žádná funkční změna. Minimální profil sestavení (OMNIROUTE_BUILD_PROFILE=minimal) nahrazuje soubor src/lib/services/installers/ninerouter.ts zástupnou implementací pro uživatele, kteří chtějí cesty vyžadující zvýšená oprávnění fyzicky odstranit z balíčku.

Proč tuto funkci ponecháváme: 9router je volitelná, místně instalovatelná doprovodná služba (podobná zásuvnému modulu pro WordPress) — aktivuje se výhradně na základě výslovné volby.


§5 — Zpětný zápis přihlašovacích údajů OmniRoute Cloud Sync (api/keys/[id]/route.js)

Zdrojové soubory:

  • src/lib/cloudSync.tssyncToCloud() / updateLocalTokens().
  • src/app/api/keys/[id]/route.ts — volá syncKeysToCloudIfEnabled().

Spouštěcí podmínka: isCloudEnabled() vrátí true (nastavuje se z řídicího panelu) a zároveň je nakonfigurována proměnná CLOUD_URL. Pokud jsou obě možnosti vypnuté, neprovede se žádné odchozí síťové volání do koncového bodu služby Cloud.

Chování ve v3.8.5 (chyba, kterou Socket.dev správně zachytil):

updateLocalTokens() přepsala hodnoty accessToken, refreshToken a providerSpecificData z odpovědi služby Cloud, když platilo cloudUpdatedAt > localUpdatedAt. Žádný HMAC, žádný podpis, žádný kontrolní součet. Chybně nakonfigurovaná nebo škodlivá hodnota CLOUD_URL (případně MITM útok na komunikačním kanálu) mohla nepozorovaně zaměnit tokeny OAuth poskytovatele.

Zmírnění ve v3.8.6:

  1. Ověření pomocí HMAC: verifyCloudSignature(rawBody, sigHeader) kontroluje hlavičku X-Cloud-Sig (HMAC-SHA256(OMNIROUTE_CLOUD_SYNC_SECRET, rawBody)) před zpracováním JSON. Pokud je tajný klíč nastaven, podpis je povinný. Pokud nastaven není (starší režim), zaznamená se varování a odpověď je přijata — ve v3.9 bude tajný klíč povinný.
  2. Výslovný souhlas se synchronizací tajných polí: accessToken / refreshToken / providerSpecificData se přepisují pouze tehdy, když OMNIROUTE_CLOUD_SYNC_SECRETS=true. Výchozí režim synchronizuje pouze metadata bez přihlašovacích údajů (expiresAt, status, lastError*, rateLimitedUntil, updatedAt). Jde o zpětně nekompatibilní změnu pro uživatele, kteří spoléhali na vzdálenou synchronizaci tokenů — musí ji výslovně povolit.

Proč tuto funkci zachováváme: Cloud Sync je jediný způsob, jak může tenant OmniRoute Cloud centralizovat týmové přihlašovací údaje. Oprava transparentně vymezuje model hrozeb: „server podepisuje, klient ověřuje, provozovatel se výslovně rozhoduje“.


Profil sestavení: minimal

Uživatelé, kteří potřebují artefakt kompatibilní se Socketem, jej mohou sestavit pomocí:

OMNIROUTE_BUILD_PROFILE=minimal npm run build

Webpackový modul NormalModuleReplacementPlugin nahrazuje čtyři moduly jejich zástupnými implementacemi:

Modul Zástupná implementace
src/mitm/cert/install.ts src/mitm/cert/install.stub.ts
src/lib/zed-oauth/keychain-reader.ts src/lib/zed-oauth/keychain-reader.stub.ts
src/lib/cloudSync.ts src/lib/cloudSync.stub.ts
src/lib/services/installers/ninerouter.ts src/lib/services/installers/ninerouter.stub.ts

Každá zástupná implementace exportuje stejné rozhraní, ale každá funkce za běhu vyvolá featureDisabledError(name). Trasy, které závisejí na deaktivovaném modulu, vrátí HTTP 503 s jasným sdělením namísto aktivace citlivé cesty kódu.

Výsledný balíček je určen k publikování pod názvem omniroute-secure. Postup publikování naleznete v docs/ops/PUBLISHING_SECURE.md.


Rozdělení pluginu (sledováno pro v4)

Z dlouhodobého hlediska hodláme rozdělit balíček npm na samostatně auditovatelné moduly. Příslušný problém naleznete v milníku v4 ve sledovači problémů na GitHubu.