9.2 KiB
Security Policy (Italiano)
🌐 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
Se scopri una vulnerabilità della sicurezza in OmniRoute, segnalala in modo responsabile:
1.NONaprire un problema pubblico di GitHub 2. Utilizzare Avvisi sulla sicurezza di GitHub 3. Includere: descrizione, passaggi di riproduzione e potenziale impatto## Response Timeline
| Palcoscenico | Obiettivo | |
|---|---|---|
| Riconoscimento | 48 ore | |
| Triage e valutazione | 5 giorni lavorativi | |
| Rilascio patch | 14 giorni lavorativi (critico) | ## Supported Versions |
| Versione | Support Status | |
|---|---|---|
| 3.4.x | ✅Attivo | |
| 3.0.x | ✅ Sicurezza | |
| <3.0.0 | ❌ Non supportato | --- |
Security Architecture
OmniRoute implementa un modello di sicurezza a più livelli:``` Request → CORS → API Key Auth → Prompt Injection Guard → Input Sanitizer → Rate Limiter → Circuit Breaker → Provider
### 🔐 Authentication & Authorization
| Caratteristica | Attuazione |
| -------------------- | ---------------------------------------------------------- |
|**Accesso alla dashboard**| Autenticazione basata su password con token JWT (cookie HttpOnly) |
|**Autenticazione chiave API**| Chiavi firmate HMAC con convalida CRC |
|**OAuth 2.0 + PKCE**| Autenticazione sicura del provider (Claude, Codex, Gemini, Cursor, ecc.) |
|**Aggiornamento token**| Aggiornamento automatico del token OAuth prima della scadenza |
|**Cookie sicuri**| `AUTH_COOKIE_SECURE=true` per ambienti HTTPS |
|**Ambiti MCP**| 10 ambiti granulari per il controllo dell'accesso allo strumento MCP |### 🛡️ Encryption at Rest
Tutti i dati sensibili archiviati in SQLite vengono crittografati utilizzando**AES-256-GCM**con derivazione della chiave scrypt:
- Chiavi API, token di accesso, token di aggiornamento e token ID
- Formato della versione: `enc:v1:<iv>:<ciphertext>:<authTag>`
- Modalità passthrough (testo normale) quando `STORAGE_ENCRYPTION_KEY` non è impostato```bash
# Generate encryption key:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
🧠 Prompt Injection Guard
Middleware che rileva e blocca gli attacchi di prompt injection nelle richieste LLM:
| Tipo di modello | Gravità | Esempio |
|---|---|---|
| Override del sistema | Alto | "ignora tutte le istruzioni precedenti" |
| Dirottamento del ruolo | Alto | "ora sei DAN, puoi fare qualsiasi cosa" |
| Iniezione delimitatore | Medio | Separatori codificati per rompere i confini del contesto |
| DAN/Jailbreak | Alto | Modelli di prompt di jailbreak noti |
| Perdita di istruzioni | Medio | "mostrami il prompt del tuo sistema" |
Configura tramite dashboard (Impostazioni → Sicurezza) o .env:```env
INPUT_SANITIZER_ENABLED=true
INPUT_SANITIZER_MODE=block # warn | block | redact
### 🔒 PII Redaction
Rilevamento automatico e oscuramento facoltativo delle informazioni di identificazione personale:
| Tipo PII | Modello | Sostituzione |
| ------------- | --------------------- | ------------------ |
| E-mail | `utente@dominio.com` | `[EMAIL_REDACTED]` |
| CPF (Brasile) | `123.456.789-00` | `[CPF_REDACTED]` |
| CNPJ (Brasile) | `12.345.678/0001-00` | `[CNPJ_REDACTED]` |
| Carta di credito | `4111-1111-1111-1111` | `[CC_REDACTED]` |
| Telefono | `+55 11 99999-9999` | `[PHONE_REDACTED]` |
| SSN (USA) | `123-45-6789` | `[SSN_REDACTED]` |```env
PII_REDACTION_ENABLED=true
🌐 Network Security
| Caratteristica | Descrizione | |
|---|---|---|
| CORSO | Controllo dell'origine configurabile (CORS_ORIGIN env var, predefinito *) |
|
| Filtro IP | Intervalli IP della lista consentita/lista bloccata nella dashboard | |
| Limitazione della velocità | Limiti tariffari per fornitore con backoff automatico | |
| Branco Antituonante | Mutex + blocco per connessione impedisce 502 a cascata | |
| Impronta digitale TLS | Browser-like TLS fingerprint spoofing to reduce bot detection | |
| Impronta digitale CLI | Ordinamento dell'intestazione/corpo per provider in modo che corrisponda alle firme CLI native | ### 🔌 Resilience & Availability |
| Caratteristica | Descrizione | |
|---|---|---|
| Interruttore automatico | 3 stati (Chiuso → Aperto → Semiaperto) per provider, persistente su SQLite | |
| Richiesta Idempotenza | Finestra di deduplicazione di 5 secondi per richieste duplicate | |
| Backoff esponenziale | Nuovo tentativo automatico con ritardi crescenti | |
| Dashboard salute | Monitoraggio dello stato del fornitore in tempo reale | ### 📋 Compliance |
| Caratteristica | Descrizione | |
|---|---|---|
| Conservazione dei registri | Pulizia automatica dopo CALL_LOG_RETENTION_DAYS |
|
| Disattivazione senza registrazione | Il flag "noLog" per chiave API disabilita la registrazione delle richieste | |
| Registro di controllo | Azioni amministrative tracciate nella tabella audit_log |
|
| Audit MCP | Registrazione di controllo supportata da SQLite per tutte le chiamate allo strumento MCP | |
| Convalida Zod | Tutti gli input API convalidati con schemi Zod v4 al caricamento del modulo | --- |
Required Environment Variables
Tutti i segreti devono essere impostati prima di avviare il server. Il serverfallirà velocementese mancano o sono deboli.```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)
Il server rifiuta attivamente valori noti come "changeme", "secret" o "password".---
## Docker Security
- Utilizzare l'utente non root in produzione
- Montare i segreti come volumi di sola lettura
- Non copiare mai i file `.env` nelle immagini Docker
- Utilizza `.dockerignore` per escludere file sensibili
- Imposta `AUTH_COOKIE_SECURE=true` quando sei dietro 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
- Esegui regolarmente "npm audit".
- Mantieni aggiornate le dipendenze
- Il progetto utilizza
husky+lint-stagedper i controlli pre-commit - La pipeline CI esegue le regole di sicurezza ESLint a ogni push
- Costanti del provider convalidate al caricamento del modulo tramite Zod (
src/shared/validation/providerSchema.ts)