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.
24 KiB
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, παρακαλούμε να την αναφέρετε υπεύθυνα:
- ΜΗΝ ανοίξετε δημόσιο ζήτημα στο GitHub
- Χρησιμοποιήστε τα GitHub Security Advisories
- Συμπεριλάβετε: περιγραφή, βήματα αναπαραγωγής και πιθανό αντίκτυπο
Χρονοδιάγραμμα Απόκρισης
| Στάδιο | Στόχος |
|---|---|
| Επιβεβαίωση | 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 | Μοτίβο | Αντικατάσταση |
|---|---|---|
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(κατακερματισμός κωδικών πρόσβασης)
Αυστηροί Κανόνες Ασφαλείας
Αυτοί οι κανόνες επιβάλλονται από εργαλεία και αξιολογητές:
- Ποτέ μην κάνετε commit μυστικά — το
.envείναι στο gitignore· το.env.exampleείναι το πρότυπο (χωρίς κυριολεκτικές τιμές, μόνο σχόλια — βλ. PUBLIC_CREDS.md παρακάτω) - Ποτέ μην χρησιμοποιείτε
eval(),new Function()ή έμμεσο eval — το ESLint επιβάλλει τον κανόνα - Ποτέ μην παρακάμπτετε τα Husky hooks (
--no-verify,--no-gpg-sign) χωρίς ρητή έγκριση διαχειριστή - Ποτέ μην γράφετε ακατέργαστη SQL σε routes — πάντα να διέρχεστε από το
src/lib/db/(παραμετροποιημένο) - Πάντα να επικυρώνετε εισόδους με Zod —
src/shared/validation/schemas.ts - Πάντα να απολυμαίνετε επικεφαλίδες upstream — λίστα απαγορευμένων στο
src/shared/constants/upstreamHeaders.ts - Κρυπτογραφείτε τα διαπιστευτήρια σε ηρεμία — AES-256-GCM μέσω
src/lib/db/encryption.ts - Δημόσιοι αναγνωριστές OAuth upstream μέσω
resolvePublicCred()— ποτέ μην ενσωματώνετε κυριολεκτικές τιμέςAIza…/GOCSPX-…/…apps.googleusercontent.comστον πηγαίο κώδικα. Βλ.docs/security/PUBLIC_CREDS.md. - Αποκρίσεις σφαλμάτων μέσω
buildErrorBody()/sanitizeErrorMessage()— ποτέ μην τοποθετείτε ακατέργαστοerr.stack/err.messageσε σώματα HTTP / SSE / executor / MCP αποκρίσεων. Βλ.docs/security/ERROR_SANITIZATION.md. - Τιμές χρόνου εκτέλεσης
exec()/spawn()μέσω της επιλογήςenv— ποτέ μην παρεμβάλλετε εξωτερικά μονοπάτια ή μη αξιόπιστες τιμές σε σενάρια που περνούν από το shell. Αναφορά:src/mitm/cert/install.ts::updateNssDatabases. - Προτιμάτε βιβλιοθήκες με ασφαλείς προεπιλογές — βλ. 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
για τη συνταγή δημοσίευσης.
Αναφορές
docs/architecture/AUTHZ_GUIDE.md— διοχέτευση εξουσιοδότησηςdocs/security/GUARDRAILS.md— πλαίσιο προστατευτικών ελέγχωνdocs/security/COMPLIANCE.md— αρχείο καταγραφής ελέγχου και διατήρησηdocs/security/PUBLIC_CREDS.md— υποχρεωτικό μοτίβο για δημόσια διαπιστευτήρια upstreamdocs/security/ERROR_SANITIZATION.md— υποχρεωτικό μοτίβο για αποκρίσεις σφαλμάτωνdocs/security/SOCKET_DEV_FINDINGS.md— επαλήθευση συντηρητή για ευρήματα σαρωτή αλυσίδας εφοδιασμούdocs/architecture/RESILIENCE_GUIDE.md— αποδιακόπτης + περίοδος ψύξης + κλείδωμαdocs/security/STEALTH_GUIDE.md— δακτυλοτύπωση TLS (νομική/ηθική σημείωση)CLAUDE.md— αυστηροί κανόνες για πράκτορες ΤΝ- tldrsec/awesome-secure-defaults — επιμελημένες βιβλιοθήκες ασφαλείς εξ ορισμού