# Security Policy (Slovenščina) 🌐 **Languages:** 🇺🇸 [English](../../../SECURITY.md) · 🇪🇹 [am](../am/SECURITY.md) · 🇸🇦 [ar](../ar/SECURITY.md) · 🇦🇿 [az](../az/SECURITY.md) · 🇧🇬 [bg](../bg/SECURITY.md) · 🇧🇩 [bn](../bn/SECURITY.md) · 🇧🇦 [bs](../bs/SECURITY.md) · 🇨🇿 [cs](../cs/SECURITY.md) · 🇩🇰 [da](../da/SECURITY.md) · 🇩🇪 [de](../de/SECURITY.md) · 🇬🇷 [el](../el/SECURITY.md) · 🇪🇸 [es](../es/SECURITY.md) · 🇪🇪 [et](../et/SECURITY.md) · 🇮🇷 [fa](../fa/SECURITY.md) · 🇫🇮 [fi](../fi/SECURITY.md) · 🇫🇷 [fr](../fr/SECURITY.md) · 🇮🇪 [ga](../ga/SECURITY.md) · 🇮🇳 [gu](../gu/SECURITY.md) · 🇳🇬 [ha](../ha/SECURITY.md) · 🇮🇱 [he](../he/SECURITY.md) · 🇮🇳 [hi](../hi/SECURITY.md) · 🇭🇷 [hr](../hr/SECURITY.md) · 🇭🇺 [hu](../hu/SECURITY.md) · 🇦🇲 [hy](../hy/SECURITY.md) · 🇮🇩 [id](../id/SECURITY.md) · 🇳🇬 [ig](../ig/SECURITY.md) · 🇮🇹 [it](../it/SECURITY.md) · 🇯🇵 [ja](../ja/SECURITY.md) · 🇬🇪 [ka](../ka/SECURITY.md) · 🇰🇭 [km](../km/SECURITY.md) · 🇮🇳 [kn](../kn/SECURITY.md) · 🇰🇷 [ko](../ko/SECURITY.md) · 🇱🇹 [lt](../lt/SECURITY.md) · 🇱🇻 [lv](../lv/SECURITY.md) · 🇮🇳 [ml](../ml/SECURITY.md) · 🇮🇳 [mr](../mr/SECURITY.md) · 🇲🇾 [ms](../ms/SECURITY.md) · 🇲🇹 [mt](../mt/SECURITY.md) · 🇲🇲 [my](../my/SECURITY.md) · 🇳🇵 [ne](../ne/SECURITY.md) · 🇳🇱 [nl](../nl/SECURITY.md) · 🇳🇴 [no](../no/SECURITY.md) · 🇮🇳 [or](../or/SECURITY.md) · 🇮🇳 [pa](../pa/SECURITY.md) · 🇵🇭 [phi](../phi/SECURITY.md) · 🇵🇱 [pl](../pl/SECURITY.md) · 🇵🇹 [pt](../pt/SECURITY.md) · 🇧🇷 [pt-BR](../pt-BR/SECURITY.md) · 🇷🇴 [ro](../ro/SECURITY.md) · 🇷🇺 [ru](../ru/SECURITY.md) · 🇱🇰 [si](../si/SECURITY.md) · 🇸🇰 [sk](../sk/SECURITY.md) · 🇷🇸 [sr](../sr/SECURITY.md) · 🇸🇪 [sv](../sv/SECURITY.md) · 🇰🇪 [sw](../sw/SECURITY.md) · 🇮🇳 [ta](../ta/SECURITY.md) · 🇮🇳 [te](../te/SECURITY.md) · 🇹🇭 [th](../th/SECURITY.md) · 🇹🇷 [tr](../tr/SECURITY.md) · 🇺🇦 [uk-UA](../uk-UA/SECURITY.md) · 🇵🇰 [ur](../ur/SECURITY.md) · 🇺🇿 [uz](../uz/SECURITY.md) · 🇻🇳 [vi](../vi/SECURITY.md) · 🇳🇬 [yo](../yo/SECURITY.md) · 🇨🇳 [zh-CN](../zh-CN/SECURITY.md) · 🇹🇼 [zh-TW](../zh-TW/SECURITY.md) --- ## Prijavljanje ranljivosti Če odkrijete varnostno ranljivost v OmniRoute, jo odgovorno prijavite: 1. **NE** odpirajte javne težave v GitHubu 2. Uporabite [GitHub Security Advisories](https://github.com/diegosouzapw/OmniRoute/security/advisories/new) 3. Vključite: opis, korake za ponovitev in morebitni vpliv ## Časovnica odziva | Faza | Cilj | | ----------------- | -------------------------- | | Potrditev prejema | 48 ur | | Triaža in ocena | 5 delovnih dni | | Izdaja popravka | 14 delovnih dni (kritično) | ## Podprte različice | Različica | Stanje podpore | | --------- | ----------------------------------------------------- | | 3.9.x | 🗓️ Načrtovano — veja LTS (`stable/v3`), glejte spodaj | | 3.8.x | ✅ Aktivna | | 3.7.x | ✅ Varnostna | | < 3.7.0 | ❌ Nepodprta | ## Obdobje podpore LTS (v3.9.x) Po različici 3.8.59 bo naslednja različica **3.9.0**, ki odpira vejo dolgoročne podpore `stable/v3` (glejte [`ROADMAP.md`](ROADMAP.md) → »Phase 3 — v3.9.0 LTS«). - **Kaj prejema `stable/v3`:** popravke napak, varnostne popravke in posodobitve ponudnikov. Nove funkcije so namenjene kanalu v4; veja LTS daje prednost stabilnosti. `npm install omniroute` (distribucijska oznaka `latest`) ostane na v3 med celotnim ciklom v4. - **Trajanje obdobja:** ``. Dolžina obdobja po splošni razpoložljivosti v4.0 (ko `latest` preklopi na v4) **še ni določena**; ta razdelek bo posodobljen, ko jo vzdrževalec objavi. Do takrat ne predvidevajte končnega datuma. - **Prijava ranljivosti v veji LTS:** uporabite isti kanal kot za katero koli drugo različico — zasebno [GitHub Security Advisory](https://github.com/diegosouzapw/OmniRoute/security/advisories/new), nikoli javne težave. Navedite, katero različico ste preizkusili (na primer `3.9.2`); popravki se vključijo v `stable/v3` in se prenesejo naprej v v4. - **Varnostno izhodišče ob začetku LTS:** izmerjeno stanje pregledovalnika, dokazila o varovanju poti in javnih poverilnicah so zabeležena v [`docs/security/LTS_SECURITY_BASELINE.md`](docs/security/LTS_SECURITY_BASELINE.md). --- ## Varnostna arhitektura OmniRoute uporablja večplastni varnostni model: ``` Zahteva → CORS → Cevovod Authz (razvrsti → pravilniki → uveljavi) → Varovala (prikrivalnik PII, vrivanje pozivov, slikovni most) → Omejevalnik hitrosti → Odklopnik → Obdobje mirovanja → Zaklep modela → Ponudnik ``` ### 🔐 Avtentikacija in avtorizacija | Funkcionalnost | Izvedba | | ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Prijava v nadzorno ploščo** | Avtentikacija na podlagi gesla z žetoni JWT (piškotki HttpOnly) | | **Avtentikacija s ključem API** | Ključi, podpisani s HMAC, s preverjanjem CRC | | **OAuth 2.0 + PKCE** | OAuth za brskalnik/napravo, specifičen za ponudnika, uporablja PKCE, kjer je podprt; poverilnice Devin, namenjene samo uvozu, se obravnavajo ločeno. | | **Osveževanje žetonov** | Samodejno osveževanje žetonov OAuth pred potekom veljavnosti | | **Varni piškotki** | `AUTH_COOKIE_SECURE=true` za okolja HTTPS | | **Cevovod Authz** | Razvrščanje poti (PUBLIC / CLIENT_API / MANAGEMENT) — glejte `docs/architecture/AUTHZ_GUIDE.md` | | **Ravni varovanja poti** | Tristopenjski model za upravljavske poti (LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT) — glejte `docs/security/ROUTE_GUARD_TIERS.md` | | **MCP z obsegom manage** | Oddaljeni dostop do `/api/mcp/*` je omejen s ključi API z obsegom `manage`; `/api/cli-tools/runtime/*` ostaja strogo omejen na povratno zanko. Glejte ROUTE_GUARD_TIERS | | **Obsegi MCP** | 32 podrobnih obsegov (read:health, write:combos, execute:completions itd.) — glejte `docs/frameworks/MCP-SERVER.md` | ### 🛡️ Šifriranje shranjenih podatkov Vsi občutljivi podatki, shranjeni v SQLite, so šifrirani z algoritmom **AES-256-GCM** in izpeljavo ključa scrypt: - Ključi API, žetoni za dostop, žetoni za osveževanje in žetoni ID - Različicami opredeljena oblika: `enc:v1:::` - Način neposrednega prehoda (navadno besedilo), kadar `STORAGE_ENCRYPTION_KEY` ni nastavljen ```bash # Ustvarite šifrirni ključ: STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32) ``` ### 🛡️ Ogrodje varoval OmniRoute vključuje **register varoval** z možnostjo ponovnega nalaganja med delovanjem (`src/lib/guardrails/`) s 3 vgrajenimi varovali, razvrščenimi po prioriteti: | Varovalo | Prioriteta | Namen | | ------------------ | ---------- | ---------------------------------------------------------------------------------------------------- | | `vision-bridge` | 5 | Povezuje modele brez podpore za slike z opisi, ki upoštevajo slike; zaščita SSRF za URL-je slik | | `pii-masker` | 10 | Zakrivanje PII pred klicem in po njem (e-poštni naslovi, telefoni, CPF, CNPJ, kreditne kartice, SSN) | | `prompt-injection` | 20 | Zaznava vzorce preglasitve, prevzema vlog, obhoda omejitev in uhajanja podatkov | Varovala po meri se registrirajo prek `registerGuardrail(new MyGuardrail())`. Model ob napakah dopušča promet (izjeme ga nikoli ne blokirajo). Izključitev za posamezno zahtevo je mogoča prek glave `x-omniroute-disabled-guardrails`. → Glejte [`docs/security/GUARDRAILS.md`](docs/security/GUARDRAILS.md). ### 🧠 Varovalo pred vrivanjem pozivov Hevristična vmesna programska oprema po načelu najboljšega možnega zaznavanja vzorcev vstavljanja pozivov v zahtevah za LLM. **Ni celovit požarni zid proti vstavljanju pozivov** — lahko povzroči lažno pozitivne rezultate (neškodljivi pozivi z osebami/RPG) in lažno negativne rezultate (leetspeak, presledki, neangleški vzorci). | Vrsta vzorca | Resnost | Primer | | ----------------------- | ------- | ----------------------------------------------------- | | Preglasitev sistema | Visoka | "prezri vsa prejšnja navodila" | | Ugrabitev vloge | Srednja | "zdaj si DAN in lahko narediš kar koli" | | Vstavljanje ločil | Visoka | Kodirana ločila za prekinitev meja konteksta | | DAN/Jailbreak | Srednja | Znani vzorci pozivov za obhod omejitev | | Razkritje navodil | Visoka | "pokaži mi svoj sistemski poziv" | | Izogibanje s kodiranjem | Srednja | dekodiranje base64/rot13/hex + ključne besede navodil | V načinu `block` so blokirane samo zaznave z **visoko** stopnjo resnosti. Družine s srednjo stopnjo resnosti se beležijo, vendar jih `sanitizeRequest` nikoli ne blokira. Nastavite prek nadzorne plošče (Nastavitve → Varnost) ali datoteke `.env`: ```env INPUT_SANITIZER_ENABLED=true INPUT_SANITIZER_MODE=block # warn | block (pravilnik vstavljanja; podedovani način "redact" ne odstrani vstavljenega besedila) INPUT_SANITIZER_BLOCK_THRESHOLD=high # high (privzeto) | medium | low — stopnje resnosti na tej ravni ali višje so blokirane v načinu block ``` ### 🔒 Redigiranje osebnih podatkov Samodejno zaznavanje in izbirno redigiranje osebno določljivih podatkov: | Vrsta osebnega podatka | Vzorec | Zamenjava | | ---------------------- | --------------------- | ------------------ | | E-poštni naslov | `user@domain.com` | `[EMAIL_REDACTED]` | | CPF (Brazilija) | `123.456.789-00` | `[CPF_REDACTED]` | | CNPJ (Brazilija) | `12.345.678/0001-00` | `[CNPJ_REDACTED]` | | Kreditna kartica | `4111-1111-1111-1111` | `[CC_REDACTED]` | | Telefon | `+55 11 99999-9999` | `[PHONE_REDACTED]` | | SSN (ZDA) | `123-45-6789` | `[SSN_REDACTED]` | ```env PII_REDACTION_ENABLED=true # zahteva preoblikovanje osebnih podatkov; neodvisno od INPUT_SANITIZER_MODE PII_RESPONSE_SANITIZATION=true # izbirno: redigira osebne podatke v odgovorih ponudnika, vrnjenih odjemalcem ``` ### 🌐 Omrežna varnost | Funkcija | Opis | | --------------------------------- | ------------------------------------------------------------------------------------ | | **CORS** | Izrecni seznam dovoljenih izvorov (`CORS_ALLOWED_ORIGINS`; podedovano `CORS_ORIGIN`) | | **Filtriranje IP-jev** | Seznami dovoljenih/blokiranih obsegov IP na nadzorni plošči | | **Omejevanje hitrosti** | Omejitve hitrosti za posameznega ponudnika s samodejnim časovnim zamikom | | **Preprečevanje stampeda zahtev** | Mutex + zaklepanje na ravni povezave preprečujeta verižno pojavljanje napak 502 | | **Prstni odtis TLS** | Posnemanje brskalniku podobnega prstnega odtisa TLS za zmanjšanje zaznavanja botov | | **Prstni odtis CLI** | Vrstni red glav/telesa za posameznega ponudnika, ki se ujema z izvornimi podpisi CLI | ### 🔌 Odpornost in razpoložljivost | Funkcija | Opis | | ----------------------------- | -------------------------------------------------------------------------------- | | **Odklopnik** | 3-stanjski (zaprt → odprt → napol odprt) za vsakega ponudnika, shranjen v SQLite | | **Idempotentnost zahtev** | 5-sekundno okno za odstranjevanje podvojenih zahtev | | **Eksponentni časovni zamik** | Samodejni ponovni poskusi z naraščajočimi zakasnitvami | | **Nadzorna plošča stanja** | Spremljanje stanja ponudnikov v realnem času | ### 📋 Skladnost | Funkcija | Opis | | ------------------------------- | ------------------------------------------------------------------- | | **Hramba dnevnikov** | Samodejno čiščenje po `CALL_LOG_RETENTION_DAYS` | | **Izključitev beleženja** | Zastavica `noLog` za posamezni ključ API onemogoči beleženje zahtev | | **Revizijski dnevnik** | Skrbniška dejanja se spremljajo v tabeli `audit_log` | | **Revizija MCP** | Revizijsko beleženje vseh klicev orodij MCP, podprto s SQLite | | **Preverjanje veljavnosti Zod** | Vsi vhodi API se ob nalaganju modula preverijo s shemami Zod v4 | --- ## Zahtevane okoljske spremenljivke Vse skrivnosti morajo biti nastavljene pred zagonom strežnika. Če manjkajo ali so šibke, bo strežnik **takoj prekinil delovanje**. ```bash # ZAHTEVANO — strežnik se brez teh vrednosti ne bo zagnal: JWT_SECRET=$(openssl rand -base64 48) # najmanj 32 znakov API_KEY_SECRET=$(openssl rand -hex 32) # najmanj 16 znakov # PRIPOROČENO — omogoča šifriranje shranjenih podatkov: STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32) ``` Strežnik aktivno zavrača znane šibke vrednosti, kot so `changeme`, `secret` ali `password`. --- ## Varnost Dockerja - V produkcijskem okolju uporabljajte uporabnika brez korenskih pravic - Skrivnosti priklopite kot nosilce samo za branje - Datotek `.env` nikoli ne kopirajte v slike Docker - Za izključitev občutljivih datotek uporabite `.dockerignore` - Pri uporabi HTTPS nastavite `AUTH_COOKIE_SECURE=true` ```bash 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 ``` --- ## Odvisnosti - Redno izvajajte `npm audit` (`npm run audit:deps` zajema glavni del in Electron) - Odvisnosti redno posodabljajte - Projekt za preverjanja pred potrditvijo uporablja `husky` + `lint-staged` (lint-staged + check-docs-sync + check:any-budget:t11) - Cevovod CI ob vsakem potisku izvede varnostna pravila ESLint (`no-eval`, `no-implied-eval`, `no-new-func` = napaka) - Konstante ponudnikov se ob nalaganju modula preverijo z Zod (`src/shared/validation/schemas.ts`) - Uporabljene so privzeto varne knjižnice: `dompurify` / `isomorphic-dompurify` (XSS), `jose` (JWT), `better-sqlite3` (ni tveganja SQLi zaradi parametriziranih poizvedb), `bcryptjs` (zgoščevanje gesel) ## Stroga varnostna pravila Ta pravila uveljavljajo orodja in pregledovalci: 1. **Nikoli ne potrdite skrivnosti v repozitorij** — `.env` je izključen prek gitignore; `.env.example` je predloga (brez dobesednih vrednosti, samo komentarji — glejte PUBLIC_CREDS.md spodaj) 2. **Nikoli ne uporabljajte `eval()`, `new Function()` ali implicitnega eval** — to uveljavlja ESLint 3. **Nikoli ne obidite kavljev Husky** (`--no-verify`, `--no-gpg-sign`) brez izrecne odobritve upravljavca 4. **V poteh nikoli ne pišite surovega SQL-a** — vedno uporabite `src/lib/db/` (parametrizirano) 5. **Vhodne podatke vedno preverite z Zod** — `src/shared/validation/schemas.ts` 6. **Vedno prečistite glave nadrejenega strežnika** — seznam prepovedanih vrednosti je v `src/shared/constants/upstreamHeaders.ts` 7. **Poverilnice šifrirajte pri shranjevanju** — AES-256-GCM prek `src/lib/db/encryption.ts` 8. **Javne identifikatorje OAuth nadrejenih storitev pridobite prek `resolvePublicCred()`** — v izvorno kodo nikoli ne vdelujte dobesednih vrednosti `AIza…` / `GOCSPX-…` / `…apps.googleusercontent.com`. Glejte [`docs/security/PUBLIC_CREDS.md`](docs/security/PUBLIC_CREDS.md). 9. **Odzive z napakami ustvarjajte prek `buildErrorBody()` / `sanitizeErrorMessage()`** — neobdelanih vrednosti `err.stack` / `err.message` nikoli ne vključite v telesa odzivov HTTP / SSE / izvajalnika / MCP. Glejte [`docs/security/ERROR_SANITIZATION.md`](docs/security/ERROR_SANITIZATION.md). 10. **Izvajalne vrednosti za `exec()` / `spawn()` posredujte prek možnosti `env`** — zunanjih poti ali nezaupanja vrednih vrednosti nikoli ne interpolirajte v nize skript, posredovane lupini. Referenca: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **Dajte prednost privzeto varnim knjižnicam** — glejte [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Uporabite jih, preden razvijete lastno rešitev. ## Ugotovitve pregledovalnikov dobavne verige (Socket.dev / Snyk / podobni) > **Opomba o obsegu:** `socket.yml` v korenu repozitorija določa samo `projectIgnorePaths` za pregled objavljenega artefakta npm po objavi, ki ga Socket.dev izvaja na strani registra — ne predstavlja obvezne kontrolne točke CI/PR za združevanje. Noben potek dela v `.github/workflows`, noben skript v `package.json` in noben cilj v `Makefile` ne prikliče Socket.dev. Objavljeni artefakt npm `omniroute` vključuje gradnjo Next.js z nastavitvijo `output: "standalone"`, kar pomeni, da vsak obdelovalnik poti — vključno z dokumentiranimi privilegiranimi funkcijami (MITM, uvoz Zed, Cloud Sync, vgrajeni nadzornik storitev) — konča v minimiziranih kosih `.next/server/*.js`. Hevristični pregledovalniki dobavne verige te kose pogosto primerjajo z vzorci podpisov zlonamerne programske opreme. Konfiguracija pregledovalnika, ki jo uporabljamo, je v datoteki [`socket.yml`](socket.yml) v korenu repozitorija (oblika v2 aplikacije Socket.dev za GitHub — glejte ). Izrecno izključuje imenike, ki niso vključeni v izdajo (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/` itd.), tako da pregledovalnik poroča samo o kodnih poteh, ki dejansko dosežejo uporabnike objavljene različice — sam pregled sproži aplikacija Socket za GitHub, ki prebere to datoteko, in ne potek dela v tem repozitoriju. Za vsako kategorijo ugotovitev vzdržujemo potrdilo vzdrževalca za posamezno ugotovitev: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — preslikava za posamezno ugotovitev: izvorna datoteka ↔ označeni kos ↔ vedenje ↔ omilitveni ukrep, uporabljen v v3.8.6. - Bloki `SECURITY-AUDITOR-NOTE:` v izvorni kodi pri vsaki označeni funkciji kažejo nazaj na isti dokument. Za uporabnike, katerih cevovod ne omogoča omilitve opozorila: gradnjo izvedite z `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. To zamenja štiri občutljive module z nadomestnimi izvedbami, ki med izvajanjem vrnejo HTTP 503 `feature-disabled`, zato privilegirane kodne poti fizično niso prisotne v paketu. Recept za objavo najdete v [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md). ## Reference - [`docs/architecture/AUTHZ_GUIDE.md`](docs/architecture/AUTHZ_GUIDE.md) — cevovod avtorizacije - [`docs/security/GUARDRAILS.md`](docs/security/GUARDRAILS.md) — ogrodje varoval - [`docs/security/COMPLIANCE.md`](docs/security/COMPLIANCE.md) — dnevnik revizij in hramba - [`docs/security/PUBLIC_CREDS.md`](docs/security/PUBLIC_CREDS.md) — **obvezen** vzorec za javne poverilnice nadrejenih storitev - [`docs/security/ERROR_SANITIZATION.md`](docs/security/ERROR_SANITIZATION.md) — **obvezen** vzorec za odzive ob napakah - [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) — potrdilo vzdrževalca za ugotovitve pregledovalnika dobavne verige - [`docs/architecture/RESILIENCE_GUIDE.md`](docs/architecture/RESILIENCE_GUIDE.md) — odklopnik + obdobje ohlajanja + zaklep - [`docs/security/STEALTH_GUIDE.md`](docs/security/STEALTH_GUIDE.md) — prstni odtisi TLS (pravno/etično obvestilo) - [`CLAUDE.md`](CLAUDE.md) — stroga pravila za agente umetne inteligence - [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) — skrbno izbrane knjižnice z varnimi privzetimi nastavitvami