🌐 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
Ako otkrijete sigurnosnu ranjivost u OmniRoute, prijavite je odgovorno:
- NE otvarajte javni GitHub issue
- Koristite GitHub Security Advisories
- Uključite: opis, korake za reprodukciju i mogući uticaj
| Faza | Cilj |
|---|---|
| Potvrđivanje | 48 sati |
| Triage & Procjena | 5 radnih dana |
| Izdanje popravka | 14 radnih dana (kritično) |
| Verzija | Status podrške |
|---|---|
| 3.8.x | ✅ Aktivno |
| 3.7.x | ✅ Sigurnosno |
| < 3.7.0 | ❌ Nepodržano |
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
| 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 |
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_KEYnije postavljen
# Generiši enkripcijski ključ:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)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.
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 modeAutomatska detekcija i opciona anonimizacija osobnih identifikacionih podataka:
| Tip PII-a | Uzorak | Zamjena |
|---|---|---|
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| 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 |
| 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 |
| 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 |
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.
- Koristite ne-root korisnika u produkciji
- Montirajte tajne kao read-only volumene
- Nikada ne kopirajte
.envdatoteke u Docker slike - Koristite
.dockerignoreda isključite osjetljive datoteke - Postavite
AUTH_COOKIE_SECURE=truekada 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- Pokrećite
npm auditredovito (npm run audit:depspokriva main + electron) - Održavajte zavisnosti ažuriranim
- Projekt koristi
husky+lint-stagedza 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)
Ova pravila se provode putem alata i recenzenata:
- Nikada ne commitujte tajne —
.envje gitignored;.env.exampleje šablon (bez dosljednosti, samo komentari — pogledajte PUBLIC_CREDS.md ispod) - Nikada ne koristite
eval(),new Function(), ili implicitni eval — ESLint to provodi - Nikada ne zaobilazite Husky hookove (
--no-verify,--no-gpg-sign) bez eksplicitnog odobrenja operatera - Nikada ne pišite raw SQL u rutama — uvijek idite kroz
src/lib/db/(parametrizovano) - Uvijek validirajte ulaze putem Zod —
src/shared/validation/schemas.ts - Uvijek sanitizujte upstream zaglavlja — denylist u
src/shared/constants/upstreamHeaders.ts - Enkriptujte credentials u mirovanju — AES-256-GCM putem
src/lib/db/encryption.ts - Javni upstream OAuth identifikatori putem
resolvePublicCred()— nikada ne ugrađujteAIza…/GOCSPX-…/…apps.googleusercontent.comdosljednosti u izvor. Pogledajtedocs/security/PUBLIC_CREDS.md. - Odgovori o greškama putem
buildErrorBody()/sanitizeErrorMessage()— nikada ne stavljajte rawerr.stack/err.messageu HTTP / SSE / executor / MCP tijela odgovora. Pogledajtedocs/security/ERROR_SANITIZATION.md. exec()/spawn()runtime vrijednosti putemenvopcije — nikada ne string-interpolirajte eksterni putevi ili neovjerljive vrijednosti u shell-passed skripte. Referencija:src/mitm/cert/install.ts::updateNssDatabases.- 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.
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.
docs/architecture/AUTHZ_GUIDE.md– autorizacioni pipelinedocs/security/GUARDRAILS.md– okvir za zaštitne barijeredocs/security/COMPLIANCE.md– audit log i zadržavanje podatakadocs/security/PUBLIC_CREDS.md– obavezni obrazac za javne upstream kredencijaledocs/security/ERROR_SANITIZATION.md– obavezni obrazac za odgovore na greškedocs/security/SOCKET_DEV_FINDINGS.md– potvrda održavaoca za nalaze skenera opskrbnog lancadocs/architecture/RESILIENCE_GUIDE.md– prekidač za prekid veze + cooldown + zaključavanjedocs/security/STEALTH_GUIDE.md– TLS otisci (pravna/etnička obaveštenja)- CLAUDE.md – stroga pravila za AI agente
- tldrsec/awesome-secure-defaults – kurirane biblioteke koje su sigurne po defaultu