Skip to content

Latest commit

 

History

History
271 lines (204 loc) · 21.5 KB

SECURITY.md

File metadata and controls

271 lines (204 loc) · 21.5 KB

Security Policy (Nederlands)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇧🇦 bs · 🇨🇿 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 · 🇳🇴 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


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
  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 lijn voor langdurige ondersteuning op de stable/v3-branch wordt geopend (zie ROADMAP.md → "Fase 3 — v3.9.0 LTS").

  • Wat stable/v3 ontvangt: bugfixes, beveiligingspatches en providerupdates. Nieuwe functies gaan naar het v4-kanaal; bij de LTS-lijn staat stabiliteit voorop. npm install omniroute (de latest dist-tag) blijft gedurende de volledige v4-cyclus op v3.
  • Duur van de periode: stable/v3 ontvangt beveiligingsoplossingen en oplossingen voor kritieke regressies gedurende 12 maanden na de release van 3.9.0, of tot 90 dagen nadat v4.0.0 als latest is gepubliceerd — afhankelijk van welke datum later valt. De resulterende einddatum wordt bij de release vastgelegd in de releaseopmerkingen van 3.9.0 en in ROADMAP.md.
  • Een kwetsbaarheid in de LTS-lijn melden: via hetzelfde kanaal als voor elke andere versie — een privé-GitHub Security Advisory, nooit een openbare issue. Vermeld welke versie u hebt getest (bijvoorbeeld 3.9.2); oplossingen worden toegepast op stable/v3 en voorwaarts geporteerd naar v4.
  • Beveiligingsbasislijn bij de LTS-release: de gemeten scannerstatus en het bewijs voor routebeveiliging en openbare aanmeldgegevens worden vastgelegd in 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:<iv>:<ciphertext>:<authTag>
  • Doorvoermodus (platte tekst) wanneer STORAGE_ENCRYPTION_KEY niet is ingesteld
# 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.

🧠 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:

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]
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.

# 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
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.
  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.
  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 (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 in de hoofdmap van de repository (Socket.dev GitHub App-indeling v2 — zie https://docs.socket.dev/docs/socket-yml). 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 — 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 voor de publicatieprocedure.

Referenties