Skip to content

Latest commit

 

History

History
271 lines (204 loc) · 22 KB

SECURITY.md

File metadata and controls

271 lines (204 loc) · 22 KB

Security Policy (Hrvatski)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇧🇦 bs · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇺 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 · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW


Prijavljivanje ranjivosti

Ako otkrijete sigurnosnu ranjivost u OmniRouteu, prijavite je na odgovoran način:

  1. NEMOJTE otvarati javni GitHub problem
  2. Upotrijebite GitHub Security Advisories
  3. Uključite: opis, korake za reprodukciju i mogući utjecaj

Vremenski okvir odgovora

Faza Cilj
Potvrda primitka 48 sati
Trijaža i procjena 5 radnih dana
Izdavanje zakrpe 14 radnih dana (za kritične greške)

Podržane verzije

Verzija Status podrške
3.9.x 🗓️ Planirano — LTS grana (stable/v3), vidi niže
3.8.x ✅ Aktivna
3.7.x ✅ Sigurnosna
< 3.7.0 ❌ Nije podržana

Razdoblje LTS podrške (v3.9.x)

Nakon 3.8.59 sljedeća je verzija 3.9.0, kojom započinje linija dugoročne podrške na grani stable/v3 (pogledajte ROADMAP.md → „Faza 3 — v3.9.0 LTS”).

  • Što prima stable/v3: ispravke pogrešaka, sigurnosne zakrpe i ažuriranja pružatelja. Nove značajke idu u kanal v4; stabilnost je glavni prioritet LTS linije. npm install omniroute (latest dist-tag) ostaje na v3 tijekom cijelog ciklusa v4.
  • Trajanje razdoblja: stable/v3 prima sigurnosne ispravke i ispravke kritičnih regresija 12 mjeseci nakon izdanja 3.9.0 ili do 90 dana nakon što v4.0.0 bude objavljen kao latest — ovisno o tome što nastupi kasnije. Konačni datum završetka bilježi se u napomenama uz izdanje 3.9.0 i u datoteci ROADMAP.md kada se izdanje objavi.
  • Prijava ranjivosti u LTS liniji: upotrijebite isti kanal kao i za svaku drugu verziju — privatno GitHubovo sigurnosno upozorenje, nikada javnu prijavu problema. Navedite koju ste verziju testirali (primjerice 3.9.2); ispravke se primjenjuju na stable/v3 i prenose unaprijed u v4.
  • Sigurnosna polazna osnova pri objavi LTS-a: izmjereno stanje skenera, dokazi o zaštiti ruta i javnim vjerodajnicama zabilježeni su u docs/security/LTS_SECURITY_BASELINE.md.

Sigurnosna arhitektura

OmniRoute implementira višeslojni sigurnosni model:

Zahtjev → CORS → Authz proces (klasificiranje → pravila → provedba)
        → Zaštitne mjere (maskiranje PII-ja, ubrizgavanje upita, vizualni most)
        → Ograničivač učestalosti → Prekidač strujnog kruga → Razdoblje mirovanja → Blokiranje modela → Pružatelj

🔐 Autentifikacija i autorizacija

Značajka Implementacija
Prijava na nadzornu ploču Autentifikacija lozinkom s JWT tokenima (HttpOnly kolačići)
Autentifikacija API ključem Ključevi potpisani HMAC-om s provjerom CRC-a
OAuth 2.0 + PKCE OAuth za preglednik/uređaj specifičan za pružatelja upotrebljava PKCE gdje je podržan; Devin vjerodajnice samo za uvoz obrađuju se zasebno.
Osvježavanje tokena Automatsko osvježavanje OAuth tokena prije isteka
Sigurni kolačići AUTH_COOKIE_SECURE=true za HTTPS okruženja
Authz proces Klasifikacija ruta (PUBLIC / CLIENT_API / MANAGEMENT) — pogledajte docs/architecture/AUTHZ_GUIDE.md
Razine zaštite ruta Model s 3 razine za upravljačke rute (LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT) — pogledajte docs/security/ROUTE_GUARD_TIERS.md
MCP s opsegom upravljanja Udaljeni pristup /api/mcp/* zaštićen je API ključevima s opsegom manage; /api/cli-tools/runtime/* ostaje ograničen isključivo na lokalnu petlju. Pogledajte ROUTE_GUARD_TIERS
MCP opsezi 32 granularna opsega (read:health, write:combos, execute:completions itd.) — pogledajte docs/frameworks/MCP-SERVER.md

🛡️ Šifriranje podataka u mirovanju

Svi osjetljivi podaci pohranjeni u SQLiteu šifrirani su pomoću algoritma AES-256-GCM uz izvođenje ključa scryptom:

  • API ključevi, pristupni tokeni, tokeni za osvježavanje i ID tokeni
  • Format s oznakom verzije: enc:v1:<iv>:<ciphertext>:<authTag>
  • Način prosljeđivanja (običan tekst) kada STORAGE_ENCRYPTION_KEY nije postavljen
# Generirajte ključ za šifriranje:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)

🛡️ Okvir zaštitnih mjera

OmniRoute isporučuje registar zaštitnih mjera koji se može ponovno učitati bez prekida rada (src/lib/guardrails/) s 3 ugrađene zaštitne mjere poredane prema prioritetu:

Zaštitna mjera Prioritet Svrha
vision-bridge 5 Povezuje modele bez vizualnih mogućnosti s opisima koji uzimaju slike u obzir; SSRF zaštita za URL-ove slika
pii-masker 10 Redigiranje PII-ja prije i nakon poziva (e-pošta, telefon, CPF, CNPJ, kreditne kartice, SSN)
prompt-injection 20 Otkriva obrasce nadjačavanja, preuzimanja uloga, zaobilaženja ograničenja i curenja podataka

Prilagođene zaštitne mjere registriraju se putem registerGuardrail(new MyGuardrail()). Model radi po načelu propuštanja u slučaju pogreške (iznimke nikada ne blokiraju promet). Isključivanje za pojedinačni zahtjev moguće je putem zaglavlja x-omniroute-disabled-guardrails. → Pogledajte docs/security/GUARDRAILS.md.

🧠 Zaštita od ubrizgavanja upita

Heuristički posrednički softver koji prema načelu najboljeg mogućeg rezultata otkriva obrasce ubacivanja naredbi u LLM zahtjevima. Nije potpuni vatrozid protiv ubacivanja naredbi — može proizvesti lažno pozitivne rezultate (bezazleni persona/RPG upiti) i lažno negativne rezultate (leetspeak, razmaci, obrasci koji nisu na engleskom jeziku).

Vrsta obrasca Ozbiljnost Primjer
Zaobilaženje sustava Visoka "zanemari sve prethodne upute"
Preuzimanje uloge Srednja "sada si DAN, možeš učiniti bilo što"
Umetanje razdjelnika Visoka Kodirani razdjelnici za narušavanje granica konteksta
DAN/Jailbreak Srednja Poznati obrasci jailbreak upita
Curenje uputa Visoka "pokaži mi svoj sistemski upit"
Izbjegavanje kodiranjem Srednja base64/rot13/hex dekodiranje + ključne riječi uputa

U načinu rada block blokiraju se samo detekcije visoke ozbiljnosti. Obitelji srednje ozbiljnosti bilježe se, ali ih sanitizeRequest nikada ne blokira.

Konfigurirajte putem nadzorne ploče (Postavke → Sigurnost) ili datoteke .env:

INPUT_SANITIZER_ENABLED=true
INPUT_SANITIZER_MODE=block    # warn | block (pravilo za ubacivanje; naslijeđeni način "redact" ne uklanja tekst umetnute naredbe)
INPUT_SANITIZER_BLOCK_THRESHOLD=high  # high (zadano) | medium | low — ozbiljnosti na ovoj razini ili iznad nje blokiraju se u načinu block

🔒 Redigiranje osobnih podataka

Automatsko otkrivanje i izborno redigiranje osobnih identifikacijskih podataka:

Vrsta osobnih podataka Obrazac Zamjena
E-pošta user@domain.com [EMAIL_REDACTED]
CPF (Brazil) 123.456.789-00 [CPF_REDACTED]
CNPJ (Brazil) 12.345.678/0001-00 [CNPJ_REDACTED]
Kreditna kartica 4111-1111-1111-1111 [CC_REDACTED]
Telefon +55 11 99999-9999 [PHONE_REDACTED]
SSN (SAD) 123-45-6789 [SSN_REDACTED]
PII_REDACTION_ENABLED=true   # preoblikovanje osobnih podataka u zahtjevu; neovisno o INPUT_SANITIZER_MODE
PII_RESPONSE_SANITIZATION=true  # izborno: redigiranje osobnih podataka u odgovorima pružatelja koji se vraćaju klijentima

🌐 Mrežna sigurnost

Značajka Opis
CORS Izričit popis dopuštenih izvora među domenama (CORS_ALLOWED_ORIGINS; naslijeđeni CORS_ORIGIN)
Filtriranje IP-a Rasponi IP adresa na popisu dopuštenih/blokiranih na nadzornoj ploči
Ograničavanje stope Ograničenja stope po pružatelju s automatskim odgađanjem
Sprječavanje lavine zahtjeva Mutex + zaključavanje po vezi sprječava kaskadne pogreške 502
TLS otisak Lažiranje TLS otiska nalik pregledniku radi smanjenja otkrivanja botova
CLI otisak Redoslijed zaglavlja/tijela po pružatelju radi podudaranja s izvornim CLI potpisima

🔌 Otpornost i dostupnost

Značajka Opis
Prekidač strujnog kruga 3 stanja (Zatvoreno → Otvoreno → Poluotvoreno) po pružatelju, trajno pohranjeno u SQLiteu
Idempotentnost zahtjeva Prozor od 5 sekundi za uklanjanje dvostrukih zahtjeva
Eksponencijalno odgađanje Automatski ponovni pokušaj sa sve duljim odgodama
Nadzorna ploča stanja Praćenje stanja pružatelja u stvarnom vremenu

📋 Usklađenost

Značajka Opis
Zadržavanje zapisnika Automatsko čišćenje nakon CALL_LOG_RETENTION_DAYS
Isključivanje zapisivanja Oznaka noLog za svaki API ključ onemogućuje zapisivanje zahtjeva
Revizijski zapisnik Administrativne radnje prate se u tablici audit_log
MCP revizija Revizijsko zapisivanje svih poziva MCP alata uz SQLite
Zod provjera valjanosti Svi API ulazi provjeravaju se Zod v4 shemama pri učitavanju modula

Obavezne varijable okruženja

Sve tajne moraju biti postavljene prije pokretanja poslužitelja. Poslužitelj će se odmah prekinuti ako nedostaju ili su slabe.

# OBAVEZNO — poslužitelj se neće pokrenuti bez ovih varijabli:
JWT_SECRET=$(openssl rand -base64 48)     # min. 32 znaka
API_KEY_SECRET=$(openssl rand -hex 32)    # min. 16 znakova

# PREPORUČENO — omogućuje šifriranje pohranjenih podataka:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)

Poslužitelj aktivno odbija poznate slabe vrijednosti poput changeme, secret ili password.


Sigurnost Dockera

  • U produkciji koristite korisnika bez ovlasti korisnika root
  • Montirajte tajne kao volumene samo za čitanje
  • Nikada ne kopirajte .env datoteke u Docker slike
  • Koristite .dockerignore za izuzimanje osjetljivih datoteka
  • Postavite AUTH_COOKIE_SECURE=true kada se poslužitelj nalazi iza HTTPS-a
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

Ovisnosti

  • Redovito pokrećite npm audit (npm run audit:deps obuhvaća glavni dio i Electron)
  • Redovito ažurirajte ovisnosti
  • Projekt koristi husky + lint-staged za provjere prije commita (lint-staged + check-docs-sync + check:any-budget:t11)
  • CI cjevovod pri svakom pushu pokreće sigurnosna pravila ESLinta (no-eval, no-implied-eval, no-new-func = pogreška)
  • Konstante pružatelja usluga provjeravaju se pri učitavanju modula putem Zoda (src/shared/validation/schemas.ts)
  • Koriste se biblioteke koje su sigurne prema zadanim postavkama: dompurify / isomorphic-dompurify (XSS), jose (JWT), better-sqlite3 (nema rizika od SQLi-ja zahvaljujući parametriziranim upitima), bcryptjs (sažimanje lozinki)

Stroga sigurnosna pravila

Ova se pravila provode alatima i pregledima:

  1. Nikada ne commitajte tajne — .env je naveden u gitignoreu; .env.example je predložak (bez doslovnih vrijednosti, samo komentari — pogledajte PUBLIC_CREDS.md u nastavku)
  2. Nikada ne koristite eval(), new Function() ni implicitni eval — ESLint to provodi
  3. Nikada ne zaobilazite Husky kuke (--no-verify, --no-gpg-sign) bez izričitog odobrenja operatera
  4. Nikada ne pišite sirovi SQL u rutama — uvijek koristite src/lib/db/ (parametrizirano)
  5. Uvijek provjeravajte ulazne podatke pomoću Zoda — src/shared/validation/schemas.ts
  6. Uvijek pročistite zaglavlja uzvodnog sustava — popis zabranjenih stavki nalazi se u src/shared/constants/upstreamHeaders.ts
  7. Šifrirajte vjerodajnice u mirovanju — AES-256-GCM putem src/lib/db/encryption.ts
  8. Javne OAuth identifikatore uzvodnih sustava dohvaćajte putem resolvePublicCred() — nikada ne ugrađujte doslovne vrijednosti AIza… / GOCSPX-… / …apps.googleusercontent.com u izvorni kod. Pogledajte docs/security/PUBLIC_CREDS.md.
  9. Odgovore o pogreškama stvarajte putem buildErrorBody() / sanitizeErrorMessage() — nikada ne stavljajte sirove vrijednosti err.stack / err.message u tijela HTTP / SSE / executor / MCP odgovora. Pogledajte docs/security/ERROR_SANITIZATION.md.
  10. Vrijednosti tijekom izvođenja za exec() / spawn() prosljeđujte putem opcije env — nikada nemojte interpolirati vanjske putanje ili nepouzdane vrijednosti u skripte koje se prosljeđuju ljusci. Referenca: src/mitm/cert/install.ts::updateNssDatabases.
  11. Dajte prednost bibliotekama koje su sigurne prema zadanim postavkama — pogledajte tldrsec/awesome-secure-defaults (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Upotrijebite ih prije izrade vlastitog rješenja.

Nalazi skenera lanca opskrbe (Socket.dev / Snyk / slično)

Napomena o opsegu: socket.yml u korijenu repozitorija samo oblikuje projectIgnorePaths za Socket.devovo skeniranje objavljenog npm artefakta nakon objave na strani registra — nije obvezna kontrola spajanja u CI-ju/PR-u. Nijedan tijek rada u .github/workflows, nijedna skripta u package.json ni cilj u Makefile ne poziva Socket.dev.

Objavljeni npm artefakt omniroute uključuje Next.js međuverziju output: "standalone", što znači da svaki rukovatelj rutom — uključujući dokumentirane povlaštene značajke (MITM, uvoz iz Zeda, Cloud Sync, ugrađeni nadzornik usluga) — završava u minificiranim fragmentima .next/server/*.js. Heuristički skeneri lanca opskrbe često uspoređuju uzorke iz tih fragmenata s potpisima zlonamjernog softvera.

Konfiguracija skenera koju koristimo nalazi se u datoteci socket.yml u korijenu repozitorija (format v2 GitHub aplikacije Socket.dev — pogledajte https://docs.socket.dev/docs/socket-yml). Ona izričito izuzima direktorije koji se ne isporučuju (tests/, _tasks/, _references/, _ideia/, _mono_repo/, docs/ itd.) kako bi skener izvještavao samo o putanjama koda koje stvarno dospijevaju do korisnika objavljenog paketa — samo skeniranje pokreće GitHub aplikacija Socket čitanjem te datoteke, a ne tijek rada u ovom repozitoriju.

Za svaku kategoriju nalaza održavatelji vode zasebnu potvrdu:

  • docs/security/SOCKET_DEV_FINDINGS.md — karta pojedinačnih nalaza: izvorna datoteka ↔ označeni fragment ↔ ponašanje ↔ ublažavanje primijenjeno u v3.8.6.
  • Blokovi SECURITY-AUDITOR-NOTE: u izvornom kodu, na mjestu svake označene funkcije, upućuju na isti dokument.

Za korisnike čiji proces ne dopušta ublažavanje upozorenja: izgradite paket naredbom OMNIROUTE_BUILD_PROFILE=minimal npm run build. Time se četiri osjetljiva modula zamjenjuju zamjenskim implementacijama koje tijekom izvođenja vraćaju HTTP 503 feature-disabled, pa povlaštene putanje koda fizički nisu prisutne u paketu. Postupak objavljivanja opisan je u docs/security/SOCKET_DEV_FINDINGS.md.

Reference