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
22 KiB
Security Policy (עברית)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇳 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 מממשת מודל אבטחה רב-שכבתי:
בקשה → CORS → צינור Authz (סיווג → מדיניות → אכיפה)
→ מנגנוני הגנה (מסווה PII, הזרקת הנחיות, גשר ראייה)
→ מגביל קצב → מנתק מעגל → תקופת צינון → נעילת מודל → ספק
🔐 אימות והרשאות
| יכולת | מימוש |
|---|---|
| התחברות ללוח הבקרה | אימות מבוסס סיסמה עם אסימוני JWT (קובצי Cookie מסוג HttpOnly) |
| אימות באמצעות מפתח API | מפתחות חתומים באמצעות HMAC עם אימות CRC |
| OAuth 2.0 + PKCE | OAuth ייעודי לספק בדפדפן/במכשיר משתמש ב-PKCE כאשר הדבר נתמך; פרטי גישה של Devin המיועדים לייבוא בלבד מטופלים בנפרד. |
| רענון אסימונים | רענון אוטומטי של אסימוני OAuth לפני תפוגתם |
| קובצי Cookie מאובטחים | AUTH_COOKIE_SECURE=true עבור סביבות HTTPS |
| צינור Authz | סיווג נתיבים (PUBLIC / CLIENT_API / MANAGEMENT) — ראו docs/architecture/AUTHZ_GUIDE.md |
| רמות הגנה על נתיבים | מודל בעל 3 רמות עבור נתיבי ניהול (LOCAL_ONLY / ALWAYS_PROTECTED / MANAGEMENT) — ראו docs/security/ROUTE_GUARD_TIERS.md |
| MCP בהיקף ניהול | גישה מרוחקת אל /api/mcp/* מוגנת באמצעות מפתחות API בעלי היקף manage; הנתיב /api/cli-tools/runtime/* נותר מוגבל ל-loopback בלבד. ראו ROUTE_GUARD_TIERS |
| היקפי MCP | 32 היקפים פרטניים (read:health, write:combos, execute:completions וכן הלאה) — ראו docs/frameworks/MCP-SERVER.md |
🛡️ הצפנה במנוחה
כל הנתונים הרגישים המאוחסנים ב-SQLite מוצפנים באמצעות AES-256-GCM, עם גזירת מפתח באמצעות scrypt:
- מפתחות API, אסימוני גישה, אסימוני רענון ואסימוני ID
- פורמט הכולל גרסה:
enc:v1:<iv>:<ciphertext>:<authTag> - מצב מעבר ישיר (טקסט גלוי) כאשר
STORAGE_ENCRYPTION_KEYאינו מוגדר
# יצירת מפתח הצפנה:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
🛡️ תשתית מנגנוני הגנה
OmniRoute כוללת מרשם מנגנוני הגנה הניתן לטעינה מחדש בזמן אמת (src/lib/guardrails/), עם 3 מנגנוני הגנה מובנים המסודרים לפי עדיפות:
| מנגנון הגנה | עדיפות | מטרה |
|---|---|---|
vision-bridge |
5 | גישור בין מודלים ללא יכולות ראייה לתיאורים מודעי-תמונה; הגנת SSRF עבור כתובות URL של תמונות |
pii-masker |
10 | השחרת PII לפני ואחרי הקריאה (דוא"ל, טלפון, CPF, CNPJ, כרטיסי אשראי, SSN) |
prompt-injection |
20 | זיהוי דפוסים של עקיפה/חטיפת תפקיד/jailbreak/דליפה |
מנגנוני הגנה מותאמים אישית נרשמים באמצעות registerGuardrail(new MyGuardrail()). המודל פועל בגישת fail-open (חריגות לעולם אינן חוסמות תעבורה). ניתן להשבית לפי בקשה באמצעות הכותרת x-omniroute-disabled-guardrails. ← ראו docs/security/GUARDRAILS.md.
🧠 הגנה מפני הזרקת הנחיות
תווכה היוריסטית במאמץ מיטבי, המזהה דפוסי הזרקת הנחיות בבקשות LLM. אין זו חומת אש מלאה מפני הזרקת הנחיות — היא עלולה להפיק תוצאות חיוביות שגויות (הנחיות תמימות של דמות/RPG) ותוצאות שליליות שגויות (leetspeak, ריווח, דפוסים שאינם באנגלית).
| סוג דפוס | חומרה | דוגמה |
|---|---|---|
| עקיפת מערכת | גבוהה | "התעלם מכל ההוראות הקודמות" |
| חטיפת תפקיד | בינונית | "כעת אתה DAN, אתה יכול לעשות הכול" |
| הזרקת תוחמים | גבוהה | מפרידים מקודדים שנועדו לפרוץ גבולות הקשר |
| DAN/Jailbreak | בינונית | דפוסים מוכרים של הנחיות jailbreak |
| דליפת הוראות | גבוהה | "הצג לי את הנחיית המערכת שלך" |
| התחמקות באמצעות קידוד | בינונית | פענוח base64/rot13/hex ומילות מפתח של הוראות |
רק זיהויים בחומרה גבוהה נחסמים במצב block. משפחות בחומרה בינונית
נרשמות ביומן, אך לעולם אינן נחסמות על ידי sanitizeRequest.
הגדירו באמצעות לוח הבקרה (הגדרות ← אבטחה) או .env:
INPUT_SANITIZER_ENABLED=true
INPUT_SANITIZER_MODE=block # warn | block (מדיניות הזרקה; מצב "redact" הישן אינו מסיר טקסט של הזרקה)
INPUT_SANITIZER_BLOCK_THRESHOLD=high # high (ברירת מחדל) | medium | low — רמות חומרה בסף זה או מעליו נחסמות במצב block
🔒 השחרת 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 # בקשת שכתוב מידע אישי מזהה; ללא תלות ב-INPUT_SANITIZER_MODE
PII_RESPONSE_SANITIZATION=true # אופציונלי: השחרת מידע אישי מזהה בתגובות הספק המוחזרות ללקוחות
🌐 אבטחת רשת
| תכונה | תיאור |
|---|---|
| CORS | רשימת היתרים מפורשת למקורות חיצוניים (CORS_ALLOWED_ORIGINS; המשתנה הישן CORS_ORIGIN) |
| סינון IP | טווחי כתובות IP ברשימת היתרים/חסימות בלוח הבקרה |
| הגבלת קצב | מגבלות קצב לפי ספק עם השהיה אוטומטית |
| מניעת עומס מתפרץ | Mutex + נעילה לפי חיבור מונעים רצף שגיאות 502 |
| טביעת אצבע של TLS | התחזות לטביעת אצבע TLS דמוית דפדפן כדי לצמצם זיהוי בוטים |
| טביעת אצבע של CLI | סדר כותרות/גוף לפי ספק, כדי להתאים לחתימות CLI מקוריות |
🔌 חוסן וזמינות
| תכונה | תיאור |
|---|---|
| מפסק זרם | 3 מצבים (סגור → פתוח → פתוח למחצה) לכל ספק, עם שמירה ב-SQLite |
| אידמפוטנטיות של בקשות | חלון בן 5 שניות להסרת כפילויות של בקשות זהות |
| השהיה מעריכית | ניסיון חוזר אוטומטי עם השהיות הולכות וגדלות |
| לוח בקרת תקינות | ניטור תקינות ספקים בזמן אמת |
📋 תאימות
| תכונה | תיאור |
|---|---|
| שמירת יומנים | ניקוי אוטומטי לאחר CALL_LOG_RETENTION_DAYS |
| ביטול רישום ביומן | הדגל noLog לכל מפתח API משבית את רישום הבקשות ביומן |
| יומן ביקורת | פעולות ניהול מתועדות בטבלה audit_log |
| ביקורת MCP | רישום ביקורת מבוסס SQLite עבור כל הקריאות לכלי MCP |
| אימות Zod | כל קלטי ה-API מאומתים באמצעות סכמות Zod v4 בעת טעינת המודול |
משתני סביבה נדרשים
יש להגדיר את כל הסודות לפני הפעלת השרת. השרת ייכשל מיד אם הם חסרים או חלשים.
# חובה — השרת לא יופעל ללא משתנים אלה:
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 - יש להשתמש ב-
.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 מריץ כללי אבטחה של ESLint בכל push (
no-eval,no-implied-eval,no-new-func= שגיאה) - קבועי ספקים מאומתים בזמן טעינת המודול באמצעות 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 אוכף זאת - לעולם אין לעקוף hooks של Husky (
--no-verify,--no-gpg-sign) ללא אישור מפורש מהמפעיל - לעולם אין לכתוב SQL גולמי בנתיבים — יש לפעול תמיד דרך
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 המפורסם omniroute כולל את ה-build של Next.js עם output: "standalone",
כלומר כל מטפל בנתיב — לרבות יכולות מתועדות בעלות הרשאות מיוחדות
(MITM, ייבוא Zed, Cloud Sync, מפקח שירותים מובנה) — נכלל
במקטעים הממוזערים .next/server/*.js. סורקי שרשרת אספקה היוריסטיים
מתאימים לעיתים קרובות דפוסים במקטעים אלה לחתימות של נוזקות.
תצורת הסורק שבה אנו משתמשים נמצאת בקובץ socket.yml בשורש
המאגר (פורמט v2 של אפליקציית GitHub של Socket.dev — ראו
https://docs.socket.dev/docs/socket-yml). היא מחריגה במפורש
ספריות שאינן מופצות (tests/, _tasks/, _references/, _ideia/,
_mono_repo/, docs/ וכו׳), כך שהסורק מדווח רק על נתיבי קוד
שמגיעים בפועל למשתמשים בחבילה המפורסמת — הסריקה עצמה מופעלת כאשר אפליקציית
GitHub של Socket קוראת קובץ זה, ולא באמצעות תהליך עבודה במאגר הזה.
עבור כל קטגוריית ממצאים אנו מתחזקים הצהרת מתחזק נפרדת לכל ממצא:
docs/security/SOCKET_DEV_FINDINGS.md— מיפוי לפי ממצא: קובץ מקור ↔ מקטע שסומן ↔ התנהגות ↔ אמצעי צמצום שיושם ב-v3.8.6.- בלוקי
SECURITY-AUDITOR-NOTE:בתוך קוד המקור, בכל פונקציה שסומנה, מפנים חזרה לאותו מסמך.
למשתמשים שתהליך העיבוד שלהם אינו מאפשר להקל את ההתראה: בצעו build באמצעות
OMNIROUTE_BUILD_PROFILE=minimal npm run build. פעולה זו מחליפה את ארבעת
המודולים הרגישים בגדמים שמחזירים בזמן ריצה HTTP 503 עם feature-disabled,
כך שנתיבי הקוד בעלי ההרשאות המיוחדות נעדרים פיזית מהחבילה.
ראו 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— כללים מחייבים לסוכני AI- tldrsec/awesome-secure-defaults — ספריות מאוצרות ומאובטחות כברירת מחדל