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
22 KiB
Security Policy (Српски)
🌐 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 · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Prijavljivanje bezbednosnih propusta
Ako otkrijete bezbednosni propust u OmniRoute, prijavite ga odgovorno:
- NEMOJTE otvarati javni GitHub issue
- Koristite GitHub Security Advisories
- Uključite: opis, korake za reprodukciju i potencijalni uticaj
Vremenski okvir odgovora
| Faza | Cilj |
|---|---|
| Potvrda prijema | 48 sati |
| Trijaža i procena | 5 radnih dana |
| Objavljivanje ispravke | 14 radnih dana (kritično) |
Podržane verzije
| Verzija | Status podrške |
|---|---|
| 3.8.x | ✅ Aktivna |
| 3.7.x | ✅ Bezbednosna |
| < 3.7.0 | ❌ Nije podržana |
Bezbednosna arhitektura
OmniRoute implementira višeslojni bezbednosni model:
Request → CORS → Authz pipeline (classify → policies → enforce)
→ Guardrails (PII masker, prompt injection, vision bridge)
→ Rate Limiter → Circuit Breaker → Cooldown → Model Lockout → Provider
🔐 Autentifikacija i autorizacija
| Funkcija | Implementacija |
|---|---|
| Prijava na Dashboard | Autentifikacija zasnovana na lozinci sa JWT tokenima (HttpOnly kolačići) |
| API Key autentifikacija | HMAC-potpisani ključevi sa CRC validacijom |
| OAuth 2.0 + PKCE | OAuth za pregledač/uređaj specifičan za provajdera koristi PKCE gde je podržan; kredencijali za uvoz Devin naloga se obrađuju posebno. |
| Obnavljanje tokena | Automatsko obnavljanje OAuth tokena pre isteka |
| Bezbedni kolačići | AUTH_COOKIE_SECURE=true za HTTPS okruženja |
| Authz Pipeline | Klasifikacija ruta (PUBLIC / CLIENT_API / MANAGEMENT) — pogledajte docs/architecture/AUTHZ_GUIDE.md |
| Nivoi zaštite ruta | Model sa 3 nivoa za administrativne rute (LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT) — pogledajte docs/security/ROUTE_GUARD_TIERS.md |
| Manage-Scope MCP | Udaljeni pristup /api/mcp/* kontrolisan API ključevima sa manage opsegom; /api/cli-tools/runtime/* ostaje strogo-loopback. Pogledajte ROUTE_GUARD_TIERS |
| MCP opsezi | 32 granularna opsega (read:health, write:combos, execute:completions, itd.) — pogledajte docs/frameworks/MCP-SERVER.md |
🛡️ Enkripcija u stanju mirovanja
Svi osetljivi podaci sačuvani u SQLite bazi su enkriptovani korišćenjem AES-256-GCM sa scrypt izvođenjem ključa:
- API ključevi, access tokeni, refresh tokeni i ID tokeni
- Verzionisani format:
enc:v1:<iv>:<ciphertext>:<authTag> - Passthrough mod (nešifrovani tekst) kada
STORAGE_ENCRYPTION_KEYnije postavljen
# Generisanje ključa za enkripciju:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
🛡️ Guardrails Framework
OmniRoute isporučuje registar zaštitnih mera koji se može učitati u realnom vremenu (guardrails registry) (src/lib/guardrails/) sa 3 ugrađene zaštitne mere poređane po prioritetu:
| Guardrail | Prioritet | Namena |
|---|---|---|
vision-bridge |
5 | Povezuje modele bez vizuelnih mogućnosti sa opisima koji prepoznaju slike; SSRF zaštita za URL-ove slika |
pii-masker |
10 | Cenzura ličnih podataka (PII) pre i posle poziva (email adrese, telefonski brojevi, CPF, CNPJ, kreditne kartice, SSN) |
prompt-injection |
20 | Otkriva obrasce override/role-hijack/jailbreak/leak |
Prilagođene zaštitne mere se registruju putem registerGuardrail(new MyGuardrail()). Model funkcioniše po principu "fail-open" (izuzeci nikada ne blokiraju saobraćaj). Isključivanje po zahtevu putem x-omniroute-disabled-guardrails zaglavlja. → Pogledajte docs/security/GUARDRAILS.md.
🧠 Zaštita od Prompt Injection napada
Heuristički middleware koji na osnovu najbolje procene otkriva obrasce prompt injection napada u LLM zahtevima. Nije potpuni firewall za prompt injection — može proizvesti lažno pozitivne rezultate (benigni persona/RPG prompt-ovi) i lažno negativne rezultate (leetspeak, razmaci, obrasci koji nisu na engleskom).
| Tip obrasca | Ozbiljnost | Primer |
|---|---|---|
| System Override | Visoka | "ignoriši sva prethodna uputstva" |
| Role Hijack | Srednja | "sada si DAN, možeš raditi bilo šta" |
| Delimiter Injection | Visoka | Kodirani separatori za razbijanje granica konteksta |
| DAN/Jailbreak | Srednja | Poznati obrasci jailbreak prompt-ova |
| Instruction Leak | Visoka | "pokaži mi svoj sistemski prompt" |
| Encoding Evasion | Srednja | base64/rot13/hex dekodiranje + ključne reči uputstava |
Samo detekcije visoke ozbiljnosti se blokiraju u block modu. Porodice srednje ozbiljnosti
se logujraju, ali ih sanitizeRequest nikada ne blokira.
Konfigurišite putem dashboard-a (Settings → Security) ili .env:
INPUT_SANITIZER_ENABLED=true
INPUT_SANITIZER_MODE=block # warn | block (politika injection-a; zastareli "redact" ne uklanja tekst injection-a)
INPUT_SANITIZER_BLOCK_THRESHOLD=high # high (podrazumevano) | medium | low — ozbiljnosti na ovom nivou ili iznad se blokiraju u block modu
🔒 Cenzura ličnih podataka (PII)
Automatsko otkrivanje i opciona cenzura ličnih podataka:
| Tip PII | Obrazac | Zamena |
|---|---|---|
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 # prepisivanje PII podataka u zahtevu; nezavisno od INPUT_SANITIZER_MODE
PII_RESPONSE_SANITIZATION=true # opciono: cenzurisanje PII podataka u odgovorima provajdera koji se vraćaju klijentima
🌐 Mrežna bezbednost
| Funkcija | Opis |
|---|---|
| CORS | Eksplicitna lista dozvoljenih cross-origin adresa (CORS_ALLOWED_ORIGINS; zastarelo CORS_ORIGIN) |
| Filtriranje IP adresa | Dozvoljeni/blokirani opsezi IP adresa u dashboard-u |
| Ograničavanje broja zahteva | Ograničenja broja zahteva po provajderu sa automatskim odlaganjem |
| Zaštita od Thundering Herd efekta | Mutex + zaključavanje po konekciji sprečava kaskadne 502 greške |
| TLS Fingerprint | Oponašanje TLS otiska prsta pregledača za smanjenje detekcije botova |
| CLI Fingerprint | Redosled zaglavlja/tela po provajderu koji odgovara potpisima nativnih CLI alata |
🔌 Otpornost i dostupnost
| Funkcija | Opis |
|---|---|
| Circuit Breaker | 3 stanja (Zatvoreno → Otvoreno → Poluotvoreno) po provajderu, sačuvano u SQLite bazi |
| Idempotentnost zahteva | Prozor deduplikacije od 5 sekundi za duplicirane zahteve |
| Eksponencijalno odlaganje | Automatski ponovni pokušaj sa progresivno rastućim odlaganjima |
| Health Dashboard | Praćenje zdravlja provajdera u realnom vremenu |
📋 Usklađenost
| Funkcija | Opis |
|---|---|
| Čuvanje logova | Automatsko čišćenje nakon CALL_LOG_RETENTION_DAYS |
| Opcija isključivanja logovanja | Zastavica noLog po API ključu isključuje logovanje zahteva |
| Log revizije | Administrativne akcije se prate u tabeli audit_log |
| MCP revizija | Logovanje revizije sa SQLite bazom za sve MCP pozive alata |
| Zod validacija | Svi API unosi se validiraju Zod v4 šemama pri učitavanju modula |
Обавезне променљиве окружења
Све тајне (secrets) морају бити подешене пре покретања сервера. Сервер ће одбити покретање одмах (fail fast) ако недостају или су слабе.
# ОБАВЕЗНО — сервер се неће покренути без ових:
JWT_SECRET=$(openssl rand -base64 48) # мин 32 карактера
API_KEY_SECRET=$(openssl rand -hex 32) # мин 16 карактера
# ПРЕПОРУЧЕНО — омогућава енкрипцију у стању мировања (at rest):
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
Сервер активно одбацује познате слабе вредности као што су changeme, secret или password.
Docker безбедност
- Користите non-root корисника у производном окружењу
- Монтирајте тајне као read-only волумене
- Никада не копирајте
.envфајлове у Docker слике - Користите
.dockerignoreза искључивање осетљивих фајлова - Поставите
AUTH_COOKIE_SECURE=trueкада радите иза 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
Зависности
- Покрећите
npm auditредовно (npm run audit:depsпокрива main + electron) - Одржавајте зависности ажурним
- Пројекат користи
husky+lint-stagedза провере пре комита (lint-staged + check-docs-sync + check:any-budget:t11) - CI pipeline покреће ESLint безбедносна правила при сваком push-у (
no-eval,no-implied-eval,no-new-func= error) - Константе провајдера се валидирају при учитавању модула путем Zod-а (
src/shared/validation/schemas.ts) - Коришћене су безбедне подразумеване библиотеке:
dompurify/isomorphic-dompurify(XSS),jose(JWT),better-sqlite3(нема ризика од SQLi захваљујући параметризованим упитима),bcryptjs(хеширање лозинки)
Строга безбедносна правила
Ова правила се примењују алатима и рецензентима:
- Никада не комитујте тајне —
.envје у gitignore;.env.exampleје шаблон (без литералних вредности, само коментари — видите PUBLIC_CREDS.md испод) - Никада не користите
eval(),new Function()или implied eval — ESLint то примењује - Никада не заобилазите Husky hooks (
--no-verify,--no-gpg-sign) без изричите одобрења оператора - Никада не пишите сирови SQL у рутама — увек пролазите кроз
src/lib/db/(параметризовано) - Увек валидирајте улазе са Zod-ом —
src/shared/validation/schemas.ts - Увек санирајте upstream заглавља (headers) — denylist у
src/shared/constants/upstreamHeaders.ts - Енкриптујте акредитиве у стању мировања — AES-256-GCM путем
src/lib/db/encryption.ts - Јавни upstream OAuth идентификатори путем
resolvePublicCred()— никада не уграђујтеAIza…/GOCSPX-…/…apps.googleusercontent.comлитерале у изворни код. Погледајтеdocs/security/PUBLIC_CREDS.md. - Одговори на грешке кроз
buildErrorBody()/sanitizeErrorMessage()— никада не стављајте сировеerr.stack/err.messageу HTTP / SSE / executor / MCP тела одговора. Погледајтеdocs/security/ERROR_SANITIZATION.md. - Runtime вредности за
exec()/spawn()путем опцијеenv— никада не радите string-интерполацију спољних путања или неповерљивих вредности у скриптове који се прослеђују shell-у. Референца:src/mitm/cert/install.ts::updateNssDatabases. - Дајте приоритет безбедним подразумеваним библиотекама — погледајте tldrsec/awesome-secure-defaults (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Посегните за њима пре него што правите сопствено решење.
Налази скенера ланца снабдевања (Socket.dev / Snyk / слични)
Објављени npm артефакт omniroute садржи Next.js верзију изграђену са output: "standalone",
што значи да сваки обрађивач рута — укључујући документоване привилеговане
функционалности (MITM, Zed увоз, Cloud Sync, уграђени надзорник услуга) — завршава
у минификованим фрагментима .next/server/*.js. Хеуристички скенери ланца снабдевања
често упоређују обрасце из тих фрагмената са потписима злонамерног софтвера.
Конфигурација скенера коју користимо налази се у датотеци socket.yml у
корену репозиторијума (Socket.dev GitHub App формат v2 — погледајте
https://docs.socket.dev/docs/socket-yml). Она изричито искључује
директоријуме који се не испоручују (tests/, _tasks/, _references/, _ideia/,
_mono_repo/, docs/ итд.), тако да скенер извештава само о путањама кода које
заиста стижу до корисника објављеног пакета — само скенирање покреће Socket
GitHub App читањем те датотеке, а не ток посла у овом репозиторијуму.
За сваку категорију налаза одржавамо потврду одржаваоца за сваки појединачни налаз:
docs/security/SOCKET_DEV_FINDINGS.md— мапа по налазу: изворна датотека ↔ означени фрагмент ↔ понашање ↔ ублажавање примењено у v3.8.6.- Блокови
SECURITY-AUDITOR-NOTE:у изворном коду, код сваке означене функције, упућују на исти документ.
За кориснике чији систем за испоруку не може да ублажи упозорење: изградите помоћу
OMNIROUTE_BUILD_PROFILE=minimal npm run build. То замењује четири
осетљива модула заменским имплементацијама које током извршавања враћају HTTP 503
feature-disabled, тако да су привилеговане путање кода физички одсутне из пакета.
Погледајте docs/security/SOCKET_DEV_FINDINGS.md
за поступак објављивања.
Referenca
docs/architecture/AUTHZ_GUIDE.md— pipeline autorizacijedocs/security/GUARDRAILS.md— okvir guardrails-adocs/security/COMPLIANCE.md— audit log i retencijadocs/security/PUBLIC_CREDS.md— obavezan obrazac za javne upstream kredencijaledocs/security/ERROR_SANITIZATION.md— obavezan obrazac za odgovore na greškedocs/security/SOCKET_DEV_FINDINGS.md— atestacija održavaoca za nalaze skenera lanca snabdevanjadocs/architecture/RESILIENCE_GUIDE.md— circuit breaker + cooldown + lockoutdocs/security/STEALTH_GUIDE.md— TLS fingerprinting (pravno/etičko obaveštenje)CLAUDE.md— stroga pravila za AI agente- tldrsec/awesome-secure-defaults — kurirana lista sigurnih biblioteka po podrazumevanim podešavanjima