Files
OmniRoute/docs/i18n/bg/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

23 KiB
Raw Blame History

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. Той съществува, за да:

  1. Операторите на конвейери за сигурност разполагат с единен източник, който да цитират, когато трябва да оценят констатациите спрямо действителния изходен код.
  2. Бъдещите AI скенери могат да разпознаят подписаното от поддържащия проекта твърдение, че всеки маркиран път е преднамерен, активира се по избор и е документиран.
  3. Разполагаме с писмен запис защо всяко място на извикване е структурирано по този начин — така че бъдещо рефакториране да не въведе отново по невнимание отпечатък, който умишлено е бил премахнат.

Ако управлявате скенер, който отново маркира някое от местата на извикване по-долу, след като мерките за ограничаване във 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.ts
  • src/lib/zed-oauth/keychain-reader.ts
  • src/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 стъпки:

  1. POST /api/providers/zed/discover връща { candidates: [{ provider, service, account, fingerprint }] }. Необработеният токен никога не се предава. Отпечатъкът е sha256(service|account|token).slice(0,16).
  2. Таблото за управление визуализира списъка с кандидати, операторът избира кои да бъдат импортирани и изпраща { confirmedAccounts: [{ service, account, fingerprint }] } към POST /api/providers/zed/import.
  3. Крайната точка за импортиране прочита отново хранилището за ключове на сървъра и филтрира по (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.tssyncToCloud() / 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:

  1. Проверка чрез HMAC: verifyCloudSignature(rawBody, sigHeader) проверява заглавката X-Cloud-Sig (HMAC-SHA256(OMNIROUTE_CLOUD_SYNC_SECRET, rawBody)), преди да анализира JSON. Ако тайната е зададена, подписът е задължителен. Ако не е (наследен режим), се записва предупреждение и отговорът се приема — тайната ще бъде задължителна във v3.9.
  2. Изрично включване на тайните полета: 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 за съответния проследяващ проблем.