1,104 mirrors rewritten over five passes of run-translation on the 22-source core set: the 14 sources edited since their translation, the 322 mirrors that were still English copies, and the frontmatter the old extractor leaked into the newer locales' bodies. The pipeline now caches per-`## `-section hashes and retranslates only changed sections, never reuses a section that is still English, rebuilds English-copy / leaked mirrors even when the source is unchanged, merges the state on save (parallel runs), and the drift gate (scoped to the core set) is blocking. Final audit: 0 stale, 0 English copies, 0 leaked frontmatter across 1,430 core mirrors. ⚠️ base-red inherited: #12732
26 KiB
Security Policy (Ελληνικά)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇪🇸 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 · 🇳🇱 nl · 🇳🇴 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
Αναφορά Ευπαθειών
Εάν ανακαλύψετε μια ευπάθεια ασφαλείας στο 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 / παρόμοια εργαλεία)
Το δημοσιευμένο npm artifact omniroute περιλαμβάνει το build του Next.js με output: "standalone", πράγμα που σημαίνει ότι κάθε route handler — συμπεριλαμβανομένων των τεκμηριωμένων προνομιακών λειτουργιών (MITM, εισαγωγή Zed, Cloud Sync, ενσωματωμένος επόπτης υπηρεσιών) — καταλήγει σε ελαχιστοποιημένα chunks .next/server/*.js. Οι ευρετικοί σαρωτές εφοδιαστικής αλυσίδας συχνά αντιστοιχίζουν τα μοτίβα αυτών των chunks με υπογραφές κακόβουλου λογισμικού.
Η διαμόρφωση του σαρωτή που χρησιμοποιούμε βρίσκεται στο socket.yml στη ρίζα του αποθετηρίου (μορφή v2 του Socket.dev GitHub App — βλ.
https://docs.socket.dev/docs/socket-yml). Εξαιρεί ρητά καταλόγους που δεν αποστέλλονται (tests/, _tasks/, _references/, _ideia/,
_mono_repo/, docs/ κ.λπ.), ώστε ο σαρωτής να αναφέρει μόνο διαδρομές κώδικα που φτάνουν πράγματι στους χρήστες της δημοσιευμένης έκδοσης — η ίδια η σάρωση εκτελείται από το Socket GitHub App, το οποίο διαβάζει αυτό το αρχείο, και όχι από κάποιο workflow σε αυτό το αποθετήριο.
Για κάθε κατηγορία ευρημάτων διατηρούμε μια βεβαίωση από τους συντηρητές ανά εύρημα:
docs/security/SOCKET_DEV_FINDINGS.md— αντιστοίχιση ανά εύρημα: αρχείο προέλευσης ↔ επισημασμένο chunk ↔ συμπεριφορά ↔ μέτρο περιορισμού που εφαρμόστηκε στην v3.8.6.- Μπλοκ
SECURITY-AUDITOR-NOTE:μέσα στον πηγαίο κώδικα, σε κάθε επισημασμένο σημείο συνάρτησης, παραπέμπουν στο ίδιο έγγραφο.
Για χρήστες των οποίων το pipeline δεν επιτρέπει τη χαλάρωση της ειδοποίησης: εκτελέστε build με
OMNIROUTE_BUILD_PROFILE=minimal npm run build. Αυτό αντικαθιστά τα τέσσερα ευαίσθητα modules με 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 — επιμελημένες βιβλιοθήκες ασφαλείς εξ ορισμού