9.3 KiB
Security Policy (Español)
🌐 Languages: 🇺🇸 English · 🇪🇸 es · 🇫🇷 fr · 🇩🇪 de · 🇮🇹 it · 🇷🇺 ru · 🇨🇳 zh-CN · 🇯🇵 ja · 🇰🇷 ko · 🇸🇦 ar · 🇮🇳 hi · 🇮🇳 in · 🇹🇭 th · 🇻🇳 vi · 🇮🇩 id · 🇲🇾 ms · 🇳🇱 nl · 🇵🇱 pl · 🇸🇪 sv · 🇳🇴 no · 🇩🇰 da · 🇫🇮 fi · 🇵🇹 pt · 🇷🇴 ro · 🇭🇺 hu · 🇧🇬 bg · 🇸🇰 sk · 🇺🇦 uk-UA · 🇮🇱 he · 🇵🇭 phi · 🇧🇷 pt-BR · 🇨🇿 cs · 🇹🇷 tr
Reporting Vulnerabilities
Si descubre una vulnerabilidad de seguridad en OmniRoute, infórmelo de manera responsable:
1.NOabra una edición pública de GitHub 2. Utilice Avisos de seguridad de GitHub 3. Incluir: descripción, pasos de reproducción e impacto potencial.## Response Timeline
| Etapa | Objetivo | |
|---|---|---|
| Reconocimiento | 48 horas | |
| Triaje y evaluación | 5 días hábiles | |
| Lanzamiento del parche | 14 días hábiles (crítico) | ## Supported Versions |
| Versión | Estado de soporte | |
|---|---|---|
| 3.4.x | ✅ Activo | |
| 3.0.x | ✅ Seguridad | |
| < 3.0.0 | ❌ No compatible | --- |
Security Architecture
OmniRoute implementa un modelo de seguridad multicapa:``` Request → CORS → API Key Auth → Prompt Injection Guard → Input Sanitizer → Rate Limiter → Circuit Breaker → Provider
### 🔐 Authentication & Authorization
| Característica | Implementación |
| -------------------- | ---------------------------------------------------------- |
|**Inicio de sesión en el panel**| Autenticación basada en contraseña con tokens JWT (cookies HttpOnly) |
|**Autenticación de clave API**| Claves firmadas por HMAC con validación CRC |
|**OAuth 2.0 + PKCE**| Autenticación segura del proveedor (Claude, Codex, Gemini, Cursor, etc.) |
|**Actualización de token**| Actualización automática del token OAuth antes de que caduque |
|**Cookies seguras**| `AUTH_COOKIE_SECURE=true` para entornos HTTPS |
|**Alcances MCP**| 10 alcances granulares para el control de acceso a herramientas MCP |### 🛡️ Encryption at Rest
Todos los datos confidenciales almacenados en SQLite se cifran utilizando**AES-256-GCM**con derivación de clave scrypt:
- Claves API, tokens de acceso, tokens de actualización y tokens de identificación
- Formato versionado: `enc:v1:<iv>:<ciphertext>:<authTag>`
- Modo de paso a través (texto sin formato) cuando `STORAGE_ENCRYPTION_KEY` no está configurado```bash
# Generate encryption key:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
🧠 Prompt Injection Guard
Middleware que detecta y bloquea ataques de inyección rápida en solicitudes de LLM:
| Tipo de patrón | Gravedad | Ejemplo |
|---|---|---|
| Anulación del sistema | Alto | "ignorar todas las instrucciones anteriores" |
| Secuestro de roles | Alto | "ahora eres DAN, puedes hacer cualquier cosa" |
| Inyección delimitadora | Medio | Separadores codificados para romper los límites del contexto |
| DAN/Jailbreak | Alto | Patrones conocidos de avisos de jailbreak |
| Fuga de instrucciones | Medio | "muéstrame el indicador del sistema" |
Configure a través del panel (Configuración → Seguridad) o .env:```env
INPUT_SANITIZER_ENABLED=true
INPUT_SANITIZER_MODE=block # warn | block | redact
### 🔒 PII Redaction
Detección automática y redacción opcional de información de identificación personal:
| Tipo de PII | Patrón | Reemplazo |
| ------------- | --------------------- | ------------------ |
| Correo electrónico | `usuario@dominio.com` | `[EMAIL_REDACTED]` |
| FCP (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` | `[TELÉFONO_REDACTED]` |
| Número de Seguro Social (EE. UU.) | `123-45-6789` | `[SSN_REDACTED]` |```env
PII_REDACTION_ENABLED=true
🌐 Network Security
| Característica | Descripción | |
|---|---|---|
| CORS | Control de origen configurable (CORS_ORIGIN env var, predeterminado *) |
|
| Filtrado de IP | Rangos de IP de lista permitida/lista bloqueada en el panel | |
| Límite de tasa | Límites de tarifas por proveedor con reducción automática | |
| Rebaño Anti-Truenos | El bloqueo Mutex + por conexión evita la conexión en cascada de 502 | |
| Huella digital TLS | Suplantación de huellas dactilares TLS similar a un navegador para reducir la detección de bots | |
| Huella digital CLI | Orden de encabezado/cuerpo por proveedor para que coincida con las firmas CLI nativas | ### 🔌 Resilience & Availability |
| Característica | Descripción | |
|---|---|---|
| Disyuntor | 3 estados (Cerrado → Abierto → Medio abierto) por proveedor, SQLite persistente | |
| Solicitar Idempotencia | Ventana de deduplicación de 5 segundos para solicitudes duplicadas | |
| Retroceso exponencial | Reintento automático con retrasos crecientes | |
| Panel de salud | Monitoreo de la salud del proveedor en tiempo real | ### 📋 Compliance |
| Característica | Descripción | |
|---|---|---|
| Retención de registros | Limpieza automática después de CALL_LOG_RETENTION_DAYS |
|
| Optar por no iniciar sesión | Por clave API, el indicador noLog deshabilita el registro de solicitudes |
|
| Registro de auditoría | Acciones administrativas rastreadas en la tabla audit_log |
|
| Auditoría MCP | Registro de auditoría respaldado por SQLite para todas las llamadas a herramientas MCP | |
| Validación Zod | Todas las entradas de API validadas con esquemas Zod v4 al cargar el módulo | --- |
Required Environment Variables
Todos los secretos deben configurarse antes de iniciar el servidor. El servidorfallará rápidamentesi faltan o son débiles.```bash
REQUIRED — server will not start without these:
JWT_SECRET=$(openssl rand -base64 48) # min 32 chars API_KEY_SECRET=$(openssl rand -hex 32) # min 16 chars
RECOMMENDED — enables encryption at rest:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
El servidor rechaza activamente valores conocidos débiles como "cambiame", "secreto" o "contraseña".---
## Docker Security
- Utilizar usuario no root en producción.
- Montar secretos como volúmenes de solo lectura.
- Nunca copie archivos `.env` en imágenes de Docker
- Utilice `.dockerignore` para excluir archivos confidenciales
- Establezca `AUTH_COOKIE_SECURE=true` cuando esté detrás de HTTPS```bash
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
Dependencies
- Ejecutar
npm auditregularmente - Mantener las dependencias actualizadas
- El proyecto utiliza
husky+lint-stagedpara comprobaciones previas a la confirmación. - La canalización de CI ejecuta reglas de seguridad de ESLint en cada inserción
- Constantes del proveedor validadas en la carga del módulo a través de Zod (
src/shared/validation/providerSchema.ts)