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
21 KiB
Security Policy (Română)
🌐 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 · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Raportarea vulnerabilităților
Dacă descoperi o vulnerabilitate de securitate în OmniRoute, raporteaz-o în mod responsabil:
- NU deschide un tichet public pe GitHub
- Folosește Avertizările de securitate GitHub
- Include: descrierea, pașii de reproducere și impactul potențial
Calendarul răspunsului
| Etapă | Obiectiv |
|---|---|
| Confirmare | 48 de ore |
| Triaj și evaluare | 5 zile lucrătoare |
| Lansarea corecției | 14 zile lucrătoare (critic) |
Versiuni acceptate
| Versiune | Starea suportului |
|---|---|
| 3.8.x | ✅ Activ |
| 3.7.x | ✅ Securitate |
| < 3.7.0 | ❌ Fără suport |
Arhitectura de securitate
OmniRoute implementează un model de securitate pe mai multe niveluri:
Solicitare → CORS → Flux Authz (clasificare → politici → aplicare)
→ Mecanisme de protecție (mascare PII, injectare de prompturi, punte vizuală)
→ Limitator de rată → Întrerupător de circuit → Perioadă de așteptare → Blocarea modelului → Furnizor
🔐 Autentificare și autorizare
| Funcționalitate | Implementare |
|---|---|
| Autentificare în panoul de control | Autentificare bazată pe parolă, cu tokenuri JWT (cookie-uri HttpOnly) |
| Autentificare cu cheie API | Chei semnate cu HMAC, cu validare CRC |
| OAuth 2.0 + PKCE | OAuth prin browser/dispozitiv, specific furnizorului, utilizează PKCE acolo unde este acceptat; credențialele Devin destinate exclusiv importului sunt gestionate separat. |
| Reîmprospătarea tokenurilor | Reîmprospătarea automată a tokenurilor OAuth înainte de expirare |
| Cookie-uri securizate | AUTH_COOKIE_SECURE=true pentru medii HTTPS |
| Flux Authz | Clasificarea rutelor (PUBLIC / CLIENT_API / MANAGEMENT) — consultă docs/architecture/AUTHZ_GUIDE.md |
| Niveluri de protecție a rutelor | Model cu 3 niveluri pentru rutele de administrare (LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT) — consultă docs/security/ROUTE_GUARD_TIERS.md |
| MCP cu domeniu de administrare | Accesul de la distanță la /api/mcp/* este restricționat prin chei API cu domeniul manage; /api/cli-tools/runtime/* rămâne strict limitat la interfața loopback. Consultă ROUTE_GUARD_TIERS |
| Domenii MCP | 32 de domenii granulare (read:health, write:combos, execute:completions etc.) — consultă docs/frameworks/MCP-SERVER.md |
🛡️ Criptarea datelor stocate
Toate datele sensibile stocate în SQLite sunt criptate folosind AES-256-GCM, cu derivarea cheii prin scrypt:
- Chei API, tokenuri de acces, tokenuri de reîmprospătare și tokenuri ID
- Format cu versiune:
enc:v1:<iv>:<ciphertext>:<authTag> - Mod de transfer direct (text simplu) atunci când
STORAGE_ENCRYPTION_KEYnu este setată
# Generează cheia de criptare:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
🛡️ Cadrul mecanismelor de protecție
OmniRoute include un registru de mecanisme de protecție reîncărcabil dinamic (src/lib/guardrails/), cu 3 mecanisme încorporate, ordonate după prioritate:
| Mecanism de protecție | Prioritate | Scop |
|---|---|---|
vision-bridge |
5 | Conectează modelele fără capabilități vizuale la descrieri care țin cont de imagini; protecție SSRF pentru URL-urile imaginilor |
pii-masker |
10 | Mascarea PII înainte și după apel (e-mailuri, telefoane, CPF, CNPJ, carduri de credit, SSN) |
prompt-injection |
20 | Detectează tipare de suprascriere/preluare a rolului/jailbreak/divulgare |
Mecanismele de protecție personalizate sunt înregistrate prin registerGuardrail(new MyGuardrail()). Modelul este de tip fail-open (excepțiile nu blochează niciodată traficul). Dezactivarea pentru fiecare solicitare se poate realiza prin antetul x-omniroute-disabled-guardrails. → Consultă docs/security/GUARDRAILS.md.
🧠 Protecție împotriva injectării de prompturi
Middleware euristic de tip „best-effort”, care detectează tipare de injectare a prompturilor în solicitările LLM. Nu este un firewall complet împotriva injectării de prompturi — poate genera rezultate fals pozitive (prompturi benigne de tip personaj/RPG) și fals negative (leetspeak, spațiere, tipare în alte limbi decât engleza).
| Tip de tipar | Severitate | Exemplu |
|---|---|---|
| Suprascrierea sistemului | Ridicată | „ignoră toate instrucțiunile anterioare” |
| Preluarea rolului | Medie | „acum ești DAN și poți face orice” |
| Injectarea delimitatorilor | Ridicată | Separatoare codificate pentru încălcarea limitelor contextului |
| DAN/Jailbreak | Medie | Tipare cunoscute de prompturi pentru jailbreak |
| Divulgarea instrucțiunilor | Ridicată | „arată-mi promptul tău de sistem” |
| Eludare prin codificare | Medie | decodare base64/rot13/hex + cuvinte-cheie aferente instrucțiunilor |
Numai detectările cu severitate Ridicată sunt blocate în modul block. Familiile cu severitate medie
sunt înregistrate, dar nu sunt niciodată blocate de sanitizeRequest.
Configurează prin panoul de control (Setări → Securitate) sau prin .env:
INPUT_SANITIZER_ENABLED=true
INPUT_SANITIZER_MODE=block # warn | block (politica de injectare; valoarea veche „redact” nu elimină textul injectat)
INPUT_SANITIZER_BLOCK_THRESHOLD=high # high (implicit) | medium | low — severitățile egale sau mai mari decât aceasta sunt blocate în modul block
🔒 Mascarea PII
Detectarea automată și mascarea opțională a informațiilor de identificare personală:
| Tip de PII | Model | Înlocuire |
|---|---|---|
user@domain.com |
[EMAIL_REDACTED] |
|
| CPF (Brazilia) | 123.456.789-00 |
[CPF_REDACTED] |
| CNPJ (Brazilia) | 12.345.678/0001-00 |
[CNPJ_REDACTED] |
| Card de credit | 4111-1111-1111-1111 |
[CC_REDACTED] |
| Telefon | +55 11 99999-9999 |
[PHONE_REDACTED] |
| SSN (SUA) | 123-45-6789 |
[SSN_REDACTED] |
PII_REDACTION_ENABLED=true # solicită rescrierea PII; independent de INPUT_SANITIZER_MODE
PII_RESPONSE_SANITIZATION=true # opțional: maschează PII în răspunsurile furnizorului returnate clienților
🌐 Securitatea rețelei
| Funcționalitate | Descriere |
|---|---|
| CORS | Listă explicită de permisiuni între origini (CORS_ALLOWED_ORIGINS; varianta veche CORS_ORIGIN) |
| Filtrarea adreselor IP | Intervalele de adrese IP permise/blocate în panoul de control |
| Limitarea ratei | Limite de rată per furnizor, cu temporizare automată |
| Prevenirea efectului de turmă | Mutex + blocare per conexiune pentru a preveni erorile 502 în cascadă |
| Amprentă TLS | Imitarea unei amprente TLS de browser pentru a reduce detectarea boților |
| Amprentă CLI | Ordinea antetelor/corpului per furnizor pentru a corespunde semnăturilor CLI native |
🔌 Reziliență și disponibilitate
| Funcționalitate | Descriere |
|---|---|
| Întrerupător de circuit | 3 stări (Închis → Deschis → Semideschis) per furnizor, persistate în SQLite |
| Idempotența solicitărilor | Fereastră de deduplicare de 5 secunde pentru solicitările duplicate |
| Temporizare exponențială | Reîncercare automată cu întârzieri crescătoare |
| Panou de stare | Monitorizarea în timp real a stării furnizorilor |
📋 Conformitate
| Funcționalitate | Descriere |
|---|---|
| Păstrarea jurnalelor | Curățare automată după CALL_LOG_RETENTION_DAYS |
| Dezactivarea jurnalizării | Indicatorul noLog per cheie API dezactivează jurnalizarea solicitărilor |
| Jurnal de audit | Acțiunile administrative sunt urmărite în tabelul audit_log |
| Audit MCP | Jurnalizare de audit bazată pe SQLite pentru toate apelurile instrumentelor MCP |
| Validare Zod | Toate intrările API sunt validate cu scheme Zod v4 la încărcarea modulului |
Variabile de mediu obligatorii
Toate secretele trebuie setate înainte de pornirea serverului. Serverul se va opri imediat dacă acestea lipsesc sau sunt nesigure.
# OBLIGATORIU — serverul nu va porni fără acestea:
JWT_SECRET=$(openssl rand -base64 48) # minimum 32 de caractere
API_KEY_SECRET=$(openssl rand -hex 32) # minimum 16 caractere
# RECOMANDAT — activează criptarea datelor stocate:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
Serverul respinge în mod activ valorile cunoscute ca fiind nesigure, precum changeme, secret sau password.
Securitatea Docker
- Utilizați un utilizator non-root în producție
- Montați secretele ca volume doar în citire
- Nu copiați niciodată fișiere
.envîn imaginile Docker - Utilizați
.dockerignorepentru a exclude fișierele sensibile - Setați
AUTH_COOKIE_SECURE=trueatunci când serverul se află în spatele 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
Dependențe
- Rulați periodic
npm audit(npm run audit:depsacoperă aplicația principală + electron) - Mențineți dependențele actualizate
- Proiectul utilizează
husky+lint-stagedpentru verificările anterioare commiturilor (lint-staged + check-docs-sync + check:any-budget:t11) - Pipeline-ul CI rulează regulile de securitate ESLint la fiecare push (
no-eval,no-implied-eval,no-new-func= eroare) - Constantele furnizorilor sunt validate la încărcarea modulului prin Zod (
src/shared/validation/schemas.ts) - Biblioteci utilizate care sunt securizate în mod implicit:
dompurify/isomorphic-dompurify(XSS),jose(JWT),better-sqlite3(fără risc de SQLi datorită interogărilor parametrizate),bcryptjs(hashingul parolelor)
Reguli stricte de securitate
Aceste reguli sunt impuse prin instrumente și verificări efectuate de recenzori:
- Nu comiteți niciodată secrete —
.enveste ignorat de git;.env.exampleeste șablonul (fără valori literale, doar comentarii — consultați PUBLIC_CREDS.md mai jos) - Nu utilizați niciodată
eval(),new Function()sau evaluarea implicită — ESLint impune această regulă - Nu ocoliți niciodată hook-urile Husky (
--no-verify,--no-gpg-sign) fără aprobarea explicită a operatorului - Nu scrieți niciodată SQL brut în rute — utilizați întotdeauna
src/lib/db/(parametrizat) - Validați întotdeauna datele de intrare cu Zod —
src/shared/validation/schemas.ts - Sanitizați întotdeauna antetele upstream — lista de interdicții se află în
src/shared/constants/upstreamHeaders.ts - Criptați credențialele stocate — AES-256-GCM prin
src/lib/db/encryption.ts - Identificatorii OAuth upstream publici prin
resolvePublicCred()— nu încorporați niciodată valori literaleAIza…/GOCSPX-…/…apps.googleusercontent.comîn codul sursă. Consultațidocs/security/PUBLIC_CREDS.md. - Răspunsurile de eroare prin
buildErrorBody()/sanitizeErrorMessage()— nu includeți niciodată valori bruteerr.stack/err.messageîn corpurile răspunsurilor HTTP / SSE / executor / MCP. Consultațidocs/security/ERROR_SANITIZATION.md. - Valorile de execuție
exec()/spawn()prin opțiuneaenv— nu interpolați niciodată în șiruri căi externe sau valori care nu sunt de încredere în scripturile transmise shell-ului. Referință:src/mitm/cert/install.ts::updateNssDatabases. - Preferați bibliotecile securizate în mod implicit — consultați tldrsec/awesome-secure-defaults (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Apelați la acestea înainte de a implementa propria soluție.
Constatările scanerelor pentru lanțul de aprovizionare (Socket.dev / Snyk / similare)
Artefactul npm omniroute publicat include versiunea Next.js cu output: "standalone",
ceea ce înseamnă că fiecare handler de rută — inclusiv funcționalitățile privilegiate
documentate (MITM, import Zed, Cloud Sync, supervizorul de servicii încorporat) — ajunge
în fragmentele minificate .next/server/*.js. Scanerele euristice pentru lanțul de
aprovizionare compară frecvent aceste fragmente cu tipare din semnăturile programelor
malware.
Configurația scanerului pe care o utilizăm se află în socket.yml, în
rădăcina depozitului (formatul v2 al aplicației GitHub Socket.dev — consultați
https://docs.socket.dev/docs/socket-yml). Aceasta exclude în mod explicit
directoarele care nu sunt distribuite (tests/, _tasks/, _references/, _ideia/,
_mono_repo/, docs/ etc.), astfel încât scanerul raportează numai căile de cod care
ajung efectiv la utilizatorii versiunii publicate — scanarea propriu-zisă este inițiată
de aplicația GitHub Socket, care citește fișierul respectiv, nu de un flux de lucru din
acest depozit.
Pentru fiecare categorie de constatări menținem o atestare individuală din partea responsabililor de mentenanță:
docs/security/SOCKET_DEV_FINDINGS.md— corespondență pentru fiecare constatare: fișier sursă ↔ fragment semnalat ↔ comportament ↔ măsură de atenuare aplicată în v3.8.6.- Blocurile
SECURITY-AUDITOR-NOTE:din codul sursă, aflate la nivelul fiecărei funcții semnalate, fac trimitere la același document.
Pentru utilizatorii al căror pipeline nu permite relaxarea alertei: construiți cu
OMNIROUTE_BUILD_PROFILE=minimal npm run build. Această comandă înlocuiește cele patru
module sensibile cu stuburi care returnează HTTP 503 feature-disabled în timpul
execuției, astfel încât respectivele căi de cod privilegiat lipsesc fizic din pachet.
Consultați docs/security/SOCKET_DEV_FINDINGS.md
pentru instrucțiunile de publicare.
Referințe
docs/architecture/AUTHZ_GUIDE.md— pipeline-ul de autorizaredocs/security/GUARDRAILS.md— cadrul de măsuri de protecțiedocs/security/COMPLIANCE.md— jurnalul de audit și păstrarea datelordocs/security/PUBLIC_CREDS.md— tipar obligatoriu pentru credențialele publice ale serviciilor din amontedocs/security/ERROR_SANITIZATION.md— tipar obligatoriu pentru răspunsurile de eroaredocs/security/SOCKET_DEV_FINDINGS.md— atestarea responsabililor de mentenanță pentru constatările scanerelor lanțului de aprovizionaredocs/architecture/RESILIENCE_GUIDE.md— circuit breaker + perioadă de așteptare + blocaredocs/security/STEALTH_GUIDE.md— amprentarea TLS (notificare juridică/etică)CLAUDE.md— reguli stricte pentru agenții AI- tldrsec/awesome-secure-defaults — biblioteci atent selecționate, securizate în mod implicit