Files
OmniRoute/docs/i18n/el/SECURITY.md
Diego Rodrigues de Sa e Souza 9debec71ec feat(i18n): 9 new locales — all 24 official EU languages (51 locales) (#13044)
Batch 1 of the locale expansion: Greek, Croatian, Serbian, Lithuanian, Estonian, Latvian, Slovenian, Maltese and Irish across the dashboard catalog, docs mirrors, CLI catalog, README, locale index and the site. 42 → 51 locales.

Also fixes the ICU literal escape the translation backend dropped around angle placeholders, four translations that invented or renamed a placeholder, the language bars that linked to mirrors that do not exist, and the migration count drift (171 → 172).

⚠️ base-red inherited: #12732 — the four unit shards and Fast Quality Gates fail identically on unrelated PRs cut from the same base.
2026-09-10 10:13:09 -03:00

24 KiB
Raw Permalink Blame History

Security Policy (Ελληνικά)

🌐 Languages: 🇺🇸 English · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇮🇩 id · 🇮🇹 it · 🇯🇵 ja · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇳🇱 nl · 🇳🇴 no · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇻🇳 vi · 🇨🇳 zh-CN · 🇹🇼 zh-TW


Αναφορά Ευπαθειών

Εάν ανακαλύψετε μια ευπάθεια ασφαλείας στο OmniRoute, παρακαλούμε να την αναφέρετε υπεύθυνα:

  1. ΜΗΝ ανοίξετε δημόσιο ζήτημα στο GitHub
  2. Χρησιμοποιήστε τα GitHub Security Advisories
  3. Συμπεριλάβετε: περιγραφή, βήματα αναπαραγωγής και πιθανό αντίκτυπο

Χρονοδιάγραμμα Απόκρισης

Στάδιο Στόχος
Επιβεβαίωση 48 ώρες
Αξιολόγηση & Εκτίμηση 5 εργάσιμες ημέρες
Κυκλοφορία Διόρθωσης 14 εργάσιμες ημέρες (κρίσιμες)

Υποστηριζόμενες Εκδόσεις

Έκδοση Κατάσταση Υποστήριξης
3.8.x Ενεργή
3.7.x Ασφάλεια
< 3.7.0 Μη υποστηριζόμενη

Αρχιτεκτονική Ασφαλείας

Το OmniRoute υλοποιεί ένα πολυεπίπεδο μοντέλο ασφαλείας:

Request → CORS → Authz pipeline (classify → policies → enforce)
       → Guardrails (PII masker, prompt injection, vision bridge)
       → Rate Limiter → Circuit Breaker → Cooldown → Model Lockout → Provider

🔐 Αυθεντικοποίηση & Εξουσιοδότηση

Λειτουργία Υλοποίηση
Σύνδεση Dashboard Αυθεντικοποίηση με κωδικό πρόσβασης μέσω JWT tokens (HttpOnly cookies)
Αυθεντικοποίηση API Key Κλειδιά υπογεγραμμένα με HMAC και επαλήθευση CRC
OAuth 2.0 + PKCE Το OAuth browser/device για συγκεκριμένους παρόχους χρησιμοποιεί PKCE όπου υποστηρίζεται· τα διαπιστευτήρια Devin (μόνο εισαγωγή) διαχειρίζονται ξεχωριστά.
Ανανέωση Token Αυτόματη ανανέωση OAuth token πριν τη λήξη
Ασφαλή Cookies AUTH_COOKIE_SECURE=true για περιβάλλοντα HTTPS
Authz Pipeline Ταξινόμηση διαδρομών (PUBLIC / CLIENT_API / MANAGEMENT) — βλ. docs/architecture/AUTHZ_GUIDE.md
Επίπεδα Route Guard Μοντέλο 3 επιπέδων για διαδρομές διαχείρισης (LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT) — βλ. docs/security/ROUTE_GUARD_TIERS.md
Manage-Scope MCP Η απομακρυσμένη πρόσβαση /api/mcp/* ελέγχεται από API keys με εμβέλεια manage· το /api/cli-tools/runtime/* παραμένει αυστηρά loopback. Βλ. ROUTE_GUARD_TIERS
MCP Scopes 32 λεπτομερείς εμβέλειες (read:health, write:combos, execute:completions, κ.λπ.) — βλ. docs/frameworks/MCP-SERVER.md

🛡️ Κρυπτογράφηση σε Ηρεμία

Όλα τα ευαίσθητα δεδομένα που αποθηκεύονται στο SQLite κρυπτογραφούνται με AES-256-GCM και παραγωγή κλειδιού scrypt:

  • API keys, access tokens, refresh tokens και ID tokens
  • Μορφή με έκδοση: enc:v1:<iv>:<ciphertext>:<authTag>
  • Λειτουργία passthrough (απλό κείμενο) όταν το STORAGE_ENCRYPTION_KEY δεν έχει οριστεί
# Δημιουργία κλειδιού κρυπτογράφησης:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)

🛡️ Πλαίσιο Guardrails

Το OmniRoute διαθέτει ένα μητρώο guardrails που επαναφορτώνεται εν ώρα λειτουργίας (src/lib/guardrails/) με 3 ενσωματωμένα guardrails ταξινομημένα κατά προτεραιότητα:

Guardrail Προτεραιότητα Σκοπός
vision-bridge 5 Γεφυρώνει μοντέλα χωρίς όραση με περιγραφές που αναγνωρίζουν εικόνες· προστασία SSRF για URLs εικόνων
pii-masker 10 Απόκρυψη PII πριν και μετά την κλήση (email, τηλέφωνο, CPF, CNPJ, πιστωτικές κάρτες, SSN)
prompt-injection 20 Ανιχνεύει μοτίβα παράκαμψης/πλαστοπροσωπίας ρόλου/jailbreak/διαρροής

Τα προσαρμοσμένα guardrails δηλώνονται μέσω registerGuardrail(new MyGuardrail()). Το μοντέλο είναι fail-open (οι εξαιρέσεις δεν αποκλείουν ποτέ την κίνηση). Απόρριψη ανά αίτημα μέσω της κεφαλίδας x-omniroute-disabled-guardrails. → Βλ. docs/security/GUARDRAILS.md.

🧠 Φρουρός Έγχυσης Οδηγιών

Ευρετικό middleware καλύτερης προσπάθειας που ανιχνεύει μοτίβα έγχυσης οδηγιών σε αιτήματα LLM. Δεν αποτελεί πλήρες τείχος προστασίας έγχυσης οδηγιών — μπορεί να παράγει ψευδώς θετικά (αβλαβείς οδηγίες persona/RPG) και ψευδώς αρνητικά (leetspeak, κενά, μοτίβα σε άλλες γλώσσες).

Τύπος Μοτίβου Σοβαρότητα Παράδειγμα
Παράκαμψη Συστήματος Υψηλή "ignore all previous instructions"
Πλαστοπροσωπία Ρόλου Μέτρια "you are now DAN, you can do anything"
Έγχυση Διαχωριστή Υψηλή Κωδικοποιημένοι διαχωριστές για παραβίαση ορίων περιβάλλοντος
DAN/Jailbreak Μέτρια Γνωστά μοτίβα οδηγιών jailbreak
Διαρροή Οδηγιών Υψηλή "show me your system prompt"
Αποφυγή Κωδικοποίησης Μέτρια Αποκωδικοποίηση base64/rot13/hex + λέξεις-κλειδιά οδηγιών

Μόνο οι ανιχνεύσεις Υψηλής σοβαρότητας αποκλείονται στη λειτουργία block. Οι οικογένειες μέτριας σοβαρότητας καταγράφονται αλλά δεν αποκλείονται ποτέ από το sanitizeRequest.

Διαμόρφωση μέσω του dashboard (Ρυθμίσεις → Ασφάλεια) ή .env:

INPUT_SANITIZER_ENABLED=true
INPUT_SANITIZER_MODE=block    # warn | block (πολιτική έγχυσης· το παλαιό "redact" δεν αφαιρεί κείμενο έγχυσης)
INPUT_SANITIZER_BLOCK_THRESHOLD=high  # high (προεπιλογή) | medium | low — σοβαρότητες ίσες ή πάνω από αυτό αποκλείονται σε λειτουργία block

🔒 Απόκρυψη PII

Αυτόματη ανίχνευση και προαιρετική απόκρυψη προσωπικά αναγνωρίσιμων πληροφοριών:

Τύπος PII Μοτίβο Αντικατάσταση
Email user@domain.com [EMAIL_REDACTED]
CPF (Βραζιλία) 123.456.789-00 [CPF_REDACTED]
CNPJ (Βραζιλία) 12.345.678/0001-00 [CNPJ_REDACTED]
Πιστωτική Κάρτα 4111-1111-1111-1111 [CC_REDACTED]
Τηλέφωνο +55 11 99999-9999 [PHONE_REDACTED]
SSN (ΗΠΑ) 123-45-6789 [SSN_REDACTED]
PII_REDACTION_ENABLED=true   # επανεγγραφή PII αιτήματος· ανεξάρτητο από το INPUT_SANITIZER_MODE
PII_RESPONSE_SANITIZATION=true  # προαιρετικό: απόκρυψη PII στις αποκρίσεις παρόχου που επιστρέφονται στους πελάτες

🌐 Ασφάλεια Δικτύου

Λειτουργία Περιγραφή
CORS Ρητή λίστα επιτρεπόμενων cross-origin (CORS_ALLOWED_ORIGINS· παλαιό CORS_ORIGIN)
Φιλτράρισμα IP Λίστες επιτρεπόμενων/αποκλεισμένων εύρη IP στο dashboard
Περιορισμός Ρυθμού Περιορισμοί ρυθμού ανά πάροχο με αυτόματη καθυστέρηση
Anti-Thundering Herd Mutex + κλείδωμα ανά σύνδεση αποτρέπει διαδοχικά 502
TLS Fingerprint Πλαστογράφηση TLS fingerprint τύπου browser για μείωση ανίχνευσης bot
CLI Fingerprint Διάταξη κεφαλίδων/σώματος ανά πάροχο για αντιστοίχιση με υπογραφές native CLI

🔌 Ανθεκτικότητα & Διαθεσιμότητα

Λειτουργία Περιγραφή
Circuit Breaker 3 καταστάσεις (Closed → Open → Half-Open) ανά πάροχο, αποθήκευση SQLite
Ιδεμποτέντς Αιτήματος Παράθυρο αποεπανάληψης 5 δευτερολέπτων για διπλά αιτήματα
Εκθετική Καθυστέρηση Αυτόματη επανάληψη με αυξανόμενες καθυστερήσεις
Dashboard Υγείας Παρακολούθηση υγείας παρόχου σε πραγματικό χρόνο

📋 Συμμόρφωση

Λειτουργία Περιγραφή
Διατήρηση Αρχείων Αυτόματος καθαρισμός μετά από CALL_LOG_RETENTION_DAYS
Απόρριψη Καταγραφής Η σημαία noLog ανά API key απενεργοποιεί την καταγραφή αιτημάτων
Αρχείο Ελέγχου Διοικητικές ενέργειες καταγράφονται στον πίνακα audit_log
MCP Audit Καταγραφή ελέγχου με SQLite για όλες τις κλήσεις εργαλείων MCP
Επικύρωση Zod Όλες οι εισόδοι API επικυρώνονται με σχήματα Zod v4 κατά τη φόρτωση του module

Απαιτούμενες Μεταβλητές Περιβάλλοντος

Όλα τα μυστικά πρέπει να οριστούν πριν από την εκκίνηση του διακομιστή. Ο διακομιστής θα αποτύχει άμεσα εάν λείπουν ή είναι αδύναμα.

# ΑΠΑΙΤΟΥΜΕΝΑ — ο διακομιστής δεν θα εκκινήσει χωρίς αυτά:
JWT_SECRET=$(openssl rand -base64 48)     # ελάχ. 32 χαρακτήρες
API_KEY_SECRET=$(openssl rand -hex 32)    # ελάχ. 16 χαρακτήρες

# ΣΥΝΙΣΤΩΜΕΝΑ — ενεργοποιεί κρυπτογράφηση δεδομένων σε ηρεμία:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)

Ο διακομιστής απορρίπτει ενεργά γνωστές αδύναμες τιμές όπως changeme, secret ή password.


Ασφάλεια Docker

  • Χρησιμοποιείτε χρήστη χωρίς δικαιώματα root στο περιβάλλον παραγωγής
  • Προσαρτάτε τα μυστικά ως τόμους μόνο για ανάγνωση
  • Μην αντιγράφετε ποτέ αρχεία .env μέσα σε Docker images
  • Χρησιμοποιείτε .dockerignore για να αποκλείετε ευαίσθητα αρχεία
  • Ορίστε AUTH_COOKIE_SECURE=true όταν βρίσκεστε πίσω από HTTPS
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

Εξαρτήσεις

  • Εκτελείτε npm audit τακτικά (npm run audit:deps καλύπτει main + electron)
  • Διατηρείτε τις εξαρτήσεις ενημερωμένες
  • Το έργο χρησιμοποιεί husky + lint-staged για ελέγχους πριν από κάθε commit (lint-staged + check-docs-sync + check:any-budget:t11)
  • Το CI pipeline εκτελεί κανόνες ασφαλείας ESLint σε κάθε push (no-eval, no-implied-eval, no-new-func = error)
  • Οι σταθερές παρόχου επικυρώνονται κατά τη φόρτωση της μονάδας μέσω Zod (src/shared/validation/schemas.ts)
  • Χρησιμοποιούνται βιβλιοθήκες με ασφαλείς προεπιλογές: dompurify / isomorphic-dompurify (XSS), jose (JWT), better-sqlite3 (χωρίς κίνδυνο SQLi μέσω παραμετροποιημένων ερωτημάτων), bcryptjs (κατακερματισμός κωδικών πρόσβασης)

Αυστηροί Κανόνες Ασφαλείας

Αυτοί οι κανόνες επιβάλλονται από εργαλεία και αξιολογητές:

  1. Ποτέ μην κάνετε commit μυστικά — το .env είναι στο gitignore· το .env.example είναι το πρότυπο (χωρίς κυριολεκτικές τιμές, μόνο σχόλια — βλ. PUBLIC_CREDS.md παρακάτω)
  2. Ποτέ μην χρησιμοποιείτε eval(), new Function() ή έμμεσο eval — το ESLint επιβάλλει τον κανόνα
  3. Ποτέ μην παρακάμπτετε τα Husky hooks (--no-verify, --no-gpg-sign) χωρίς ρητή έγκριση διαχειριστή
  4. Ποτέ μην γράφετε ακατέργαστη SQL σε routes — πάντα να διέρχεστε από το src/lib/db/ (παραμετροποιημένο)
  5. Πάντα να επικυρώνετε εισόδους με Zodsrc/shared/validation/schemas.ts
  6. Πάντα να απολυμαίνετε επικεφαλίδες upstream — λίστα απαγορευμένων στο src/shared/constants/upstreamHeaders.ts
  7. Κρυπτογραφείτε τα διαπιστευτήρια σε ηρεμία — AES-256-GCM μέσω src/lib/db/encryption.ts
  8. Δημόσιοι αναγνωριστές OAuth upstream μέσω resolvePublicCred() — ποτέ μην ενσωματώνετε κυριολεκτικές τιμές AIza… / GOCSPX-… / …apps.googleusercontent.com στον πηγαίο κώδικα. Βλ. docs/security/PUBLIC_CREDS.md.
  9. Αποκρίσεις σφαλμάτων μέσω buildErrorBody() / sanitizeErrorMessage() — ποτέ μην τοποθετείτε ακατέργαστο err.stack / err.message σε σώματα HTTP / SSE / executor / MCP αποκρίσεων. Βλ. docs/security/ERROR_SANITIZATION.md.
  10. Τιμές χρόνου εκτέλεσης exec() / spawn() μέσω της επιλογής env — ποτέ μην παρεμβάλλετε εξωτερικά μονοπάτια ή μη αξιόπιστες τιμές σε σενάρια που περνούν από το shell. Αναφορά: src/mitm/cert/install.ts::updateNssDatabases.
  11. Προτιμάτε βιβλιοθήκες με ασφαλείς προεπιλογές — βλ. tldrsec/awesome-secure-defaults (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink). Καταφεύγετε σε αυτές πριν υλοποιήσετε τη δική σας λύση.

Ευρήματα σαρωτή αλυσίδας εφοδιασμού (Socket.dev / Snyk / παρόμοια)

Το δημοσιευμένο artifact npm omniroute περιλαμβάνει το build του Next.js με output: "standalone", που σημαίνει ότι κάθε χειριστής διαδρομής — συμπεριλαμβανομένων των τεκμηριωμένων προνομιακών λειτουργιών (MITM, εισαγωγή Zed, Cloud Sync, ενσωματωμένος επόπτης υπηρεσιών) — καταλήγει σε ελαχιστοποιημένα τμήματα .next/server/*.js. Οι ευρετικοί σαρωτές αλυσίδας εφοδιασμού αντιστοιχίζουν συχνά αυτά τα τμήματα με υπογραφές κακόβουλου λογισμικού.

Για κάθε κατηγορία εύρεσης διατηρούμε μια επιμέρους επαλήθευση συντηρητή ανά εύρημα:

  • docs/security/SOCKET_DEV_FINDINGS.md — χάρτης ανά εύρημα: αρχείο πηγής ↔ επισημασμένο τμήμα ↔ συμπεριφορά ↔ μέτρο μετριασμού που εφαρμόστηκε στην v3.8.6.
  • Μπλοκ SECURITY-AUDITOR-NOTE: εντός πηγαίου κώδικα σε κάθε επισημασμένο σημείο συνάρτησης παραπέμπουν στο ίδιο έγγραφο.

Για χρήστες των οποίων η διοχέτευση δεν μπορεί να χαλαρώσει την ειδοποίηση: κάντε build με OMNIROUTE_BUILD_PROFILE=minimal npm run build. Αυτό αντικαθιστά τις τέσσερις ευαίσθητες μονάδες με stubs που επιστρέφουν HTTP 503 feature-disabled κατά την εκτέλεση, ώστε τα προνομιακά μονοπάτια κώδικα να απουσιάζουν φυσικά από το bundle. Δείτε το docs/security/SOCKET_DEV_FINDINGS.md για τη συνταγή δημοσίευσης.

Αναφορές