* 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.
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:
- 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.
- Budoucí AI skenery mohly zohlednit správcem podepsané prohlášení, že každá označená cesta je záměrná, volitelná a zdokumentovaná.
- 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é funkceexecFile/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.ps1vytvořeného pro každé volání (režim 0o600, uvnitř soukromého adresářemkdtempSync) a odkazuje se na něj pomocí-File. Soubor je odstraněn v blokufinally. 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.installCertWindowsobsahuje vložený blokSECURITY-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.tssrc/lib/zed-oauth/keychain-reader.tssrc/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í:
POST /api/providers/zed/discovervrací{ candidates: [{ provider, service, account, fingerprint }] }. Nezpracovaný token se nikdy nepřenáší. Otisk jesha256(service|account|token).slice(0,16).- Řídicí panel zobrazí seznam kandidátů, operátor vybere, které z nich chce
importovat, a odešle
{ confirmedAccounts: [{ service, account, fingerprint }] }naPOST /api/providers/zed/import. - 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írunElevatedPowerShelliexecFileWithPassworddokumentuje volající uvedené na seznamu povolených a pevně stanovený seznam spustitelných souborů. - Volání
spawn()ve funkciexecFileWithPasswordobsahuje značkunosemgrepse seznamem povolených spustitelných souborů, které smí pomocná funkce přijmout — neexistuje žádná cesta z uživatelského vstupu dofinalCommand/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í podlesrc/server/authz/routeGuard.tspřístup pouzeLOCAL_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(vizsrc/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)vsrc/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.ts—syncToCloud()/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:
- Ověření pomocí HMAC:
verifyCloudSignature(rawBody, sigHeader)kontroluje hlavičkuX-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ý. - Výslovný souhlas se synchronizací tajných polí:
accessToken/refreshToken/providerSpecificDatase 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.