* 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.
23 KiB
Socket.dev / supply-chain finding attestation (Български)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇩 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 · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Този документ е декларацията, изготвена от поддържащия проекта, относно шестте
констатации за AI-detected potential malware, повдигнати срещу omniroute@3.8.5, и
мерките за ограничаване, приложени в omniroute@3.8.6. Той съществува, за да:
- Операторите на конвейери за сигурност разполагат с единен източник, който да цитират, когато трябва да оценят констатациите спрямо действителния изходен код.
- Бъдещите AI скенери могат да разпознаят подписаното от поддържащия проекта твърдение, че всеки маркиран път е преднамерен, активира се по избор и е документиран.
- Разполагаме с писмен запис защо всяко място на извикване е структурирано по този начин — така че бъдещо рефакториране да не въведе отново по невнимание отпечатък, който умишлено е бил премахнат.
Ако управлявате скенер, който отново маркира някое от местата на извикване по-долу, след като мерките за ограничаване във v3.8.6 бъдат публикувани, моля, отворете issue с проследяването от сканирането и ние ще разширим декларацията тук.
§1 — Инсталиране на главен CA сертификат за MITM (77484.js)
Файлове с изходен код:
src/mitm/cert/install.ts— публичниinstallCert()/uninstallCert(), специфични за всяка платформаinstallCertWindows/Mac/Linux.src/mitm/systemCommands.ts— споделени помощни функции заexecFile/spawn/ PowerShell, използвани от пътищата за инсталиране.
Задействане: потребителят щраква върху „Активиране на MITM прокси“ в локалното табло на
/dashboard/cli-tools/mitm. Маршрутът е достъпен само през loopback — вижте строго правило №17 в
CLAUDE.md и src/server/authz/routeGuard.ts::isLocalOnlyPath(). Изтекъл
JWT, разкрит чрез тунел, не може да задейства този път в кода.
Извършвани привилегировани операции (по платформа):
| ОС | Команда(и) |
|---|---|
| Windows | certutil -addstore Root <cert> чрез 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 | актуализиране на NSS DB за всеки профил чрез certutil -d sql:<profile> |
Това са същите команди, използвани от mitmproxy, Charles Proxy, Fiddler и
Caddy. Фактът, че те съществуват в OmniRoute, е документиран в
docs/security/STEALTH_GUIDE.md.
Мярка за ограничаване във v3.8.6:
runElevatedPowerShell()вече не използва-EncodedCommand <base64utf16le>. Payload-ът с повишени привилегии се записва във временен.ps1файл за всяко извикване (режим 0o600, в частна директория, създадена чрезmkdtempSync) и към него се прави препратка чрез-File. Файлът се изтрива въвfinally. Това премахва характерния отпечатък за повишаване на привилегиите чрез PowerShell с base64, маркиран от AI класификатора на Socket.dev.installCertWindowsсъдържа вграден блокSECURITY-AUDITOR-NOTE:, който сочи към този документ.
Защо го запазваме: MITM проксито е документирана функционалност, използвана от
docs/security/STEALTH_GUIDE.md и docs/frameworks/MITM-PROXY.md. Премахването му
би нарушило набора от функции за свързване на агенти.
§2 — Импортиране на идентификационни данни от Zed (app/api/providers/zed/import/route.js)
Изходни файлове:
src/app/api/providers/zed/discover/route.ts(нов във v3.8.6)src/app/api/providers/zed/import/route.tssrc/lib/zed-oauth/keychain-reader.tssrc/lib/zed-oauth/credentialFingerprint.ts(нов във v3.8.6)
Задействане: потребителят щраква върху „Импортиране от Zed“ на страницата Providers в локалното табло за управление. Достъпът до крайната точка е ограничен чрез requireManagementAuth. Самият редактор Zed записва API ключовете за доставчиците в хранилището за ключове на ОС под документирани имена на услуги — вижте https://zed.dev/docs/ai/llm-providers.
Поведение във v3.8.5 (това, което Socket.dev е маркирал):
POST /import откриваше идентификационните данни и автоматично ги записваше в локалното SQLite хранилище в рамките на една заявка. Без потвърждение за всеки отделен акаунт, без отпечатък, само „намерени са N токена, всички са импортирани“.
Ограничаване на риска във v3.8.6 — потвърждение в 2 стъпки:
POST /api/providers/zed/discoverвръща{ candidates: [{ provider, service, account, fingerprint }] }. Необработеният токен никога не се предава. Отпечатъкът еsha256(service|account|token).slice(0,16).- Таблото за управление визуализира списъка с кандидати, операторът избира кои да
бъдат импортирани и изпраща
{ confirmedAccounts: [{ service, account, fingerprint }] }къмPOST /api/providers/zed/import. - Крайната точка за импортиране прочита отново хранилището за ключове на сървъра и филтрира по
(service, account, fingerprint). Манипулиран или повторно използван отговор от discover не може да подмами крайната точка за импортиране да запише несвързан токен — ако активният токен се е променил след discover, отпечатъкът вече не съвпада и идентификационните данни се пропускат.
Флагът на средата OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP=true запазва поведението от v3.8.5
за оператори, които все още не са актуализирали автоматизацията си. Той ще бъде
премахнат във v3.9.
Защо го запазваме: импортирането от Zed е най-удобният начин за първоначална настройка за потребители, които вече използват Zed и искат да копират ключовете за доставчиците си в OmniRoute, без да ги поставят повторно.
§3 — execFile / spawn / PowerShell с повишени права (21843.js)
Изходни файлове: src/mitm/systemCommands.ts.
Защо е маркирано: фрагментът реекспортира execFileWithPassword,
runElevatedPowerShell и споделения помощен компонент quotePowerShell. Класификаторът с ИИ на
Socket.dev ги разпознава като универсален „инструментариум за изпълнение на хоста + повишаване на привилегиите“.
В OmniRoute те се използват единствено от механизма за инсталиране на MITM сертификата
(§1) и от execFileWithPassword за изпълнение на команди чрез sudo.
Ограничаване на риска във v3.8.6:
- Рефакториране на
runElevatedPowerShell(вижте §1). - Вграден блок
SECURITY-AUDITOR-NOTE:приrunElevatedPowerShellиexecFileWithPassword, който документира разрешените извикващи компоненти и фиксирания списък с изпълними файлове. - Извикването на
spawn()вexecFileWithPasswordсъдържа маркерnosemgrepсъс списъка на изпълнимите файлове, които помощният компонент може да получава — няма път от потребителския вход доfinalCommand/finalArgs.
§4 / §6 — Процес за надзор на услугата 9router (api/services/9router/{start,restart}/route.js)
Изходни файлове:
src/app/api/services/9router/_lib.ts— фабрика за процеса за надзор.src/app/api/services/9router/{start,stop,restart,status,install,update,auto-start}/route.ts.src/lib/services/ServiceSupervisor.ts— общ механизъм за стартиране на процеси / периодична проверка на изправността / буфериране на регистрационни записи.
Задействане: потребителят щраква върху „Инсталиране“ / „Стартиране“ на страницата за вградени услуги в локалното табло за управление.
Вече налични защити:
- Всички маршрути
/api/services/*са LOCAL_ONLY съгласноsrc/server/authz/routeGuard.ts(твърдо правило №17). Ограничението до loopback се прилага преди всяка проверка за удостоверяване — изтекъл JWT не може да достигне до тях. - Редът за 9router в БД първоначално се създава като
status='not_installed', auto_start=0(вижтеsrc/lib/db/migrations/071_services.sql:19). Услугата не се стартира при първото пускане. spawn()се извиква с пътя до двоичния файл, върнат отresolveSpawnArgs(apiKey, PORT)вsrc/lib/services/installers/ninerouter.ts, който представлява фиксиран списък с разрешени поддържани двоични файлове.- Stdout/stderr се буферират в паметта (ограничение от 5 MB, вижте
_lib.ts) — няма запис на диска, освен ако потребителят не активира регистрирането от таблото за управление.
Ограничаване на риска във v3.8.6: няма функционална промяна. Минималният профил за компилация
(OMNIROUTE_BUILD_PROFILE=minimal) заменя
src/lib/services/installers/ninerouter.ts със заглушка за потребители, които искат
пътищата с повишени привилегии да бъдат физически премахнати от пакета.
Защо го запазваме: 9router е незадължителна, локално инсталируема придружаваща услуга (подобна на плъгин за WordPress) — активира се само при изрично желание.
§5 — Обратно записване на идентификационни данни при OmniRoute Cloud Sync (api/keys/[id]/route.js)
Файлове с изходен код:
src/lib/cloudSync.ts—syncToCloud()/updateLocalTokens().src/app/api/keys/[id]/route.ts— извикваsyncKeysToCloudIfEnabled().
Условие за задействане: isCloudEnabled() връща true (задава се от таблото за управление) и
CLOUD_URL е конфигуриран. Когато и двете са изключени, не се извършва изходящо мрежово извикване към
крайната точка на Cloud.
Поведение във v3.8.5 (грешката, която Socket.dev правилно откри):
updateLocalTokens() презаписваше accessToken, refreshToken и
providerSpecificData от отговора на Cloud, когато
cloudUpdatedAt > localUpdatedAt. Без HMAC, без подпис, без контролна сума.
Неправилно конфигуриран или злонамерен CLOUD_URL (или MITM в канала) можеше
незабелязано да подмени OAuth токените на доставчика.
Смекчаване във v3.8.6:
- Проверка чрез HMAC:
verifyCloudSignature(rawBody, sigHeader)проверява заглавкатаX-Cloud-Sig(HMAC-SHA256(OMNIROUTE_CLOUD_SYNC_SECRET, rawBody)), преди да анализира JSON. Ако тайната е зададена, подписът е задължителен. Ако не е (наследен режим), се записва предупреждение и отговорът се приема — тайната ще бъде задължителна във v3.9. - Изрично включване на тайните полета:
accessToken/refreshToken/providerSpecificDataсе презаписват само когатоOMNIROUTE_CLOUD_SYNC_SECRETS=true. Режимът по подразбиране синхронизира само метаданни, които не са идентификационни данни (expiresAt,status,lastError*,rateLimitedUntil,updatedAt). Това е нарушаваща съвместимостта промяна за потребители, които са разчитали на отдалечената синхронизация на токени — те трябва изрично да я включат.
Защо го запазваме: Cloud Sync е единственият начин за клиент на OmniRoute Cloud да централизира идентификационните данни на екипа. Корекцията прави модела на заплахите ясен: „сървърът подписва, клиентът проверява, операторът изрично разрешава“.
Профил за компилация: minimal
Потребителите, които се нуждаят от артефакт, съвместим със Socket, могат да го създадат чрез:
OMNIROUTE_BUILD_PROFILE=minimal npm run build
Webpack плъгинът NormalModuleReplacementPlugin пренасочва четири модула към заместители:
| Модул | Заместител |
|---|---|
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 |
Всеки заместител експортира същия интерфейс, но всяка функция хвърля
featureDisabledError(name) по време на изпълнение. Маршрутите, които зависят от деактивирания
модул, връщат HTTP 503 с ясно съобщение, вместо да активират
чувствителния път за изпълнение на кода.
Полученият пакет е предназначен за публикуване като omniroute-secure. Вижте
docs/ops/PUBLISHING_SECURE.md за инструкциите за публикуване.
Разделяне на приставката (проследява се за v4)
В дългосрочен план възнамеряваме да разделим npm пакета на отделни модули, които могат да се одитират независимо. Вижте етапа v4 в системата за проследяване на проблеми в GitHub за съответния проследяващ проблем.