# Security Policy (Dansk) 🌐 **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) · 🇩🇪 [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) · 🇸🇮 [sl](../sl/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) --- ## Rapportering af sårbarheder Hvis du opdager en sikkerhedssårbarhed i OmniRoute, bedes du rapportere den ansvarligt: 1. **ÅBN IKKE** en offentlig GitHub-issue 2. Brug [GitHub Security Advisories](https://github.com/diegosouzapw/OmniRoute/security/advisories/new) 3. Medtag: beskrivelse, trin til reproduktion og potentiel påvirkning ## Tidslinje for respons | Fase | Målsætning | | ----------------------- | ------------------------ | | Bekræftelse | 48 timer | | Triagering og vurdering | 5 arbejdsdage | | Udgivelse af rettelse | 14 arbejdsdage (kritisk) | ## Understøttede versioner | Version | Supportstatus | | ------- | -------------------- | | 3.8.x | ✅ Aktiv | | 3.7.x | ✅ Sikkerhed | | < 3.7.0 | ❌ Ikke understøttet | --- ## Sikkerhedsarkitektur OmniRoute implementerer en sikkerhedsmodel med flere lag: ``` Anmodning → CORS → Autorisationspipeline (klassificér → politikker → håndhæv) → Sikkerhedsforanstaltninger (PII-maskering, promptinjektion, vision-bro) → Hastighedsbegrænser → Kredsløbsafbryder → Nedkøling → Modellåsning → Udbyder ``` ### 🔐 Godkendelse og autorisation | Funktion | Implementering | | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Dashboard-login** | Adgangskodebaseret godkendelse med JWT-tokens (HttpOnly-cookies) | | **API-nøglegodkendelse** | HMAC-signerede nøgler med CRC-validering | | **OAuth 2.0 + PKCE** | Udbyderspecifik browser-/enheds-OAuth bruger PKCE, hvor det understøttes; Devin-legitimationsoplysninger, der kun kan importeres, håndteres separat. | | **Tokenfornyelse** | Automatisk fornyelse af OAuth-tokens før udløb | | **Sikre cookies** | `AUTH_COOKIE_SECURE=true` til HTTPS-miljøer | | **Autorisationspipeline** | Ruteklassificering (PUBLIC / CLIENT_API / MANAGEMENT) — se `docs/architecture/AUTHZ_GUIDE.md` | | **Niveauer for rutebeskyttelse** | Model med 3 niveauer for administrationsruter (LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT) — se `docs/security/ROUTE_GUARD_TIERS.md` | | **MCP med manage-scope** | Fjernadgang til `/api/mcp/*` er beskyttet af API-nøgler med `manage`-scope; `/api/cli-tools/runtime/*` forbliver strengt begrænset til loopback. Se ROUTE_GUARD_TIERS | | **MCP-scopes** | 32 detaljerede scopes (read:health, write:combos, execute:completions osv.) — se `docs/frameworks/MCP-SERVER.md` | ### 🛡️ Kryptering af lagrede data Alle følsomme data, der gemmes i SQLite, krypteres med **AES-256-GCM** og scrypt-nøgleafledning: - API-nøgler, adgangstokens, fornyelsestokens og ID-tokens - Versionsinddelt format: `enc:v1:::` - Passthrough-tilstand (klartekst), når `STORAGE_ENCRYPTION_KEY` ikke er angivet ```bash # Generér krypteringsnøgle: STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32) ``` ### 🛡️ Framework til sikkerhedsforanstaltninger OmniRoute leveres med et **register over sikkerhedsforanstaltninger**, som kan genindlæses dynamisk (`src/lib/guardrails/`), med 3 indbyggede sikkerhedsforanstaltninger sorteret efter prioritet: | Sikkerhedsforanstaltning | Prioritet | Formål | | ------------------------ | --------- | ----------------------------------------------------------------------------------------------------------- | | `vision-bridge` | 5 | Forbinder modeller uden billedfunktioner med billedbevidste beskrivelser; SSRF-beskyttelse af billed-URL'er | | `pii-masker` | 10 | PII-redigering før og efter kald (e-mails, telefonnumre, CPF, CNPJ, kreditkort, SSN) | | `prompt-injection` | 20 | Registrerer mønstre for tilsidesættelse, rollekapring, jailbreak og lækage | Brugerdefinerede sikkerhedsforanstaltninger registreres via `registerGuardrail(new MyGuardrail())`. Modellen er fail-open (undtagelser blokerer aldrig trafik). Fravalg pr. anmodning via headeren `x-omniroute-disabled-guardrails`. → Se [`docs/security/GUARDRAILS.md`](docs/security/GUARDRAILS.md). ### 🧠 Beskyttelse mod promptinjektion Best effort-heuristisk middleware, der registrerer promptinjektionsmønstre i LLM-anmodninger. **Ikke en komplet firewall mod promptinjektion** — kan give falske positiver (harmløse persona-/RPG-prompter) og falske negativer (leetspeak, mellemrum, ikke-engelske mønstre). | Mønstertype | Alvorlighed | Eksempel | | ------------------------- | ----------- | --------------------------------------------------- | | Tilsidesættelse af system | Høj | "ignorer alle tidligere instruktioner" | | Rollekapring | Middel | "du er nu DAN, du kan gøre hvad som helst" | | Afgrænserinjektion | Høj | Kodede separatorer til at bryde kontekstgrænser | | DAN/jailbreak | Middel | Kendte jailbreak-promptmønstre | | Instruktionslækage | Høj | "vis mig din systemprompt" | | Omgåelse via kodning | Middel | base64-/rot13-/hex-afkodning + instruktionsnøgleord | Kun registreringer med **Høj** alvorlighed blokeres i `block`-tilstand. Familier med middel alvorlighed logges, men blokeres aldrig af `sanitizeRequest`. Konfigurer via dashboardet (Indstillinger → Sikkerhed) eller `.env`: ```env INPUT_SANITIZER_ENABLED=true INPUT_SANITIZER_MODE=block # warn | block (injektionspolitik; ældre "redact" fjerner ikke injektionstekst) INPUT_SANITIZER_BLOCK_THRESHOLD=high # high (standard) | medium | low — alvorlighedsgrader på eller over denne blokeres i block-tilstand ``` ### 🔒 PII-redigering Automatisk registrering og valgfri redigering af personhenførbare oplysninger: | PII-type | Mønster | Erstatning | | ---------------- | --------------------- | ------------------ | | E-mail | `user@domain.com` | `[EMAIL_REDACTED]` | | CPF (Brasilien) | `123.456.789-00` | `[CPF_REDACTED]` | | CNPJ (Brasilien) | `12.345.678/0001-00` | `[CNPJ_REDACTED]` | | Kreditkort | `4111-1111-1111-1111` | `[CC_REDACTED]` | | Telefon | `+55 11 99999-9999` | `[PHONE_REDACTED]` | | SSN (USA) | `123-45-6789` | `[SSN_REDACTED]` | ```env PII_REDACTION_ENABLED=true # anmod om omskrivning af PII; uafhængigt af INPUT_SANITIZER_MODE PII_RESPONSE_SANITIZATION=true # valgfrit: rediger PII i udbydersvar, der returneres til klienter ``` ### 🌐 Netværkssikkerhed | Funktion | Beskrivelse | | ----------------------------------- | ------------------------------------------------------------------------------------------------------- | | **CORS** | Eksplicit liste over tilladte origins på tværs af domæner (`CORS_ALLOWED_ORIGINS`; ældre `CORS_ORIGIN`) | | **IP-filtrering** | Liste over tilladte/blokerede IP-intervaller i kontrolpanelet | | **Hastighedsbegrænsning** | Hastighedsgrænser pr. udbyder med automatisk backoff | | **Beskyttelse mod Thundering Herd** | Mutex + låsning pr. forbindelse forhindrer kaskader af 502-fejl | | **TLS-fingeraftryk** | Efterligning af browserlignende TLS-fingeraftryk for at reducere botregistrering | | **CLI-fingeraftryk** | Rækkefølge af headers/brødtekst pr. udbyder, så de matcher oprindelige CLI-signaturer | ### 🔌 Robusthed og tilgængelighed | Funktion | Beskrivelse | | ------------------------------ | ----------------------------------------------------------------- | | **Circuit Breaker** | 3 tilstande (lukket → åben → halvåben) pr. udbyder, gemt i SQLite | | **Idempotens for anmodninger** | 5-sekunders vindue til deduplikering af identiske anmodninger | | **Eksponentiel backoff** | Automatisk nyt forsøg med stigende forsinkelser | | **Sundhedskontrolpanel** | Overvågning af udbydernes status i realtid | ### 📋 Overholdelse | Funktion | Beskrivelse | | ---------------------- | --------------------------------------------------------------- | | **Logopbevaring** | Automatisk oprydning efter `CALL_LOG_RETENTION_DAYS` | | **Fravalg af logning** | `noLog`-flag pr. API-nøgle deaktiverer logning af anmodninger | | **Revisionslog** | Administrative handlinger registreres i tabellen `audit_log` | | **MCP-revision** | SQLite-baseret revisionslogning af alle MCP-værktøjskald | | **Zod-validering** | Alle API-input valideres med Zod v4-skemaer ved modulindlæsning | --- ## Påkrævede miljøvariabler Alle hemmeligheder skal være angivet, før serveren startes. Serveren vil **stoppe med det samme**, hvis de mangler eller er svage. ```bash # PÅKRÆVET — serveren starter ikke uden disse: JWT_SECRET=$(openssl rand -base64 48) # mindst 32 tegn API_KEY_SECRET=$(openssl rand -hex 32) # mindst 16 tegn # ANBEFALET — muliggør kryptering af lagrede data: STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32) ``` Serveren afviser aktivt kendte svage værdier som `changeme`, `secret` eller `password`. --- ## Docker-sikkerhed - Brug en bruger uden root-rettigheder i produktion - Montér hemmeligheder som skrivebeskyttede diskenheder - Kopiér aldrig `.env`-filer ind i Docker-images - Brug `.dockerignore` til at udelukke følsomme filer - Angiv `AUTH_COOKIE_SECURE=true`, når serveren er placeret bag HTTPS ```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 ``` --- ## Afhængigheder - Kør `npm audit` regelmæssigt (`npm run audit:deps` dækker main + electron) - Hold afhængigheder opdaterede - Projektet bruger `husky` + `lint-staged` til kontroller før commits (lint-staged + check-docs-sync + check:any-budget:t11) - CI-pipelinen kører ESLint-sikkerhedsregler ved hvert push (`no-eval`, `no-implied-eval`, `no-new-func` = fejl) - Udbyderkonstanter valideres ved modulindlæsning via Zod (`src/shared/validation/schemas.ts`) - Der anvendes biblioteker, som er sikre som standard: `dompurify` / `isomorphic-dompurify` (XSS), `jose` (JWT), `better-sqlite3` (ingen SQLi-risiko takket være parameteriserede forespørgsler), `bcryptjs` (hashing af adgangskoder) ## Ufravigelige sikkerhedsregler Disse regler håndhæves af værktøjer og reviewere: 1. **Commit aldrig hemmeligheder** — `.env` ignoreres af git; `.env.example` er skabelonen (ingen literalværdier, kun kommentarer — se PUBLIC_CREDS.md nedenfor) 2. **Brug aldrig `eval()`, `new Function()` eller implicit eval** — dette håndhæves af ESLint 3. **Omgå aldrig Husky-hooks** (`--no-verify`, `--no-gpg-sign`) uden udtrykkelig godkendelse fra operatøren 4. **Skriv aldrig rå SQL i routes** — gå altid gennem `src/lib/db/` (parameteriseret) 5. **Validér altid input med Zod** — `src/shared/validation/schemas.ts` 6. **Rens altid upstream-headere** — afvisningsliste i `src/shared/constants/upstreamHeaders.ts` 7. **Kryptér legitimationsoplysninger i hvile** — AES-256-GCM via `src/lib/db/encryption.ts` 8. **Offentlige upstream OAuth-identifikatorer via `resolvePublicCred()`** — indlejr aldrig literalværdier som `AIza…` / `GOCSPX-…` / `…apps.googleusercontent.com` i kildekoden. Se [`docs/security/PUBLIC_CREDS.md`](docs/security/PUBLIC_CREDS.md). 9. **Fejlsvar gennem `buildErrorBody()` / `sanitizeErrorMessage()`** — medtag aldrig rå `err.stack` / `err.message` i HTTP- / SSE- / executor- / MCP-svartekster. Se [`docs/security/ERROR_SANITIZATION.md`](docs/security/ERROR_SANITIZATION.md). 10. **Kørselsværdier for `exec()` / `spawn()` via indstillingen `env`** — interpolér aldrig eksterne stier eller upålidelige værdier som strenge i scripts, der videregives til en shell. Reference: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **Foretræk biblioteker, som er sikre som standard** — se [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Brug dem frem for at udvikle din egen løsning. ## Resultater fra forsyningskædescannere (Socket.dev / Snyk / lignende) > **Bemærkning om omfang:** `socket.yml` i repositoryets rod konfigurerer kun `projectIgnorePaths` for Socket.devs post-publish-scanning på registreringssiden af den publicerede npm-artefakt — den fungerer ikke som en obligatorisk CI/PR-fletningskontrol. Ingen workflow i `.github/workflows`, intet `package.json`-script og intet `Makefile`-target kalder Socket.dev. Den publicerede `omniroute`-npm-artefakt indeholder Next.js-buildet med `output: "standalone"`, hvilket betyder, at alle route handlers — herunder dokumenterede privilegerede funktioner (MITM, Zed-import, Cloud Sync og integreret tjeneste-supervisor) — ender i minificerede chunks i `.next/server/*.js`. Heuristiske forsyningskædescannere matcher ofte mønstre i disse chunks med malwaresignaturer. Den scannerkonfiguration, vi bruger, findes i [`socket.yml`](socket.yml) i repositoryets rod (Socket.dev GitHub App-format v2 — se ). Den udelukker eksplicit mapper, som ikke distribueres (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/` osv.), så scanneren kun rapporterer kodeveje, der rent faktisk når ud til brugere af den publicerede pakke — selve scanningen udføres af Socket GitHub App, som læser denne fil, ikke af et workflow i dette repository. For hver resultatkategori vedligeholder vi en attestering fra vedligeholderne for hvert enkelt resultat: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — kortlægning pr. resultat: kildefil ↔ markeret chunk ↔ adfærd ↔ afhjælpning anvendt i v3.8.6. - `SECURITY-AUDITOR-NOTE:`-blokke i kildekoden ved hver markeret funktion henviser til det samme dokument. Brugere, hvis pipeline ikke kan lempe advarslen, kan bygge med `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Dette erstatter de fire følsomme moduler med stubs, der returnerer HTTP 503 `feature-disabled` under kørsel, så de privilegerede kodeveje fysisk ikke findes i bundtet. Se [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) for publiceringsopskriften. ## Referencer - [`docs/architecture/AUTHZ_GUIDE.md`](docs/architecture/AUTHZ_GUIDE.md) — autorisationspipeline - [`docs/security/GUARDRAILS.md`](docs/security/GUARDRAILS.md) — framework til sikkerhedsforanstaltninger - [`docs/security/COMPLIANCE.md`](docs/security/COMPLIANCE.md) — revisionslog og opbevaring - [`docs/security/PUBLIC_CREDS.md`](docs/security/PUBLIC_CREDS.md) — **obligatorisk** mønster for offentlige upstream-legitimationsoplysninger - [`docs/security/ERROR_SANITIZATION.md`](docs/security/ERROR_SANITIZATION.md) — **obligatorisk** mønster for fejlsvar - [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) — attestering fra vedligeholderne vedrørende resultater fra forsyningskædescannere - [`docs/architecture/RESILIENCE_GUIDE.md`](docs/architecture/RESILIENCE_GUIDE.md) — kredsløbsafbryder + nedkølingsperiode + spærring - [`docs/security/STEALTH_GUIDE.md`](docs/security/STEALTH_GUIDE.md) — TLS-fingeraftryk (juridisk/etisk meddelelse) - [`CLAUDE.md`](CLAUDE.md) — ufravigelige regler for AI-agenter - [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) — kuraterede biblioteker med sikre standardindstillinger