Files
OmniRoute/docs/i18n/it/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 (Italiano)

🌐 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 · 🇯🇵 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


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
  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:<iv>:<ciphertext>:<authTag>
  • Modalità passthrough (testo in chiaro) quando STORAGE_ENCRYPTION_KEY non è impostata
# 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.

🧠 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:

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]
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.

# 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
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 Zodsrc/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.
  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.
  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 (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Utilizzarle prima di implementare una soluzione personalizzata.

Risultati degli scanner della supply chain (Socket.dev / Snyk / simili)

L'artefatto npm omniroute pubblicato include la build Next.js output: "standalone", il che significa che ogni gestore di route — comprese le funzionalità privilegiate documentate (MITM, importazione da Zed, Cloud Sync, supervisore di servizi integrato) — finisce nei chunk minimizzati .next/server/*.js. Gli scanner euristici della supply chain spesso confrontano tali chunk con firme malware alla ricerca di corrispondenze.

La configurazione dello scanner che utilizziamo si trova in socket.yml nella radice del repository (formato v2 della GitHub App di Socket.dev — vedere https://docs.socket.dev/docs/socket-yml). Esclude esplicitamente le directory non distribuite (tests/, _tasks/, _references/, _ideia/, _mono_repo/, docs/, ecc.), affinché lo scanner segnali solo i percorsi di codice che raggiungono effettivamente gli utenti del pacchetto pubblicato. La scansione stessa viene eseguita dalla GitHub App di Socket, che legge tale file, e non da un workflow in questo repository.

Per ogni categoria di risultato manteniamo un'attestazione dei manutentori specifica per ciascun risultato:

  • 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: compilare con OMNIROUTE_BUILD_PROFILE=minimal npm run build. In questo modo, i quattro moduli sensibili vengono sostituiti con stub che, in fase di esecuzione, restituiscono HTTP 503 feature-disabled; pertanto, i percorsi di codice privilegiati sono fisicamente assenti dal bundle. Consultare docs/security/SOCKET_DEV_FINDINGS.md per la procedura di pubblicazione.

Riferimenti