# Security Policy (Italiano) 🌐 **Languages:** 🇺🇸 [English](../../../SECURITY.md) · 🇪🇹 [am](../am/SECURITY.md) · 🇸🇦 [ar](../ar/SECURITY.md) · 🇦🇿 [az](../az/SECURITY.md) · 🇧🇬 [bg](../bg/SECURITY.md) · 🇧🇩 [bn](../bn/SECURITY.md) · 🇧🇦 [bs](../bs/SECURITY.md) · 🇨🇿 [cs](../cs/SECURITY.md) · 🇩🇰 [da](../da/SECURITY.md) · 🇩🇪 [de](../de/SECURITY.md) · 🇬🇷 [el](../el/SECURITY.md) · 🇪🇸 [es](../es/SECURITY.md) · 🇪🇪 [et](../et/SECURITY.md) · 🇮🇷 [fa](../fa/SECURITY.md) · 🇫🇮 [fi](../fi/SECURITY.md) · 🇫🇷 [fr](../fr/SECURITY.md) · 🇮🇪 [ga](../ga/SECURITY.md) · 🇮🇳 [gu](../gu/SECURITY.md) · 🇳🇬 [ha](../ha/SECURITY.md) · 🇮🇱 [he](../he/SECURITY.md) · 🇮🇳 [hi](../hi/SECURITY.md) · 🇭🇷 [hr](../hr/SECURITY.md) · 🇭🇺 [hu](../hu/SECURITY.md) · 🇦🇲 [hy](../hy/SECURITY.md) · 🇮🇩 [id](../id/SECURITY.md) · 🇳🇬 [ig](../ig/SECURITY.md) · 🇯🇵 [ja](../ja/SECURITY.md) · 🇬🇪 [ka](../ka/SECURITY.md) · 🇰🇭 [km](../km/SECURITY.md) · 🇮🇳 [kn](../kn/SECURITY.md) · 🇰🇷 [ko](../ko/SECURITY.md) · 🇱🇹 [lt](../lt/SECURITY.md) · 🇱🇻 [lv](../lv/SECURITY.md) · 🇮🇳 [ml](../ml/SECURITY.md) · 🇮🇳 [mr](../mr/SECURITY.md) · 🇲🇾 [ms](../ms/SECURITY.md) · 🇲🇹 [mt](../mt/SECURITY.md) · 🇲🇲 [my](../my/SECURITY.md) · 🇳🇵 [ne](../ne/SECURITY.md) · 🇳🇱 [nl](../nl/SECURITY.md) · 🇳🇴 [no](../no/SECURITY.md) · 🇮🇳 [or](../or/SECURITY.md) · 🇮🇳 [pa](../pa/SECURITY.md) · 🇵🇭 [phi](../phi/SECURITY.md) · 🇵🇱 [pl](../pl/SECURITY.md) · 🇵🇹 [pt](../pt/SECURITY.md) · 🇧🇷 [pt-BR](../pt-BR/SECURITY.md) · 🇷🇴 [ro](../ro/SECURITY.md) · 🇷🇺 [ru](../ru/SECURITY.md) · 🇱🇰 [si](../si/SECURITY.md) · 🇸🇰 [sk](../sk/SECURITY.md) · 🇸🇮 [sl](../sl/SECURITY.md) · 🇷🇸 [sr](../sr/SECURITY.md) · 🇸🇪 [sv](../sv/SECURITY.md) · 🇰🇪 [sw](../sw/SECURITY.md) · 🇮🇳 [ta](../ta/SECURITY.md) · 🇮🇳 [te](../te/SECURITY.md) · 🇹🇭 [th](../th/SECURITY.md) · 🇹🇷 [tr](../tr/SECURITY.md) · 🇺🇦 [uk-UA](../uk-UA/SECURITY.md) · 🇵🇰 [ur](../ur/SECURITY.md) · 🇺🇿 [uz](../uz/SECURITY.md) · 🇻🇳 [vi](../vi/SECURITY.md) · 🇳🇬 [yo](../yo/SECURITY.md) · 🇨🇳 [zh-CN](../zh-CN/SECURITY.md) · 🇹🇼 [zh-TW](../zh-TW/SECURITY.md) --- ## Segnalazione delle vulnerabilità Se scopri una vulnerabilità di sicurezza in OmniRoute, segnalala responsabilmente: 1. **NON** aprire un issue pubblico su GitHub 2. Usa [GitHub Security Advisories](https://github.com/diegosouzapw/OmniRoute/security/advisories/new) 3. Includi: descrizione, passaggi per la riproduzione e impatto potenziale ## Tempistiche di risposta | Fase | Obiettivo | | --------------------- | ------------------------------ | | Conferma di ricezione | 48 ore | | Triage e valutazione | 5 giorni lavorativi | | Rilascio della patch | 14 giorni lavorativi (critico) | ## Versioni supportate | Versione | Stato del supporto | | -------- | ------------------ | | 3.8.x | ✅ Attivo | | 3.7.x | ✅ Sicurezza | | < 3.7.0 | ❌ Non supportato | --- ## Architettura di sicurezza OmniRoute implementa un modello di sicurezza multilivello: ``` Richiesta → CORS → Pipeline di autorizzazione (classificazione → criteri → applicazione) → Misure di protezione (mascheramento PII, prompt injection, bridge visivo) → Limitatore di frequenza → Interruttore automatico → Pausa → Blocco del modello → Provider ``` ### 🔐 Autenticazione e autorizzazione | Funzionalità | Implementazione | | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Accesso alla dashboard** | Autenticazione basata su password con token JWT (cookie HttpOnly) | | **Autenticazione API key** | Chiavi firmate tramite HMAC con convalida CRC | | **OAuth 2.0 + PKCE** | OAuth tramite browser/dispositivo specifico del provider usa PKCE ove supportato; le credenziali Devin di sola importazione vengono gestite separatamente. | | **Aggiornamento dei token** | Aggiornamento automatico dei token OAuth prima della scadenza | | **Cookie sicuri** | `AUTH_COOKIE_SECURE=true` per gli ambienti HTTPS | | **Pipeline di autorizzazione** | Classificazione delle route (PUBLIC / CLIENT_API / MANAGEMENT) — consulta `docs/architecture/AUTHZ_GUIDE.md` | | **Livelli di protezione delle route** | Modello a 3 livelli per le route di gestione (LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT) — consulta `docs/security/ROUTE_GUARD_TIERS.md` | | **MCP con ambito manage** | Accesso remoto a `/api/mcp/*` subordinato ad API key con ambito `manage`; `/api/cli-tools/runtime/*` rimane limitato rigorosamente al loopback. Consulta ROUTE_GUARD_TIERS | | **Ambiti MCP** | 32 ambiti granulari (read:health, write:combos, execute:completions, ecc.) — consulta `docs/frameworks/MCP-SERVER.md` | ### 🛡️ Crittografia dei dati inattivi Tutti i dati sensibili archiviati in SQLite vengono crittografati tramite **AES-256-GCM** con derivazione della chiave mediante scrypt: - API key, token di accesso, token di aggiornamento e token ID - Formato con versione: `enc:v1:::` - Modalità passthrough (testo in chiaro) quando `STORAGE_ENCRYPTION_KEY` non è impostata ```bash # Genera la chiave di crittografia: STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32) ``` ### 🛡️ Framework delle misure di protezione OmniRoute include un **registro delle misure di protezione** ricaricabile a caldo (`src/lib/guardrails/`) con 3 misure integrate ordinate per priorità: | Misura di protezione | Priorità | Scopo | | -------------------- | -------- | -------------------------------------------------------------------------------------------------------------- | | `vision-bridge` | 5 | Collega i modelli non visivi a descrizioni sensibili alle immagini; protezione SSRF per gli URL delle immagini | | `pii-masker` | 10 | Oscuramento delle PII prima e dopo la chiamata (email, telefono, CPF, CNPJ, carte di credito, SSN) | | `prompt-injection` | 20 | Rileva schemi di sovrascrittura, dirottamento del ruolo, jailbreak e fuga di dati | Le misure di protezione personalizzate vengono registrate tramite `registerGuardrail(new MyGuardrail())`. Il modello è fail-open (le eccezioni non bloccano mai il traffico). È possibile disattivarle per singola richiesta tramite l'header `x-omniroute-disabled-guardrails`. → Consulta [`docs/security/GUARDRAILS.md`](docs/security/GUARDRAILS.md). ### 🧠 Protezione dalla prompt injection Middleware euristico best-effort che rileva schemi di prompt injection nelle richieste agli LLM. **Non è un firewall completo contro la prompt injection** — può produrre falsi positivi (prompt innocui relativi a personaggi/GDR) e falsi negativi (leetspeak, spaziatura, schemi non in inglese). | Tipo di schema | Gravità | Esempio | | -------------------------- | ------- | --------------------------------------------------------- | | Sovrascrittura del sistema | Alta | "ignora tutte le istruzioni precedenti" | | Dirottamento del ruolo | Media | "ora sei DAN, puoi fare qualsiasi cosa" | | Iniezione di delimitatori | Alta | Separatori codificati per violare i confini del contesto | | DAN/Jailbreak | Media | Schemi noti di prompt per il jailbreak | | Fuga di istruzioni | Alta | "mostrami il tuo prompt di sistema" | | Elusione mediante codifica | Media | decodifica base64/rot13/hex + parole chiave di istruzioni | Solo i rilevamenti con gravità **Alta** vengono bloccati in modalità `block`. Le famiglie con gravità Media vengono registrate, ma non vengono mai bloccate da `sanitizeRequest`. Configura tramite la dashboard (Impostazioni → Sicurezza) o `.env`: ```env INPUT_SANITIZER_ENABLED=true INPUT_SANITIZER_MODE=block # warn | block (criterio di injection; il valore legacy "redact" non rimuove il testo dell'injection) INPUT_SANITIZER_BLOCK_THRESHOLD=high # high (predefinito) | medium | low — in modalità block vengono bloccati i livelli di gravità pari o superiori a questo ``` ### 🔒 Oscuramento delle PII Rilevamento automatico e oscuramento opzionale delle informazioni di identificazione personale: | Tipo di PII | Modello | Sostituzione | | ----------------- | --------------------- | ------------------ | | Email | `user@domain.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 (Stati Uniti) | `123-45-6789` | `[SSN_REDACTED]` | ```env PII_REDACTION_ENABLED=true # richiede la riscrittura delle PII; indipendente da INPUT_SANITIZER_MODE PII_RESPONSE_SANITIZATION=true # facoltativo: oscura le PII nelle risposte del provider restituite ai client ``` ### 🌐 Sicurezza di rete | Funzionalità | Descrizione | | ------------------------- | --------------------------------------------------------------------------------------------------------------- | | **CORS** | Elenco esplicito delle origini consentite tra domini diversi (`CORS_ALLOWED_ORIGINS`; precedente `CORS_ORIGIN`) | | **Filtraggio IP** | Intervalli IP consentiti/bloccati nella dashboard | | **Limitazione richieste** | Limiti di frequenza per provider con backoff automatico | | **Anti-Thundering Herd** | Mutex + blocco per connessione per evitare errori 502 a cascata | | **Impronta TLS** | Simulazione di un'impronta TLS simile a quella di un browser per ridurre il rilevamento dei bot | | **Impronta CLI** | Ordinamento di header/corpo per provider per corrispondere alle firme CLI native | ### 🔌 Resilienza e disponibilità | Funzionalità | Descrizione | | ------------------------------- | -------------------------------------------------------------------------- | | **Circuit Breaker** | 3 stati (Chiuso → Aperto → Semi-aperto) per provider, persistiti in SQLite | | **Idempotenza delle richieste** | Finestra di deduplicazione di 5 secondi per le richieste duplicate | | **Backoff esponenziale** | Nuovo tentativo automatico con ritardi crescenti | | **Dashboard di integrità** | Monitoraggio in tempo reale dello stato dei provider | ### 📋 Conformità | Funzionalità | Descrizione | | ------------------------- | ----------------------------------------------------------------------------------- | | **Conservazione dei log** | Pulizia automatica dopo `CALL_LOG_RETENTION_DAYS` | | **Esclusione dai log** | Il flag `noLog` per chiave API disabilita la registrazione delle richieste | | **Log di audit** | Azioni amministrative registrate nella tabella `audit_log` | | **Audit MCP** | Registrazione di audit basata su SQLite per tutte le chiamate agli strumenti MCP | | **Convalida Zod** | Tutti gli input API vengono convalidati con schemi Zod v4 al caricamento del modulo | --- ## Variabili d'ambiente obbligatorie Tutti i segreti devono essere impostati prima di avviare il server. Il server **interromperà immediatamente l'avvio** se sono mancanti o deboli. ```bash # OBBLIGATORIE — il server non si avvierà senza queste: JWT_SECRET=$(openssl rand -base64 48) # minimo 32 caratteri API_KEY_SECRET=$(openssl rand -hex 32) # minimo 16 caratteri # CONSIGLIATA — abilita la crittografia dei dati a riposo: STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32) ``` Il server rifiuta attivamente valori notoriamente deboli come `changeme`, `secret` o `password`. --- ## Sicurezza Docker - Utilizzare un utente non root in produzione - Montare i segreti come volumi di sola lettura - Non copiare mai i file `.env` nelle immagini Docker - Utilizzare `.dockerignore` per escludere i file sensibili - Impostare `AUTH_COOKIE_SECURE=true` quando si utilizza 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 ``` --- ## Dipendenze - Eseguire regolarmente `npm audit` (`npm run audit:deps` copre il progetto principale + electron) - Mantenere aggiornate le dipendenze - Il progetto utilizza `husky` + `lint-staged` per i controlli pre-commit (lint-staged + check-docs-sync + check:any-budget:t11) - La pipeline CI esegue le regole di sicurezza ESLint a ogni push (`no-eval`, `no-implied-eval`, `no-new-func` = errore) - Le costanti dei provider vengono convalidate al caricamento del modulo tramite Zod (`src/shared/validation/schemas.ts`) - Librerie sicure per impostazione predefinita utilizzate: `dompurify` / `isomorphic-dompurify` (XSS), `jose` (JWT), `better-sqlite3` (nessun rischio di SQL injection grazie alle query parametrizzate), `bcryptjs` (hashing delle password) ## Regole di sicurezza inderogabili Queste regole vengono applicate dagli strumenti e dai revisori: 1. **Non eseguire mai il commit di segreti** — `.env` è incluso in gitignore; `.env.example` è il modello (nessun valore letterale, solo commenti — vedere PUBLIC_CREDS.md di seguito) 2. **Non utilizzare mai `eval()`, `new Function()` o eval implicito** — ESLint applica questa regola 3. **Non ignorare mai gli hook Husky** (`--no-verify`, `--no-gpg-sign`) senza l'approvazione esplicita dell'operatore 4. **Non scrivere mai SQL grezzo nelle route** — passare sempre attraverso `src/lib/db/` (parametrizzato) 5. **Convalidare sempre gli input con Zod** — `src/shared/validation/schemas.ts` 6. **Sanificare sempre gli header upstream** — elenco di esclusione in `src/shared/constants/upstreamHeaders.ts` 7. **Crittografare le credenziali a riposo** — AES-256-GCM tramite `src/lib/db/encryption.ts` 8. **Identificatori OAuth upstream pubblici tramite `resolvePublicCred()`** — non incorporare mai valori letterali `AIza…` / `GOCSPX-…` / `…apps.googleusercontent.com` nel codice sorgente. Consultare [`docs/security/PUBLIC_CREDS.md`](docs/security/PUBLIC_CREDS.md). 9. **Risposte di errore tramite `buildErrorBody()` / `sanitizeErrorMessage()`** — non inserire mai valori grezzi di `err.stack` / `err.message` nei corpi delle risposte HTTP / SSE / executor / MCP. Consultare [`docs/security/ERROR_SANITIZATION.md`](docs/security/ERROR_SANITIZATION.md). 10. **Valori di runtime di `exec()` / `spawn()` tramite l'opzione `env`** — non interpolare mai come stringhe percorsi esterni o valori non attendibili negli script passati alla shell. Riferimento: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **Preferire librerie sicure per impostazione predefinita** — consultare [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Utilizzarle prima di implementare una soluzione personalizzata. ## Risultati dello scanner della supply chain (Socket.dev / Snyk / strumenti simili) > **Nota sull'ambito:** `socket.yml` nella radice del repository definisce esclusivamente `projectIgnorePaths` per la scansione post-pubblicazione lato registry di Socket.dev dell'artefatto npm pubblicato — non costituisce un controllo CI/PR obbligatorio per il merge. Nessun workflow in `.github/workflows`, nessuno script di `package.json` e nessun target di `Makefile` invoca Socket.dev. L'artefatto npm `omniroute` pubblicato include la build Next.js `output: "standalone"`, il che significa che ogni gestore di route — incluse le funzionalità privilegiate documentate (MITM, importazione da Zed, Cloud Sync, supervisore del servizio integrato) — finisce nei chunk minificati `.next/server/*.js`. Gli scanner euristici della supply chain spesso confrontano tali chunk con firme di malware. La configurazione dello scanner che utilizziamo si trova in [`socket.yml`](socket.yml) nella radice del repository (formato v2 della GitHub App di Socket.dev — vedere ). Esclude esplicitamente le directory non distribuite (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/`, ecc.), affinché lo scanner segnali esclusivamente i percorsi di codice che raggiungono effettivamente gli utenti dell'artefatto pubblicato — la scansione stessa è eseguita dalla GitHub App di Socket, che legge tale file, e non da un workflow di questo repository. Per ogni categoria di risultato manteniamo un'attestazione dei responsabili della manutenzione relativa a ciascun risultato: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — mappa per ciascun risultato: file sorgente ↔ chunk segnalato ↔ comportamento ↔ mitigazione applicata nella v3.8.6. - I blocchi `SECURITY-AUDITOR-NOTE:` nel codice sorgente, presenti in corrispondenza di ogni funzione segnalata, rimandano allo stesso documento. Per gli utenti la cui pipeline non consente di attenuare l'avviso: eseguire la build con `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Questa impostazione sostituisce i quattro moduli sensibili con stub che restituiscono HTTP 503 `feature-disabled` durante l'esecuzione, così i percorsi di codice privilegiati sono fisicamente assenti dal bundle. Per la procedura di pubblicazione, vedere [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md). ## Riferimenti - [`docs/architecture/AUTHZ_GUIDE.md`](docs/architecture/AUTHZ_GUIDE.md) — pipeline di autorizzazione - [`docs/security/GUARDRAILS.md`](docs/security/GUARDRAILS.md) — framework di misure di sicurezza - [`docs/security/COMPLIANCE.md`](docs/security/COMPLIANCE.md) — log di audit e conservazione - [`docs/security/PUBLIC_CREDS.md`](docs/security/PUBLIC_CREDS.md) — modello **obbligatorio** per le credenziali pubbliche dei servizi upstream - [`docs/security/ERROR_SANITIZATION.md`](docs/security/ERROR_SANITIZATION.md) — modello **obbligatorio** per le risposte di errore - [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) — attestazione dei manutentori relativa ai risultati degli scanner della supply chain - [`docs/architecture/RESILIENCE_GUIDE.md`](docs/architecture/RESILIENCE_GUIDE.md) — circuit breaker + cooldown + lockout - [`docs/security/STEALTH_GUIDE.md`](docs/security/STEALTH_GUIDE.md) — fingerprinting TLS (avviso legale/etico) - [`CLAUDE.md`](CLAUDE.md) — regole inderogabili per gli agenti di IA - [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) — raccolta curata di librerie sicure per impostazione predefinita