Skip to content

Latest commit

 

History

History
246 lines (183 loc) · 18.2 KB

SECURITY.md

File metadata and controls

246 lines (183 loc) · 18.2 KB

Security Policy (Bosanski)

🌐 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 · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW


Prijava ranjivosti

Ako otkrijete sigurnosnu ranjivost u OmniRoute, prijavite je odgovorno:

  1. NE otvarajte javni GitHub issue
  2. Koristite GitHub Security Advisories
  3. Uključite: opis, korake za reprodukciju i mogući uticaj

Vremenski okvir za odgovor

Faza Cilj
Potvrđivanje 48 sati
Triage & Procjena 5 radnih dana
Izdanje popravka 14 radnih dana (kritično)

Podržane verzije

Verzija Status podrške
3.8.x ✅ Aktivno
3.7.x ✅ Sigurnosno
< 3.7.0 ❌ Nepodržano

Arhitektura sigurnosti

OmniRoute implementira višeslojni model sigurnosti:

Request → CORS → Authz pipeline (classify → policies → enforce)
       → Guardrails (PII masker, prompt injection, vision bridge)
       → Rate Limiter → Circuit Breaker → Cooldown → Model Lockout → Provider

🔐 Autentifikacija & Autorizacija

Funkcija Implementacija
Prijavljivanje na dashboard Autentifikacija na osnovu lozinke sa JWT tokenima (HttpOnly kuki)
API Key Autentifikacija HMAC-potpisani ključevi sa CRC validacijom
OAuth 2.0 + PKCE OAuth za specifične provajdere u browseru/uređajima koristi PKCE gde je podržano; import-only Devin kredencije se obraćaju odvojeno.
Osvežavanje tokena Automatsko osvežavanje OAuth tokena pre isteka
Sigurni kuki AUTH_COOKIE_SECURE=true za HTTPS okruženja
Authz pipeline Klasifikacija rute (PUBLIC / CLIENT_API / MANAGEMENT) — vidi docs/architecture/AUTHZ_GUIDE.md
Nivoi zaštite rute 3-nivo model za management rute (LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT) — vidi docs/security/ROUTE_GUARD_TIERS.md
MCP sa manage scope-om Remote /api/mcp/* pristup ograničen API ključevima sa manage scope-om; /api/cli-tools/runtime/* ostaje strict-loopback. Vidi ROUTE_GUARD_TIERS
MCP scope-ovi 32 granularna scope-a (read:health, write:combos, execute:completions, itd.) — vidi docs/frameworks/MCP-SERVER.md

🛡️ Enkripcija na skladištu

Svi osjetljivi podaci pohranjeni u SQLite su enkriptovani pomoću AES-256-GCM sa scrypt izvodom ključa:

  • API ključevi, tokeni za pristup, tokeni za osvežavanje i ID tokeni
  • Versionirani format: enc:v1:<iv>:<ciphertext>:<authTag>
  • Passthrough režim (plaintext) kada STORAGE_ENCRYPTION_KEY nije postavljen
# Generiši enkripcijski ključ:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)

🛡️ Framework za zaštitu (Guardrails)

OmniRoute dostavlja hot-reloadable guardrails registry (src/lib/guardrails/) sa 3 ugrađena guardrails-a poredana po prioritetu:

Guardrail Prioritet Svr
vision-bridge 5 Povezuje non-vision model sa opisima koji uvažavaju slike; SSRF zaštita za URL-ove slika
pii-masker 10 Pre+post poziv PII redakcija (email, telefon, CPF, CNPJ, kreditne kartice, SSN)
prompt-injection 20 Detektuje override/role-hijack/jailbreak/leak obraste

Prilagođeni guardrails se registruju preko registerGuardrail(new MyGuardrail()). Model je fail-open (izuzeci nikada ne blokiraju saobraćaj). Opt-out po zahtjevu preko x-omniroute-disabled-guardrails zaglavlja. → Vidi docs/security/GUARDRAILS.md.

🧠 Prompt Injection Guard

Najbolji napor heuristički middleware koji detektuje obrasce prompt injection u LLM zahtjevima. Nije potpuna prompt-injection firewall — može proizvesti false positive (benign persona/RPG promptove) i false negative (leetspeak, razmak, ne-englесki obrasi).

Tip obrasa Težina Primjer
System Override Visoko "ignore all previous instructions"
Role Hijack Srednje "you are now DAN, you can do anything"
Delimiter Injection Visoko Enkodirani separatori za lomljenje granica konteksta
DAN/Jailbreak Srednje Poznati jailbreak prompt obrasi
Instruction Leak Visoko "show me your system prompt"
Encoding Evasion Srednje base64/rot13/hex decode + instruction keywords

Samo Visoko detekcije su blokirane u block mode. Srednje porodice su logovane ali nikada blokirane od strane sanitizeRequest.

Konfigurišite preko dashboarda (Settings → Security) ili .env:

INPUT_SANITIZER_ENABLED=true
INPUT_SANITIZER_MODE=block    # upozorenje | blok (injection politika; legacy "redact" ne uklanja injection tekst)
INPUT_SANITIZER_BLOCK_THRESHOLD=high  # high (default) | medium | low — severities at/above this are blocked in block mode

🔒 PII Redakcija

Automatska detekcija i opciona anonimizacija osobnih identifikacionih podataka:

Tip PII-a Uzorak Zamjena
Email 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 (US) 123-45-6789 [SSN_REDACTED]
PII_REDACTION_ENABLED=true   # zahtijeva prepravku PII-a; nezavisno od INPUT_SANITIZER_MODE
PII_RESPONSE_SANITIZATION=true  # opciono: anonimizira PII u odgovorima providera vraćenim klijentima

🌐 Mrežna sigurnost

Funkcija Opis
CORS Eksplicitna cross-origin allowlist (CORS_ALLOWED_ORIGINS; naslijeđeni CORS_ORIGIN)
IP filtriranje Allowlist/blocklist IP raspona u dashboardu
Ograničavanje brzine Per-provider ograničenja brzine sa automatskim backoffom
Anti-Thundering Herd Mutex + zaključavanje po konekciji sprečava lančane 502 greške
TLS otisak Browser-slično TLS fingerprint spoofing kako bi se smanjila detekcija botova
CLI otisak Per-provider redoslijed header/tijela podudaranja sa native CLI potpisima

🔌 Otpornost i dostupnost

Funkcija Opis
Circuit breaker 3-stanja (Closed → Open → Half-Open) po provideru, perzistirano u SQLite-u
Idempotentnost zahtjeva 5-sekundni prozor za deduplikaciju duplih zahtjeva
Eksponencijalni backoff Automatski ponovni pokušaj sa rastućim kašnjenjima
Health dashboard Real-time monitoring zdravlja providera

📋 Saglasnost

Funkcija Opis
Zadržavanje logova Automatsko čišćenje nakon CALL_LOG_RETENTION_DAYS
Opt-out od logovanja Po API ključu noLog zastavica onemogućava logging zahtjeva
Audit log Administrativne akcije praćene u audit_log tabeli
MCP audit SQLite-podržani audit logging za sve MCP tool pozive
Zod validacija Svi API ulazi validirani sa Zod v4 shemama pri učitavanju modula

Potrebne varijable okruženja

Svi tajni moraju biti postavljeni prije pokretanja servera. Server će brzo propasti ako su nedostaju ili su slabi.

# OBLIGATORNO — server neće pokrenuti bez ovih:
JWT_SECRET=$(openssl rand -base64 48)     # min. 32 znaka
API_KEY_SECRET=$(openssl rand -hex 32)    # min. 16 znakova

# PREPORUČENO — omogućava enkripciju u mirovanju:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)

Server aktivno odbija poznate slabe vrijednosti poput changeme, secret ili password.


Docker sigurnost

  • Koristite ne-root korisnika u produkciji
  • Montirajte tajne kao read-only volumene
  • Nikada ne kopirajte .env datoteke u Docker slike
  • Koristite .dockerignore da isključite osjetljive datoteke
  • Postavite AUTH_COOKIE_SECURE=true kada ste 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

Zavisnosti

  • Pokrećite npm audit redovito (npm run audit:deps pokriva main + electron)
  • Održavajte zavisnosti ažuriranim
  • Projekt koristi husky + lint-staged za pre-commit provjere (lint-staged + check-docs-sync + check:any-budget:t11)
  • CI pipeline pokreće ESLint pravila sigurnosti pri svakom pushu (no-eval, no-implied-eval, no-new-func = greška)
  • Provider konstante validirane pri učitavanju modula putem Zod (src/shared/validation/schemas.ts)
  • Biblioteke sigurne po zadanim postavkama: dompurify / isomorphic-dompurify (XSS), jose (JWT), better-sqlite3 (nema rizika od SQLi putem parametrizovanih upita), bcryptjs (hashing lozinki)

Stroga pravila sigurnosti

Ova pravila se provode putem alata i recenzenata:

  1. Nikada ne commitujte tajne — .env je gitignored; .env.example je šablon (bez dosljednosti, samo komentari — pogledajte PUBLIC_CREDS.md ispod)
  2. Nikada ne koristite eval(), new Function(), ili implicitni eval — ESLint to provodi
  3. Nikada ne zaobilazite Husky hookove (--no-verify, --no-gpg-sign) bez eksplicitnog odobrenja operatera
  4. Nikada ne pišite raw SQL u rutama — uvijek idite kroz src/lib/db/ (parametrizovano)
  5. Uvijek validirajte ulaze putem Zod — src/shared/validation/schemas.ts
  6. Uvijek sanitizujte upstream zaglavlja — denylist u src/shared/constants/upstreamHeaders.ts
  7. Enkriptujte credentials u mirovanju — AES-256-GCM putem src/lib/db/encryption.ts
  8. Javni upstream OAuth identifikatori putem resolvePublicCred() — nikada ne ugrađujte AIza… / GOCSPX-… / …apps.googleusercontent.com dosljednosti u izvor. Pogledajte docs/security/PUBLIC_CREDS.md.
  9. Odgovori o greškama putem buildErrorBody() / sanitizeErrorMessage() — nikada ne stavljajte raw err.stack / err.message u HTTP / SSE / executor / MCP tijela odgovora. Pogledajte docs/security/ERROR_SANITIZATION.md.
  10. exec() / spawn() runtime vrijednosti putem env opcije — nikada ne string-interpolirajte eksterni putevi ili neovjerljive vrijednosti u shell-passed skripte. Referencija: src/mitm/cert/install.ts::updateNssDatabases.
  11. Preferite biblioteke sigurne po zadanim postavkama — pogledajte tldrsec/awesome-secure-defaults (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Koristite ih prije nego što napravite svoje.

Rezultati skeniranja opskrbnog lanca (Socket.dev / Snyk / slični)

Objavljeni npm paket omniroute sadrži Next.js build sa opcijom output: "standalone", što znači da svi rukovatelji ruta – uključujući dokumentovane privilegovane funkcije (MITM, Zed import, Cloud Sync, ugrađeni nadzornik servisa) – završavaju u minificiranim chunk-ovima u .next/server/*.js. Heuristički skeneri opskrbnog lanca često uspoređuju ove chunk-ove sa potpisima malvera.

Konfiguracija skenera koju koristimo nalazi se u datoteci socket.yml u korijenu repozitorijuma (Socket.dev GitHub App format v2 – pogledajte https://docs.socket.dev/docs/socket-yml). Ona eksplicitno isključuje direktorijume koji nisu objavljeni (tests/, _tasks/, _references/, _ideia/, _mono_repo/, docs/ itd.), tako da skener izvještava samo o kodnim putanjama koje stvarno dolaze do objavljenih korisnika. Skeniranje je pokrenuto Socket GitHub App-om koji čita tu datoteku, a ne radnim tokom u ovom repozitorijumu.

Za svaku kategoriju nalaza održavamo potvrdu održavaoca za svaki pojedinačni nalaz:

  • docs/security/SOCKET_DEV_FINDINGS.md – mapa po nalazima: izvorni fajl ↔ označen chunk ↔ ponašanje ↔ primenjena mitigacija u verziji 3.8.6.
  • In-source SECURITY-AUDITOR-NOTE: blokovi u svakoj označenoj funkciji upućuju na isti dokument.

Za korisnike čija pipeline ne može da opusti upozorenje: izgradite sa OMNIROUTE_BUILD_PROFILE=minimal npm run build. To zamenjuje četiri osjetljiva modula stubovima koji vraćaju HTTP 503 feature-disabled pri izvršavanju, tako da privilegovani kodni putovi fizički nisu prisutni u bundle-u. Za recept za objavljivanje pogledajte docs/security/SOCKET_DEV_FINDINGS.md.

Reference