1,104 mirrors rewritten over five passes of run-translation on the 22-source core set: the 14 sources edited since their translation, the 322 mirrors that were still English copies, and the frontmatter the old extractor leaked into the newer locales' bodies. The pipeline now caches per-`## `-section hashes and retranslates only changed sections, never reuses a section that is still English, rebuilds English-copy / leaked mirrors even when the source is unchanged, merges the state on save (parallel runs), and the drift gate (scoped to the core set) is blocking. Final audit: 0 stale, 0 English copies, 0 leaked frontmatter across 1,430 core mirrors. ⚠️ base-red inherited: #12732
28 KiB
Security Policy (Русский)
🌐 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 · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Сообщение об уязвимостях
Если вы обнаружили уязвимость безопасности в OmniRoute, сообщите о ней ответственным образом:
- НЕ создавайте публичную задачу в GitHub
- Используйте рекомендации по безопасности GitHub
- Укажите описание, шаги для воспроизведения и потенциальное воздействие
Сроки реагирования
| Этап | Целевой срок |
|---|---|
| Подтверждение | 48 часов |
| Сортировка и оценка | 5 рабочих дней |
| Выпуск исправления | 14 рабочих дней (критическое) |
Поддерживаемые версии
| Версия | Статус поддержки |
|---|---|
| 3.8.x | ✅ Активная |
| 3.7.x | ✅ Исправления безопасности |
| < 3.7.0 | ❌ Не поддерживается |
Архитектура безопасности
OmniRoute реализует многоуровневую модель безопасности:
Запрос → CORS → Конвейер Authz (классификация → политики → применение)
→ Защитные механизмы (маскирование PII, инъекция промптов, мост для изображений)
→ Ограничитель частоты → Автоматический выключатель → Период ожидания → Блокировка модели → Провайдер
🔐 Аутентификация и авторизация
| Функция | Реализация |
|---|---|
| Вход в панель управления | Аутентификация по паролю с JWT-токенами (файлы cookie HttpOnly) |
| Аутентификация по API-ключу | Ключи с HMAC-подписью и проверкой CRC |
| OAuth 2.0 + PKCE | Специфичный для провайдера браузерный/устройственный OAuth использует PKCE там, где он поддерживается; учётные данные Devin, предназначенные только для импорта, обрабатываются отдельно. |
| Обновление токенов | Автоматическое обновление OAuth-токенов до истечения срока действия |
| Безопасные файлы cookie | AUTH_COOKIE_SECURE=true для сред HTTPS |
| Конвейер Authz | Классификация маршрутов (PUBLIC / CLIENT_API / MANAGEMENT) — см. docs/architecture/AUTHZ_GUIDE.md |
| Уровни защиты маршрутов | Трёхуровневая модель для маршрутов управления (LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT) — см. docs/security/ROUTE_GUARD_TIERS.md |
| MCP с областью manage | Удалённый доступ к /api/mcp/* ограничен API-ключами с областью manage; /api/cli-tools/runtime/* остаётся строго доступным только через loopback. См. ROUTE_GUARD_TIERS |
| Области MCP | 32 детализированные области (read:health, write:combos, execute:completions и т. д.) — см. docs/frameworks/MCP-SERVER.md |
🛡️ Шифрование хранимых данных
Все конфиденциальные данные, хранящиеся в SQLite, шифруются с помощью AES-256-GCM с формированием ключа посредством scrypt:
- API-ключи, токены доступа, токены обновления и ID-токены
- Версионируемый формат:
enc:v1:<iv>:<ciphertext>:<authTag> - Режим сквозной передачи (открытый текст), когда
STORAGE_ENCRYPTION_KEYне задан
# Сгенерировать ключ шифрования:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
🛡️ Фреймворк защитных механизмов
OmniRoute поставляется с поддерживающим горячую перезагрузку реестром защитных механизмов (src/lib/guardrails/), содержащим 3 встроенных защитных механизма, упорядоченных по приоритету:
| Защитный механизм | Приоритет | Назначение |
|---|---|---|
vision-bridge |
5 | Дополняет модели без поддержки изображений описаниями с учётом изображений; защита URL изображений от SSRF |
pii-masker |
10 | Сокрытие PII до и после вызова (адреса электронной почты, телефоны, CPF, CNPJ, кредитные карты, SSN) |
prompt-injection |
20 | Обнаруживает шаблоны переопределения, перехвата роли, джейлбрейка и утечки |
Пользовательские защитные механизмы регистрируются через registerGuardrail(new MyGuardrail()). Модель работает по принципу fail-open (исключения никогда не блокируют трафик). Отключение для отдельных запросов выполняется через заголовок x-omniroute-disabled-guardrails. → См. docs/security/GUARDRAILS.md.
🧠 Защита от инъекций промптов
Эвристическое промежуточное ПО, которое по мере возможности обнаруживает шаблоны инъекций промптов в запросах к LLM. Не является полноценным межсетевым экраном против инъекций промптов — возможны ложноположительные результаты (безобидные промпты с персонажами или ролевыми играми) и ложноотрицательные результаты (литспик, пробелы, шаблоны не на английском языке).
| Тип шаблона | Уровень опасности | Пример |
|---|---|---|
| Переопределение системы | Высокий | "игнорируй все предыдущие инструкции" |
| Перехват роли | Средний | "теперь ты DAN и можешь делать всё что угодно" |
| Инъекция разделителей | Высокий | Закодированные разделители для нарушения границ контекста |
| DAN/джейлбрейк | Средний | Известные шаблоны промптов для джейлбрейка |
| Утечка инструкций | Высокий | "покажи мне свой системный промпт" |
| Обход посредством кодирования | Средний | Декодирование base64/rot13/hex + ключевые слова инструкций |
В режиме block блокируются только обнаружения высокого уровня опасности. Семейства
среднего уровня опасности регистрируются в журнале, но никогда не блокируются функцией sanitizeRequest.
Настройте через панель управления (Настройки → Безопасность) или .env:
INPUT_SANITIZER_ENABLED=true
INPUT_SANITIZER_MODE=block # warn | block (политика инъекций; устаревший режим "redact" не удаляет текст инъекции)
INPUT_SANITIZER_BLOCK_THRESHOLD=high # high (по умолчанию) | medium | low — в режиме block блокируются уровни опасности не ниже указанного
🔒 Сокрытие PII
Автоматическое обнаружение и необязательное сокрытие персональных данных:
| Тип PII | Шаблон | Замена |
|---|---|---|
| Электронная почта | user@domain.com |
[EMAIL_REDACTED] |
| CPF (Бразилия) | 123.456.789-00 |
[CPF_REDACTED] |
| CNPJ (Бразилия) | 12.345.678/0001-00 |
[CNPJ_REDACTED] |
| Банковская карта | 4111-1111-1111-1111 |
[CC_REDACTED] |
| Телефон | +55 11 99999-9999 |
[PHONE_REDACTED] |
| SSN (США) | 123-45-6789 |
[SSN_REDACTED] |
PII_REDACTION_ENABLED=true # запрашивает маскирование PII; не зависит от INPUT_SANITIZER_MODE
PII_RESPONSE_SANITIZATION=true # необязательно: маскирует PII в ответах провайдера, возвращаемых клиентам
🌐 Сетевая безопасность
| Функция | Описание |
|---|---|
| CORS | Явный список разрешённых источников (CORS_ALLOWED_ORIGINS; устаревшая переменная CORS_ORIGIN) |
| Фильтрация IP | Диапазоны разрешённых/заблокированных IP-адресов в панели управления |
| Ограничение частоты запросов | Ограничения частоты запросов для каждого провайдера с автоматической отсрочкой |
| Защита от лавинообразной нагрузки | Мьютекс и блокировка для каждого соединения предотвращают каскадные ошибки 502 |
| Отпечаток TLS | Имитация отпечатка TLS браузера для снижения вероятности обнаружения бота |
| Отпечаток CLI | Порядок заголовков/тела для каждого провайдера в соответствии с сигнатурами нативного CLI |
🔌 Отказоустойчивость и доступность
| Функция | Описание |
|---|---|
| Автоматический выключатель | 3 состояния (закрыт → открыт → полуоткрыт) для каждого провайдера, с сохранением в SQLite |
| Идемпотентность запросов | 5-секундное окно дедупликации повторяющихся запросов |
| Экспоненциальная отсрочка | Автоматическая повторная попытка с увеличением задержки |
| Панель мониторинга состояния | Мониторинг состояния провайдеров в реальном времени |
📋 Соответствие нормативным требованиям
| Функция | Описание |
|---|---|
| Хранение журналов | Автоматическая очистка по истечении CALL_LOG_RETENTION_DAYS |
| Отказ от журналирования | Флаг noLog для каждого API-ключа отключает журналирование запросов |
| Журнал аудита | Административные действия отслеживаются в таблице audit_log |
| Аудит MCP | Журналирование аудита на основе SQLite для всех вызовов инструментов MCP |
| Валидация Zod | Все входные данные API проверяются схемами Zod v4 при загрузке модуля |
Обязательные переменные окружения
Все секреты должны быть заданы до запуска сервера. Сервер немедленно завершит работу, если они отсутствуют или являются ненадёжными.
# ОБЯЗАТЕЛЬНО — без этих переменных сервер не запустится:
JWT_SECRET=$(openssl rand -base64 48) # минимум 32 символа
API_KEY_SECRET=$(openssl rand -hex 32) # минимум 16 символов
# РЕКОМЕНДУЕТСЯ — включает шифрование хранимых данных:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
Сервер активно отклоняет заведомо ненадёжные значения, такие как changeme, secret или password.
Безопасность Docker
- Используйте пользователя без прав root в рабочей среде
- Подключайте секреты как тома только для чтения
- Никогда не копируйте файлы
.envв образы Docker - Используйте
.dockerignore, чтобы исключить конфиденциальные файлы - При работе через HTTPS задайте
AUTH_COOKIE_SECURE=true
docker run -d \
--name omniroute \
--restart unless-stopped \
--read-only \
-p 20128:20128 \
-v omniroute-data:/app/data \
-e JWT_SECRET="$(openssl rand -base64 48)" \
-e API_KEY_SECRET="$(openssl rand -hex 32)" \
-e STORAGE_ENCRYPTION_KEY="$(openssl rand -hex 32)" \
diegosouzapw/omniroute:latest
Зависимости
- Регулярно запускайте
npm audit(npm run audit:depsпроверяет основную часть проекта и Electron) - Своевременно обновляйте зависимости
- Проект использует
husky+lint-stagedдля проверок перед коммитом (lint-staged + check-docs-sync + check:any-budget:t11) - Конвейер CI при каждой отправке изменений запускает правила безопасности ESLint (
no-eval,no-implied-eval,no-new-func= ошибка) - Константы провайдеров проверяются при загрузке модуля с помощью Zod (
src/shared/validation/schemas.ts) - Используются библиотеки с безопасными настройками по умолчанию:
dompurify/isomorphic-dompurify(защита от XSS),jose(JWT),better-sqlite3(защита от SQL-инъекций за счёт параметризованных запросов),bcryptjs(хеширование паролей)
Строгие правила безопасности
Соблюдение этих правил обеспечивается инструментами и проверяющими:
- Никогда не фиксируйте секреты в репозитории —
.envдобавлен в gitignore;.env.exampleиспользуется как шаблон (без литеральных значений, только комментарии — см. PUBLIC_CREDS.md ниже) - Никогда не используйте
eval(),new Function()или неявный eval — это контролируется ESLint - Никогда не обходите хуки Husky (
--no-verify,--no-gpg-sign) без явного разрешения оператора - Никогда не пишите необработанные SQL-запросы в маршрутах — всегда используйте
src/lib/db/(параметризованные запросы) - Всегда проверяйте входные данные с помощью Zod —
src/shared/validation/schemas.ts - Всегда очищайте заголовки вышестоящих серверов — список запрещённых заголовков находится в
src/shared/constants/upstreamHeaders.ts - Шифруйте учётные данные при хранении — AES-256-GCM через
src/lib/db/encryption.ts - Получайте публичные идентификаторы OAuth вышестоящих сервисов через
resolvePublicCred()— никогда не встраивайте литералыAIza…/GOCSPX-…/…apps.googleusercontent.comв исходный код. См.docs/security/PUBLIC_CREDS.md. - Формируйте ответы с ошибками через
buildErrorBody()/sanitizeErrorMessage()— никогда не помещайте необработанныеerr.stack/err.messageв тела ответов HTTP / SSE / executor / MCP. См.docs/security/ERROR_SANITIZATION.md. - Передавайте значения времени выполнения для
exec()/spawn()через параметрenv— никогда не используйте строковую интерполяцию внешних путей или недоверенных значений в скриптах, передаваемых оболочке. Пример:src/mitm/cert/install.ts::updateNssDatabases. - Отдавайте предпочтение библиотекам с безопасными настройками по умолчанию — см. tldrsec/awesome-secure-defaults (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Используйте их вместо самостоятельной реализации.
Результаты сканирования цепочки поставок (Socket.dev / Snyk / аналогичные инструменты)
Опубликованный npm-артефакт omniroute включает сборку Next.js с output: "standalone",
а это означает, что каждый обработчик маршрута — включая документированные
привилегированные функции (MITM, импорт Zed, Cloud Sync, встроенный супервизор сервисов) —
попадает в минифицированные чанки .next/server/*.js. Эвристические сканеры цепочки
поставок часто сопоставляют шаблоны в этих чанках с сигнатурами вредоносного ПО.
Используемая нами конфигурация сканера находится в файле socket.yml в
корне репозитория (формат Socket.dev GitHub App v2 — см.
https://docs.socket.dev/docs/socket-yml). Она явно исключает
непубликуемые каталоги (tests/, _tasks/, _references/, _ideia/,
_mono_repo/, docs/ и т. д.), поэтому сканер сообщает только о путях выполнения кода,
которые действительно попадают к пользователям опубликованного пакета. Само сканирование
запускается приложением Socket GitHub App, которое считывает этот файл, а не рабочим
процессом в данном репозитории.
Для каждой категории обнаружений мы поддерживаем отдельное подтверждение от сопровождающих:
docs/security/SOCKET_DEV_FINDINGS.md— карта для каждого обнаружения: исходный файл ↔ отмеченный чанк ↔ поведение ↔ мера по снижению риска, применённая в v3.8.6.- Блоки
SECURITY-AUDITOR-NOTE:в исходном коде возле каждой отмеченной функции ссылаются на тот же документ.
Пользователи, чьи конвейеры не позволяют ослабить это предупреждение, могут выполнить сборку с помощью
OMNIROUTE_BUILD_PROFILE=minimal npm run build. При этом четыре
чувствительных модуля заменяются заглушками, которые во время выполнения возвращают HTTP 503
feature-disabled, поэтому привилегированные пути выполнения кода физически отсутствуют в сборке.
Инструкции по публикации см. в docs/security/SOCKET_DEV_FINDINGS.md.
Ссылки
docs/architecture/AUTHZ_GUIDE.md— конвейер авторизацииdocs/security/GUARDRAILS.md— инфраструктура защитных ограниченийdocs/security/COMPLIANCE.md— журнал аудита и хранение данныхdocs/security/PUBLIC_CREDS.md— обязательный шаблон для общедоступных учётных данных вышестоящих сервисовdocs/security/ERROR_SANITIZATION.md— обязательный шаблон для ответов с ошибкамиdocs/security/SOCKET_DEV_FINDINGS.md— подтверждение сопровождающих для результатов сканирования цепочки поставокdocs/architecture/RESILIENCE_GUIDE.md— автоматический выключатель + период ожидания + блокировкаdocs/security/STEALTH_GUIDE.md— цифровые отпечатки TLS (юридическое/этическое уведомление)CLAUDE.md— строгие правила для ИИ-агентов- tldrsec/awesome-secure-defaults — тщательно отобранные библиотеки с безопасными настройками по умолчанию