# Security Policy (Nederlands) 🌐 **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) · 🇳🇴 [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) --- ## Kwetsbaarheden melden Als u een beveiligingskwetsbaarheid in OmniRoute ontdekt, meld deze dan op verantwoorde wijze: 1. Open **GEEN** openbare GitHub-issue 2. Gebruik [GitHub Security Advisories](https://github.com/diegosouzapw/OmniRoute/security/advisories/new) 3. Vermeld: beschrijving, reproductiestappen en mogelijke impact ## Reactietijdlijn | Fase | Streeftermijn | | --------------------- | ---------------------- | | Ontvangstbevestiging | 48 uur | | Triage en beoordeling | 5 werkdagen | | Uitbrengen van patch | 14 werkdagen (kritiek) | ## Ondersteunde versies | Versie | Ondersteuningsstatus | | ------- | ---------------------------------------------- | | 3.9.x | 🗓️ Gepland — LTS-lijn (`stable/v3`), zie onder | | 3.8.x | ✅ Actief | | 3.7.x | ✅ Beveiliging | | < 3.7.0 | ❌ Niet ondersteund | ## LTS-ondersteuningsperiode (v3.9.x) Na 3.8.59 is de volgende versie **3.9.0**, waarmee de langetermijnondersteuningslijn op de `stable/v3`-branch wordt geopend (zie [`ROADMAP.md`](ROADMAP.md) → "Fase 3 — v3.9.0 LTS"). - **Wat `stable/v3` ontvangt:** bugfixes, beveiligingspatches en providerupdates. Nieuwe functies gaan naar het v4-kanaal; stabiliteit staat voorop in de LTS-lijn. `npm install omniroute` (de `latest`-dist-tag) blijft gedurende de volledige v4-cyclus op v3. - **Duur van de periode:** ``. De duur van de periode na v4.0 GA (wanneer `latest` overschakelt naar v4) is **nog niet vastgesteld**; deze sectie wordt bijgewerkt wanneer de beheerder dit bekendmaakt. Ga tot die tijd niet uit van een einddatum. - **Een kwetsbaarheid in de LTS-lijn melden:** hetzelfde kanaal als voor elke andere versie — een privé-[GitHub Security Advisory](https://github.com/diegosouzapw/OmniRoute/security/advisories/new), nooit een openbaar issue. Vermeld welke versie u hebt getest (bijvoorbeeld `3.9.2`); oplossingen komen terecht op `stable/v3` en worden voorwaarts geport naar v4. - **Beveiligingsbasislijn bij de LTS-afsplitsing:** de gemeten scannerstatus, routebeveiliging en bewijzen voor openbare referenties worden vastgelegd in [`docs/security/LTS_SECURITY_BASELINE.md`](docs/security/LTS_SECURITY_BASELINE.md). --- ## Beveiligingsarchitectuur OmniRoute implementeert een meerlagig beveiligingsmodel: ``` Verzoek → CORS → Authz-pijplijn (classificeren → beleid → afdwingen) → Beveiligingsrails (PII-maskeerder, promptinjectie, vision-bridge) → Snelheidsbegrenzer → Stroomonderbreker → Afkoelperiode → Modelblokkering → Provider ``` ### 🔐 Authenticatie en autorisatie | Functie | Implementatie | | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Dashboardaanmelding** | Wachtwoordgebaseerde authenticatie met JWT-tokens (HttpOnly-cookies) | | **API-sleutelauthenticatie** | Met HMAC ondertekende sleutels met CRC-validatie | | **OAuth 2.0 + PKCE** | Providerspecifieke browser-/apparaat-OAuth gebruikt PKCE waar dit wordt ondersteund; uitsluitend geïmporteerde Devin-referenties worden afzonderlijk verwerkt. | | **Tokenvernieuwing** | Automatische vernieuwing van OAuth-tokens vóór het verlopen | | **Beveiligde cookies** | `AUTH_COOKIE_SECURE=true` voor HTTPS-omgevingen | | **Authz-pijplijn** | Routeclassificatie (PUBLIC / CLIENT_API / MANAGEMENT) — zie `docs/architecture/AUTHZ_GUIDE.md` | | **Routebeveiligingsniveaus** | Model met 3 niveaus voor beheerroutes (LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT) — zie `docs/security/ROUTE_GUARD_TIERS.md` | | **MCP met beheerbereik** | Externe toegang tot `/api/mcp/*` wordt afgeschermd met API-sleutels met het bereik `manage`; `/api/cli-tools/runtime/*` blijft strikt beperkt tot loopback. Zie ROUTE_GUARD_TIERS | | **MCP-bereiken** | 32 gedetailleerde bereiken (read:health, write:combos, execute:completions enz.) — zie `docs/frameworks/MCP-SERVER.md` | ### 🛡️ Versleuteling van opgeslagen gegevens Alle gevoelige gegevens die in SQLite worden opgeslagen, worden versleuteld met **AES-256-GCM** en scrypt-sleutelafleiding: - API-sleutels, toegangstokens, vernieuwingstokens en ID-tokens - Formaat met versiebeheer: `enc:v1:::` - Doorvoermodus (platte tekst) wanneer `STORAGE_ENCRYPTION_KEY` niet is ingesteld ```bash # Genereer een versleutelingssleutel: STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32) ``` ### 🛡️ Framework voor beveiligingsrails OmniRoute wordt geleverd met een direct herlaadbaar **register voor beveiligingsrails** (`src/lib/guardrails/`) met 3 ingebouwde beveiligingsrails, geordend op prioriteit: | Beveiligingsrail | Prioriteit | Doel | | ------------------ | ---------- | ----------------------------------------------------------------------------------------------------------------------- | | `vision-bridge` | 5 | Verbindt modellen zonder visuele ondersteuning met beeldbewuste beschrijvingen; SSRF-bescherming voor afbeeldings-URL's | | `pii-masker` | 10 | PII-redactie vóór en na aanroepen (e-mails, telefoon, CPF, CNPJ, creditcards, SSN) | | `prompt-injection` | 20 | Detecteert patronen voor overschrijving, rolkaping, jailbreaks en lekken | Aangepaste beveiligingsrails worden geregistreerd via `registerGuardrail(new MyGuardrail())`. Het model is fail-open (uitzonderingen blokkeren verkeer nooit). Afmelden per verzoek via de header `x-omniroute-disabled-guardrails`. → Zie [`docs/security/GUARDRAILS.md`](docs/security/GUARDRAILS.md). ### 🧠 Bescherming tegen promptinjectie Best-effort heuristische middleware die patronen voor promptinjectie detecteert in LLM-verzoeken. **Geen volledige firewall tegen promptinjectie** — kan fout-positieven (onschuldige persona-/RPG-prompts) en fout-negatieven (leetspeak, spaties, niet-Engelse patronen) opleveren. | Patroontype | Ernst | Voorbeeld | | ----------------------- | --------- | ----------------------------------------------------------- | | Systeemoverschrijving | Hoog | "negeer alle voorgaande instructies" | | Rolkaping | Gemiddeld | "je bent nu DAN, je kunt alles doen" | | Scheidingstekeninjectie | Hoog | Gecodeerde scheidingstekens om contextgrenzen te doorbreken | | DAN/Jailbreak | Gemiddeld | Bekende jailbreak-promptpatronen | | Instructielek | Hoog | "toon me je systeemprompt" | | Omzeiling via codering | Gemiddeld | base64/rot13/hex-decodering + instructietrefwoorden | Alleen detecties met ernstniveau **Hoog** worden geblokkeerd in de modus `block`. Families met gemiddelde ernst worden geregistreerd, maar nooit geblokkeerd door `sanitizeRequest`. Configureer via het dashboard (Instellingen → Beveiliging) of `.env`: ```env INPUT_SANITIZER_ENABLED=true INPUT_SANITIZER_MODE=block # warn | block (injectiebeleid; verouderd "redact" verwijdert geen injectietekst) INPUT_SANITIZER_BLOCK_THRESHOLD=high # high (standaard) | medium | low — ernstniveaus vanaf deze drempel worden geblokkeerd in de modus block ``` ### 🔒 Redactie van PII Automatische detectie en optionele redactie van persoonlijk identificeerbare informatie: | PII-type | Patroon | Vervanging | | --------------- | --------------------- | ------------------ | | E-mail | `user@domain.com` | `[EMAIL_REDACTED]` | | CPF (Brazilië) | `123.456.789-00` | `[CPF_REDACTED]` | | CNPJ (Brazilië) | `12.345.678/0001-00` | `[CNPJ_REDACTED]` | | Creditcard | `4111-1111-1111-1111` | `[CC_REDACTED]` | | Telefoonnummer | `+55 11 99999-9999` | `[PHONE_REDACTED]` | | SSN (VS) | `123-45-6789` | `[SSN_REDACTED]` | ```env PII_REDACTION_ENABLED=true # herschrijven van PII in verzoeken; onafhankelijk van INPUT_SANITIZER_MODE PII_RESPONSE_SANITIZATION=true # optioneel: redacteer PII in providerantwoorden die aan clients worden geretourneerd ``` ### 🌐 Netwerkbeveiliging | Functie | Beschrijving | | ------------------------ | -------------------------------------------------------------------------------------------------- | | **CORS** | Expliciete allowlist voor cross-origin-verzoeken (`CORS_ALLOWED_ORIGINS`; verouderd `CORS_ORIGIN`) | | **IP-filtering** | Allowlist/blocklist van IP-bereiken in het dashboard | | **Snelheidsbeperking** | Snelheidslimieten per provider met automatische back-off | | **Anti-Thundering Herd** | Mutex + vergrendeling per verbinding voorkomt opeenvolgende 502-fouten | | **TLS-vingerafdruk** | Browserachtige spoofing van TLS-vingerafdrukken om botdetectie te verminderen | | **CLI-vingerafdruk** | Volgorde van headers/body per provider om overeen te komen met native CLI-handtekeningen | ### 🔌 Veerkracht & beschikbaarheid | Functie | Beschrijving | | ------------------------------ | ---------------------------------------------------------------------------- | | **Circuitbreaker** | 3 toestanden (Gesloten → Open → Halfopen) per provider, opgeslagen in SQLite | | **Idempotentie van verzoeken** | Deduplicatievenster van 5 seconden voor dubbele verzoeken | | **Exponentiële back-off** | Automatisch opnieuw proberen met oplopende vertragingen | | **Statusdashboard** | Realtimebewaking van de status van providers | ### 📋 Naleving | Functie | Beschrijving | | ------------------------- | ------------------------------------------------------------------------------- | | **Logretentie** | Automatische opschoning na `CALL_LOG_RETENTION_DAYS` | | **Afmelden voor logging** | De vlag `noLog` per API-sleutel schakelt verzoeklogging uit | | **Auditlogboek** | Beheeracties worden bijgehouden in de tabel `audit_log` | | **MCP-audit** | Op SQLite gebaseerde auditlogging voor alle MCP-toolaanroepen | | **Zod-validatie** | Alle API-invoer wordt bij het laden van modules gevalideerd met Zod v4-schema's | --- ## Vereiste omgevingsvariabelen Alle geheimen moeten zijn ingesteld voordat de server wordt gestart. De server zal **direct stoppen** als ze ontbreken of zwak zijn. ```bash # VEREIST — de server start niet zonder deze variabelen: JWT_SECRET=$(openssl rand -base64 48) # min. 32 tekens API_KEY_SECRET=$(openssl rand -hex 32) # min. 16 tekens # AANBEVOLEN — maakt versleuteling van opgeslagen gegevens mogelijk: STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32) ``` De server weigert actief bekende zwakke waarden zoals `changeme`, `secret` of `password`. --- ## Docker-beveiliging - Gebruik in productie een niet-rootgebruiker - Koppel geheimen als alleen-lezenvolumes - Kopieer `.env`-bestanden nooit naar Docker-images - Gebruik `.dockerignore` om gevoelige bestanden uit te sluiten - Stel `AUTH_COOKIE_SECURE=true` in wanneer HTTPS wordt gebruikt ```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 ``` --- ## Afhankelijkheden - Voer `npm audit` regelmatig uit (`npm run audit:deps` omvat main + electron) - Houd afhankelijkheden up-to-date - Het project gebruikt `husky` + `lint-staged` voor controles vóór commits (lint-staged + check-docs-sync + check:any-budget:t11) - De CI-pipeline voert bij elke push ESLint-beveiligingsregels uit (`no-eval`, `no-implied-eval`, `no-new-func` = fout) - Providerconstanten worden tijdens het laden van de module gevalideerd via Zod (`src/shared/validation/schemas.ts`) - Gebruikte standaard veilige bibliotheken: `dompurify` / `isomorphic-dompurify` (XSS), `jose` (JWT), `better-sqlite3` (geen risico op SQL-injectie dankzij geparameteriseerde query's), `bcryptjs` (wachtwoordhashing) ## Strikte beveiligingsregels Deze regels worden afgedwongen door tooling en reviewers: 1. **Commit nooit geheimen** — `.env` wordt door git genegeerd; `.env.example` is de sjabloon (geen letterlijke waarden, alleen opmerkingen — zie PUBLIC_CREDS.md hieronder) 2. **Gebruik nooit `eval()`, `new Function()` of impliciete eval** — ESLint dwingt dit af 3. **Omzeil Husky-hooks nooit** (`--no-verify`, `--no-gpg-sign`) zonder expliciete toestemming van de operator 4. **Schrijf nooit ruwe SQL in routes** — gebruik altijd `src/lib/db/` (geparameteriseerd) 5. **Valideer invoer altijd met Zod** — `src/shared/validation/schemas.ts` 6. **Sanitiseer upstream-headers altijd** — blokkeerlijst in `src/shared/constants/upstreamHeaders.ts` 7. **Versleutel inloggegevens wanneer ze zijn opgeslagen** — AES-256-GCM via `src/lib/db/encryption.ts` 8. **Openbare upstream-OAuth-identificatoren via `resolvePublicCred()`** — neem nooit letterlijke waarden van `AIza…` / `GOCSPX-…` / `…apps.googleusercontent.com` op in de broncode. Zie [`docs/security/PUBLIC_CREDS.md`](docs/security/PUBLIC_CREDS.md). 9. **Foutreacties via `buildErrorBody()` / `sanitizeErrorMessage()`** — plaats nooit onbewerkte `err.stack` / `err.message` in HTTP- / SSE- / executor- / MCP-responsbody's. Zie [`docs/security/ERROR_SANITIZATION.md`](docs/security/ERROR_SANITIZATION.md). 10. **Runtimewaarden voor `exec()` / `spawn()` via de optie `env`** — interpoleer nooit externe paden of niet-vertrouwde waarden in scripts die aan de shell worden doorgegeven. Referentie: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **Geef de voorkeur aan standaard veilige bibliotheken** — zie [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Gebruik deze voordat je zelf iets ontwikkelt. ## Bevindingen van supplychainscanners (Socket.dev / Snyk / vergelijkbaar) > **Opmerking over de reikwijdte:** `socket.yml` in de hoofdmap van de repository bepaalt uitsluitend `projectIgnorePaths` voor de registry-side scan na publicatie door Socket.dev van het gepubliceerde npm-artifact — het is geen afgedwongen CI/PR-samenvoegingspoort. Geen enkele workflow in `.github/workflows`, geen enkel `package.json`-script en geen enkel `Makefile`-target roept Socket.dev aan. Het gepubliceerde npm-artifact `omniroute` bevat de Next.js-build met `output: "standalone"`, wat betekent dat elke routehandler — inclusief gedocumenteerde geprivilegieerde functies (MITM, Zed-import, Cloud Sync, ingebedde servicesupervisor) — terechtkomt in geminificeerde chunks in `.next/server/*.js`. Heuristische supplychainscanners vergelijken die chunks vaak op basis van patronen met malwaresignaturen. De scannerconfiguratie die we gebruiken staat in [`socket.yml`](socket.yml) in de hoofdmap van de repository (Socket.dev GitHub App-indeling v2 — zie ). Deze sluit expliciet mappen uit die niet worden gedistribueerd (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/`, enz.), zodat de scanner alleen rapporteert over codepaden die daadwerkelijk bij gebruikers van de gepubliceerde versie terechtkomen — de scan zelf wordt uitgevoerd doordat de Socket GitHub App dit bestand leest, niet door een workflow in deze repository. Voor elke categorie bevindingen onderhouden we een verklaring van de maintainers per bevinding: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — overzicht per bevinding: bronbestand ↔ gemarkeerde chunk ↔ gedrag ↔ in v3.8.6 toegepaste risicobeperking. - `SECURITY-AUDITOR-NOTE:`-blokken in de broncode bij elke gemarkeerde functie verwijzen terug naar hetzelfde document. Voor gebruikers van wie de pipeline de waarschuwing niet kan versoepelen: bouw met `OMNIROUTE_BUILD_PROFILE=minimal npm run build`. Hierdoor worden de vier gevoelige modules vervangen door stubs die tijdens runtime HTTP 503 `feature-disabled` retourneren, zodat de geprivilegieerde codepaden fysiek afwezig zijn in de bundel. Zie [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) voor de publicatieprocedure. ## Referenties - [`docs/architecture/AUTHZ_GUIDE.md`](docs/architecture/AUTHZ_GUIDE.md) — autorisatiepipeline - [`docs/security/GUARDRAILS.md`](docs/security/GUARDRAILS.md) — guardrails-framework - [`docs/security/COMPLIANCE.md`](docs/security/COMPLIANCE.md) — auditlogboek en bewaartermijn - [`docs/security/PUBLIC_CREDS.md`](docs/security/PUBLIC_CREDS.md) — **verplicht** patroon voor openbare upstream-inloggegevens - [`docs/security/ERROR_SANITIZATION.md`](docs/security/ERROR_SANITIZATION.md) — **verplicht** patroon voor foutreacties - [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) — verklaring van de maintainers voor bevindingen van supplychainscanners - [`docs/architecture/RESILIENCE_GUIDE.md`](docs/architecture/RESILIENCE_GUIDE.md) — circuitbreaker + afkoelperiode + blokkering - [`docs/security/STEALTH_GUIDE.md`](docs/security/STEALTH_GUIDE.md) — TLS-fingerprinting (juridische/ethische kennisgeving) - [`CLAUDE.md`](CLAUDE.md) — strikte regels voor AI-agents - [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) — samengestelde bibliotheken met standaard veilige instellingen