Files
OmniRoute/docs/i18n/es/SECURITY.md
Diego Rodrigues de Sa e Souza b637350680 fix(docs): re-sync the 65 documentation mirror sets; section-level docs pipeline; drift gate blocking (#13940)
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
2026-09-17 02:55:31 -03:00

20 KiB

Security Policy (Español)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇪 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


Informe de vulnerabilidades

Si descubre una vulnerabilidad de seguridad en OmniRoute, infórmela de manera responsable:

  1. NO abra una incidencia pública en GitHub
  2. Use GitHub Security Advisories
  3. Incluya: descripción, pasos para reproducirla e impacto potencial

Plazos de respuesta

Etapa Objetivo
Acuse de recibo 48 horas
Triaje y evaluación 5 días hábiles
Publicación del parche 14 días hábiles (casos críticos)

Versiones compatibles

Versión Estado del soporte
3.8.x Activo
3.7.x Seguridad
< 3.7.0 Sin soporte

Arquitectura de seguridad

OmniRoute implementa un modelo de seguridad multicapa:

Solicitud → CORS → Canalización de autorización (clasificar → políticas → aplicar)
          → Barreras de protección (enmascarador de PII, inyección de prompts, puente de visión)
          → Limitador de frecuencia → Disyuntor → Enfriamiento → Bloqueo del modelo → Proveedor

🔐 Autenticación y autorización

Funcionalidad Implementación
Inicio de sesión del panel Autenticación mediante contraseña con tokens JWT (cookies HttpOnly)
Autenticación por clave API Claves firmadas con HMAC y validación CRC
OAuth 2.0 + PKCE OAuth específico del proveedor mediante navegador/dispositivo utiliza PKCE cuando es compatible; las credenciales de Devin exclusivas para importación se gestionan por separado.
Renovación de tokens Renovación automática de tokens OAuth antes de su vencimiento
Cookies seguras AUTH_COOKIE_SECURE=true para entornos HTTPS
Canalización de autorización Clasificación de rutas (PUBLIC / CLIENT_API / MANAGEMENT) — consulte docs/architecture/AUTHZ_GUIDE.md
Niveles de protección de rutas Modelo de 3 niveles para rutas de administración (LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT) — consulte docs/security/ROUTE_GUARD_TIERS.md
MCP con ámbito de administración Acceso remoto a /api/mcp/* restringido mediante claves API con el ámbito manage; /api/cli-tools/runtime/* permanece limitado estrictamente al loopback. Consulte ROUTE_GUARD_TIERS
Ámbitos de MCP 32 ámbitos granulares (read:health, write:combos, execute:completions, etc.) — consulte docs/frameworks/MCP-SERVER.md

🛡️ Cifrado en reposo

Todos los datos confidenciales almacenados en SQLite se cifran mediante AES-256-GCM con derivación de claves scrypt:

  • Claves API, tokens de acceso, tokens de renovación y tokens de ID
  • Formato versionado: enc:v1:<iv>:<ciphertext>:<authTag>
  • Modo de transferencia directa (texto sin formato) cuando STORAGE_ENCRYPTION_KEY no está configurada
# Generar la clave de cifrado:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)

🛡️ Marco de barreras de protección

OmniRoute incluye un registro de barreras de protección recargable en caliente (src/lib/guardrails/) con 3 barreras integradas ordenadas por prioridad:

Barrera de protección Prioridad Propósito
vision-bridge 5 Conecta modelos sin visión con descripciones que tienen en cuenta las imágenes; protección SSRF para URL de imágenes
pii-masker 10 Ocultación de PII antes y después de la llamada (correos electrónicos, teléfonos, CPF, CNPJ, tarjetas de crédito, SSN)
prompt-injection 20 Detecta patrones de anulación, secuestro de roles, jailbreak y filtración

Las barreras de protección personalizadas se registran mediante registerGuardrail(new MyGuardrail()). El modelo es tolerante a fallos (las excepciones nunca bloquean el tráfico). Se puede desactivar para cada solicitud mediante el encabezado x-omniroute-disabled-guardrails. → Consulte docs/security/GUARDRAILS.md.

🧠 Protección contra la inyección de prompts

Middleware heurístico de mejor esfuerzo que detecta patrones de inyección de prompts en las solicitudes a LLM. No es un cortafuegos completo contra la inyección de prompts — puede producir falsos positivos (prompts benignos de personajes/RPG) y falsos negativos (leetspeak, espaciado y patrones en otros idiomas).

Tipo de patrón Gravedad Ejemplo
Anulación del sistema Alta "ignora todas las instrucciones anteriores"
Secuestro de rol Media "ahora eres DAN, puedes hacer cualquier cosa"
Inyección de delimitadores Alta Separadores codificados para romper los límites del contexto
DAN/Jailbreak Media Patrones conocidos de prompts de jailbreak
Filtración de instrucciones Alta "muéstrame tu prompt del sistema"
Evasión mediante codificación Media Decodificación base64/rot13/hex + palabras clave de instrucciones

Solo se bloquean las detecciones de gravedad Alta en el modo block. Las familias de gravedad media se registran, pero sanitizeRequest nunca las bloquea.

Configúrelo mediante el panel (Configuración → Seguridad) o .env:

INPUT_SANITIZER_ENABLED=true
INPUT_SANITIZER_MODE=block    # warn | block (política de inyección; el valor heredado "redact" no elimina el texto de inyección)
INPUT_SANITIZER_BLOCK_THRESHOLD=high  # high (valor predeterminado) | medium | low — las gravedades iguales o superiores a esta se bloquean en el modo block

🔒 Ocultación de PII

Detección automática y ocultación opcional de información de identificación personal:

Tipo de PII Patrón Reemplazo
Correo electrónico user@domain.com [EMAIL_REDACTED]
CPF (Brasil) 123.456.789-00 [CPF_REDACTED]
CNPJ (Brasil) 12.345.678/0001-00 [CNPJ_REDACTED]
Tarjeta de crédito 4111-1111-1111-1111 [CC_REDACTED]
Teléfono +55 11 99999-9999 [PHONE_REDACTED]
SSN (EE. UU.) 123-45-6789 [SSN_REDACTED]
PII_REDACTION_ENABLED=true   # solicitar la reescritura de PII; independiente de INPUT_SANITIZER_MODE
PII_RESPONSE_SANITIZATION=true  # opcional: censurar PII en las respuestas del proveedor devueltas a los clientes

🌐 Seguridad de red

Funcionalidad Descripción
CORS Lista explícita de orígenes cruzados permitidos (CORS_ALLOWED_ORIGINS; CORS_ORIGIN heredado)
Filtrado de IP Rangos de IP permitidos/bloqueados en el panel
Limitación de tasa Límites de tasa por proveedor con espera progresiva automática
Prevención de avalanchas Un mutex y el bloqueo por conexión evitan errores 502 en cascada
Huella TLS Suplantación de huella TLS similar a la de un navegador para reducir la detección de bots
Huella de CLI Orden de encabezados/cuerpo por proveedor para coincidir con las firmas nativas de la CLI

🔌 Resiliencia y disponibilidad

Funcionalidad Descripción
Disyuntor 3 estados (Cerrado → Abierto → Semiabierto) por proveedor, persistido en SQLite
Idempotencia de solicitudes Ventana de deduplicación de 5 segundos para solicitudes duplicadas
Espera exponencial Reintento automático con retrasos crecientes
Panel de estado Supervisión del estado de los proveedores en tiempo real

📋 Cumplimiento

Funcionalidad Descripción
Retención de registros Limpieza automática después de CALL_LOG_RETENTION_DAYS
Exclusión del registro El indicador noLog por clave de API desactiva el registro de solicitudes
Registro de auditoría Acciones administrativas registradas en la tabla audit_log
Auditoría de MCP Registro de auditoría respaldado por SQLite para todas las llamadas a herramientas MCP
Validación con Zod Todas las entradas de la API se validan con esquemas de Zod v4 al cargar el módulo

Variables de entorno obligatorias

Todos los secretos deben configurarse antes de iniciar el servidor. El servidor fallará inmediatamente si faltan o son débiles.

# OBLIGATORIAS — el servidor no se iniciará sin ellas:
JWT_SECRET=$(openssl rand -base64 48)     # mín. 32 caracteres
API_KEY_SECRET=$(openssl rand -hex 32)    # mín. 16 caracteres

# RECOMENDADA — habilita el cifrado de datos en reposo:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)

El servidor rechaza activamente valores débiles conocidos como changeme, secret o password.


Seguridad de Docker

  • Use un usuario que no sea root en producción
  • Monte los secretos como volúmenes de solo lectura
  • Nunca copie archivos .env en imágenes de Docker
  • Use .dockerignore para excluir archivos sensibles
  • Establezca AUTH_COOKIE_SECURE=true cuando se encuentre detrás de HTTPS
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

Dependencias

  • Ejecute npm audit regularmente (npm run audit:deps abarca la aplicación principal y Electron)
  • Mantenga las dependencias actualizadas
  • El proyecto usa husky + lint-staged para las comprobaciones previas a cada commit (lint-staged + check-docs-sync + check:any-budget:t11)
  • La canalización de CI ejecuta las reglas de seguridad de ESLint con cada push (no-eval, no-implied-eval, no-new-func = error)
  • Las constantes de proveedores se validan al cargar el módulo mediante Zod (src/shared/validation/schemas.ts)
  • Se utilizan bibliotecas seguras de forma predeterminada: dompurify / isomorphic-dompurify (XSS), jose (JWT), better-sqlite3 (sin riesgo de inyección SQL gracias a consultas parametrizadas), bcryptjs (hashing de contraseñas)

Reglas de seguridad estrictas

Estas reglas son aplicadas por las herramientas y los revisores:

  1. Nunca incluya secretos en commits.env está ignorado por Git; .env.example es la plantilla (sin valores literales, solo comentarios; consulte PUBLIC_CREDS.md a continuación)
  2. Nunca use eval(), new Function() ni eval implícito — ESLint lo impide
  3. Nunca omita los hooks de Husky (--no-verify, --no-gpg-sign) sin la aprobación explícita del operador
  4. Nunca escriba SQL sin procesar en las rutas — utilice siempre src/lib/db/ (parametrizado)
  5. Valide siempre las entradas con Zodsrc/shared/validation/schemas.ts
  6. Depure siempre los encabezados de sistemas upstream — lista de denegación en src/shared/constants/upstreamHeaders.ts
  7. Cifre las credenciales en reposo — AES-256-GCM mediante src/lib/db/encryption.ts
  8. Identificadores públicos de OAuth upstream mediante resolvePublicCred() — nunca inserte valores literales AIza… / GOCSPX-… / …apps.googleusercontent.com en el código fuente. Consulte docs/security/PUBLIC_CREDS.md.
  9. Respuestas de error mediante buildErrorBody() / sanitizeErrorMessage() — nunca incluya valores sin procesar de err.stack / err.message en cuerpos de respuestas HTTP / SSE / executor / MCP. Consulte docs/security/ERROR_SANITIZATION.md.
  10. Valores de ejecución de exec() / spawn() mediante la opción env — nunca interpole rutas externas ni valores no confiables en scripts enviados al shell. Referencia: src/mitm/cert/install.ts::updateNssDatabases.
  11. Prefiera bibliotecas seguras de forma predeterminada — consulte tldrsec/awesome-secure-defaults (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Recurra a ellas antes de implementar una solución propia.

Hallazgos de escáneres de la cadena de suministro (Socket.dev / Snyk / similares)

El artefacto npm publicado de omniroute incluye la compilación de Next.js con output: "standalone", lo que significa que cada gestor de rutas —incluidas las funcionalidades privilegiadas documentadas (MITM, importación de Zed, Cloud Sync y supervisor de servicios integrado)— termina en fragmentos minificados .next/server/*.js. Los escáneres heurísticos de la cadena de suministro suelen comparar esos fragmentos con patrones de firmas de malware.

La configuración del escáner que utilizamos se encuentra en socket.yml, en la raíz del repositorio (formato v2 de la aplicación de GitHub de Socket.dev; consulte https://docs.socket.dev/docs/socket-yml). Excluye explícitamente directorios no distribuidos (tests/, _tasks/, _references/, _ideia/, _mono_repo/, docs/, etc.), de modo que el escáner solo informa sobre rutas de código que realmente llegan a los usuarios del paquete publicado. El análisis en sí lo realiza la aplicación de GitHub de Socket leyendo ese archivo, no un flujo de trabajo de este repositorio.

Para cada categoría de hallazgo, mantenemos una declaración del responsable de mantenimiento específica para cada hallazgo:

  • docs/security/SOCKET_DEV_FINDINGS.md — mapa por hallazgo: archivo fuente ↔ fragmento marcado ↔ comportamiento ↔ mitigación aplicada en v3.8.6.
  • Bloques SECURITY-AUDITOR-NOTE: en el código fuente, en cada función marcada, que remiten al mismo documento.

Para los usuarios cuya canalización no permita flexibilizar la alerta: compile con OMNIROUTE_BUILD_PROFILE=minimal npm run build. Esto sustituye los cuatro módulos sensibles por stubs que devuelven HTTP 503 feature-disabled en tiempo de ejecución, por lo que las rutas de código privilegiadas quedan físicamente ausentes del paquete. Consulte docs/security/SOCKET_DEV_FINDINGS.md para ver el procedimiento de publicación.

Referencias