Skip to content

Latest commit

 

History

History
250 lines (186 loc) · 20.2 KB

SECURITY.md

File metadata and controls

250 lines (186 loc) · 20.2 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 openbaar GitHub-issue
  2. Gebruik GitHub Security Advisories
  3. Vermeld: beschrijving, reproductiestappen en mogelijke impact

Reactietijdlijn

Fase Streeftijd
Ontvangstbevestiging 48 uur
Triage en beoordeling 5 werkdagen
Patchrelease 14 werkdagen (kritiek)

Ondersteunde versies

Versie Ondersteuningsstatus
3.8.x ✅ Actief
3.7.x ✅ Beveiliging
< 3.7.0 ❌ Niet ondersteund

Beveiligingsarchitectuur

OmniRoute implementeert een meerlagig beveiligingsmodel:

Verzoek → CORS → Authz-pijplijn (classificeren → beleidsregels → afdwingen)
        → Beveiligingsmechanismen (PII-maskering, promptinjectie, vision-bridge)
        → Snelheidsbegrenzer → Stroomonderbreker → Afkoelperiode → Modelblokkering → Provider

🔐 Authenticatie en autorisatie

Functie Implementatie
Dashboardaanmelding Authenticatie op basis van een wachtwoord met JWT-tokens (HttpOnly-cookies)
API-sleutelauthenticatie Met HMAC ondertekende sleutels met CRC-validatie
OAuth 2.0 + PKCE Provider-specifieke OAuth via browser/apparaat 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 fijnmazige 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 sleutelafleiding via scrypt:

  • API-sleutels, toegangstokens, vernieuwingstokens en ID-tokens
  • Formaat met versieaanduiding: enc:v1:<iv>:<ciphertext>:<authTag>
  • Passthrough-modus (platte tekst) wanneer STORAGE_ENCRYPTION_KEY niet is ingesteld
# Genereer een versleutelingssleutel:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)

🛡️ Framework voor beveiligingsmechanismen

OmniRoute wordt geleverd met een tijdens runtime herlaadbaar register voor beveiligingsmechanismen (src/lib/guardrails/) met 3 ingebouwde beveiligingsmechanismen, gerangschikt op prioriteit:

Beveiligingsmechanisme Prioriteit Doel
vision-bridge 5 Verbindt modellen zonder beeldondersteuning met beeldbewuste beschrijvingen; SSRF-bescherming voor afbeeldings-URL's
pii-masker 10 PII-redactie vóór en na aanroepen (e-mails, telefoonnummers, CPF, CNPJ, creditcards, SSN)
prompt-injection 20 Detecteert patronen voor overschrijving, rolkaping, jailbreaks en lekken

Aangepaste beveiligingsmechanismen worden geregistreerd via registerGuardrail(new MyGuardrail()). Het model is fail-open (uitzonderingen blokkeren nooit verkeer). Afmelden per verzoek kan via de header x-omniroute-disabled-guardrails. → Zie docs/security/GUARDRAILS.md.

🧠 Bescherming tegen promptinjectie

Best-effort heuristische middleware die promptinjectiepatronen in LLM-verzoeken detecteert. Geen volledige firewall tegen promptinjectie — kan fout-positieve resultaten (onschuldige persona-/RPG-prompts) en fout-negatieve resultaten (leetspeak, spatiëring, niet-Engelse patronen) produceren.

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 mij je systeemprompt"
Omzeiling via codering Gemiddeld base64/rot13/hex-decodering + instructietrefwoorden

Alleen detecties met de ernst Hoog worden in de modus block geblokkeerd. Families met gemiddelde ernst worden geregistreerd, maar nooit door sanitizeRequest geblokkeerd.

Configureer dit via het dashboard (Instellingen → Beveiliging) of .env:

INPUT_SANITIZER_ENABLED=true
INPUT_SANITIZER_MODE=block    # warn | block (injectiebeleid; het verouderde "redact" verwijdert geen injectietekst)
INPUT_SANITIZER_BLOCK_THRESHOLD=high  # high (standaard) | medium | low — ernstniveaus op of boven deze drempel worden in de block-modus geblokkeerd

🔒 PII-redactie

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 aanvragen; onafhankelijk van INPUT_SANITIZER_MODE
PII_RESPONSE_SANITIZATION=true  # optioneel: PII redigeren in providerreacties die aan clients worden geretourneerd

🌐 Netwerkbeveiliging

Functie Beschrijving
CORS Expliciete acceptatielijst voor cross-origin-verzoeken (CORS_ALLOWED_ORIGINS; verouderd: CORS_ORIGIN)
IP-filtering IP-bereiken op de acceptatie- of blokkeerlijst in het dashboard
Snelheidsbegrenzing Snelheidslimieten per provider met automatische back-off
Bescherming tegen thundering herd Mutex + vergrendeling per verbinding voorkomt opeenvolgende 502-fouten
TLS-fingerprint Spoofing van browserachtige TLS-fingerprints om botdetectie te verminderen
CLI-fingerprint Volgorde van headers/body per provider om overeen te komen met systeemeigen CLI-signaturen

🔌 Veerkracht en beschikbaarheid

Functie Beschrijving
Circuitonderbreker 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
Logbewaring 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 aanroepen van MCP-tools
Zod-validatie Alle API-invoer wordt bij het laden van de module gevalideerd met Zod v4-schema's

Vereiste omgevingsvariabelen

Alle geheimen moeten worden 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)     # minimaal 32 tekens
API_KEY_SECRET=$(openssl rand -hex 32)    # minimaal 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 nooit .env-bestanden 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 regelmatig npm audit uit (npm run audit:deps controleert main + electron)
  • Houd afhankelijkheden up-to-date
  • Het project gebruikt husky + lint-staged voor pre-commitcontroles (lint-staged + check-docs-sync + check:any-budget:t11)
  • De CI-pipeline voert bij elke push de ESLint-beveiligingsregels uit (no-eval, no-implied-eval, no-new-func = fout)
  • Providerconstanten worden bij het laden van de module gevalideerd via Zod (src/shared/validation/schemas.ts)
  • Gebruikte standaard beveiligde bibliotheken: dompurify / isomorphic-dompurify (XSS), jose (JWT), better-sqlite3 (geen SQLi-risico dankzij geparametriseerde query's), bcryptjs (wachtwoordhashing)

Strikte beveiligingsregels

Deze regels worden door tooling en reviewers afgedwongen:

  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 nooit Husky-hooks (--no-verify, --no-gpg-sign) zonder uitdrukkelijke goedkeuring van de operator
  4. Schrijf nooit onbewerkte SQL in routes — werk altijd via src/lib/db/ (geparametriseerd)
  5. Valideer invoer altijd met Zod — src/shared/validation/schemas.ts
  6. Saniteer upstream-headers altijd — blokkeerlijst in src/shared/constants/upstreamHeaders.ts
  7. Versleutel opgeslagen inloggegevens — AES-256-GCM via src/lib/db/encryption.ts
  8. Openbare upstream-OAuth-identificatiegegevens via resolvePublicCred() — neem nooit letterlijke waarden als AIza… / GOCSPX-… / …apps.googleusercontent.com op in de broncode. Zie docs/security/PUBLIC_CREDS.md.
  9. Foutresponses via buildErrorBody() / sanitizeErrorMessage() — plaats nooit onbewerkte err.stack / err.message in HTTP- / SSE- / executor- / MCP-responsebodies. Zie docs/security/ERROR_SANITIZATION.md.
  10. Runtimewaarden voor exec() / spawn() via de optie env — interpoleer externe paden of niet-vertrouwde waarden nooit als tekenreeks in scripts die via de shell worden uitgevoerd. Referentie: src/mitm/cert/install.ts::updateNssDatabases.
  11. Geef de voorkeur aan standaard beveiligde bibliotheken — zie tldrsec/awesome-secure-defaults (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Gebruik deze voordat je zelf een oplossing ontwikkelt.

Bevindingen van de supplychainscanner (Socket.dev / Snyk / vergelijkbaar)

Opmerking over het bereik: socket.yml in de hoofdmap van de repository bepaalt alleen projectIgnorePaths voor de registryscan van Socket.dev die na publicatie wordt uitgevoerd op het gepubliceerde npm-artifact — het is geen afgedwongen blokkade voor CI/PR-merges. 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 functies met verhoogde bevoegdheden (MITM, Zed-import, Cloud Sync, geïntegreerde servicesupervisor) — terechtkomt in geminificeerde chunks onder .next/server/*.js. Heuristische supplychainscanners vergelijken die chunks vaak op basis van patronen met malwaresignaturen.

De scannerconfiguratie die we gebruiken, bevindt zich in socket.yml in de hoofdmap van de repository (Socket.dev GitHub App-indeling v2 — zie https://docs.socket.dev/docs/socket-yml). Deze configuratie 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 het gepubliceerde pakket terechtkomen — de scan zelf wordt aangestuurd doordat de Socket GitHub App dit bestand leest, niet door een workflow in deze repository.

Voor elke bevindingcategorie onderhouden we een verklaring van de beheerders per bevinding:

  • docs/security/SOCKET_DEV_FINDINGS.md — overzicht per bevinding: bronbestand ↔ gemarkeerde chunk ↔ gedrag ↔ toegepaste risicobeperking in v3.8.6.
  • SECURITY-AUDITOR-NOTE:-blokken in de broncode verwijzen bij elke gemarkeerde functie terug naar hetzelfde document.

Voor gebruikers van wie de pipeline de waarschuwing niet kan versoepelen: bouw met OMNIROUTE_BUILD_PROFILE=minimal npm run build. Hiermee worden de vier gevoelige modules vervangen door stubs die tijdens runtime HTTP 503 feature-disabled retourneren, zodat de codepaden met verhoogde bevoegdheden fysiek niet in de bundel aanwezig zijn. Zie docs/security/SOCKET_DEV_FINDINGS.md voor de publicatieprocedure.

Referenties