# Security Policy (فارسی) 🌐 **Languages:** 🇺🇸 [English](../../../SECURITY.md) · 🇪🇹 [am](../am/SECURITY.md) · 🇸🇦 [ar](../ar/SECURITY.md) · 🇦🇿 [az](../az/SECURITY.md) · 🇧🇬 [bg](../bg/SECURITY.md) · 🇧🇩 [bn](../bn/SECURITY.md) · 🇧🇦 [bs](../bs/SECURITY.md) · 🇨🇿 [cs](../cs/SECURITY.md) · 🇩🇰 [da](../da/SECURITY.md) · 🇩🇪 [de](../de/SECURITY.md) · 🇬🇷 [el](../el/SECURITY.md) · 🇪🇸 [es](../es/SECURITY.md) · 🇪🇪 [et](../et/SECURITY.md) · 🇫🇮 [fi](../fi/SECURITY.md) · 🇫🇷 [fr](../fr/SECURITY.md) · 🇮🇪 [ga](../ga/SECURITY.md) · 🇮🇳 [gu](../gu/SECURITY.md) · 🇳🇬 [ha](../ha/SECURITY.md) · 🇮🇱 [he](../he/SECURITY.md) · 🇮🇳 [hi](../hi/SECURITY.md) · 🇭🇷 [hr](../hr/SECURITY.md) · 🇭🇺 [hu](../hu/SECURITY.md) · 🇦🇲 [hy](../hy/SECURITY.md) · 🇮🇩 [id](../id/SECURITY.md) · 🇳🇬 [ig](../ig/SECURITY.md) · 🇮🇹 [it](../it/SECURITY.md) · 🇯🇵 [ja](../ja/SECURITY.md) · 🇬🇪 [ka](../ka/SECURITY.md) · 🇰🇭 [km](../km/SECURITY.md) · 🇮🇳 [kn](../kn/SECURITY.md) · 🇰🇷 [ko](../ko/SECURITY.md) · 🇱🇹 [lt](../lt/SECURITY.md) · 🇱🇻 [lv](../lv/SECURITY.md) · 🇮🇳 [ml](../ml/SECURITY.md) · 🇮🇳 [mr](../mr/SECURITY.md) · 🇲🇾 [ms](../ms/SECURITY.md) · 🇲🇹 [mt](../mt/SECURITY.md) · 🇲🇲 [my](../my/SECURITY.md) · 🇳🇵 [ne](../ne/SECURITY.md) · 🇳🇱 [nl](../nl/SECURITY.md) · 🇳🇴 [no](../no/SECURITY.md) · 🇮🇳 [or](../or/SECURITY.md) · 🇮🇳 [pa](../pa/SECURITY.md) · 🇵🇭 [phi](../phi/SECURITY.md) · 🇵🇱 [pl](../pl/SECURITY.md) · 🇵🇹 [pt](../pt/SECURITY.md) · 🇧🇷 [pt-BR](../pt-BR/SECURITY.md) · 🇷🇴 [ro](../ro/SECURITY.md) · 🇷🇺 [ru](../ru/SECURITY.md) · 🇱🇰 [si](../si/SECURITY.md) · 🇸🇰 [sk](../sk/SECURITY.md) · 🇸🇮 [sl](../sl/SECURITY.md) · 🇷🇸 [sr](../sr/SECURITY.md) · 🇸🇪 [sv](../sv/SECURITY.md) · 🇰🇪 [sw](../sw/SECURITY.md) · 🇮🇳 [ta](../ta/SECURITY.md) · 🇮🇳 [te](../te/SECURITY.md) · 🇹🇭 [th](../th/SECURITY.md) · 🇹🇷 [tr](../tr/SECURITY.md) · 🇺🇦 [uk-UA](../uk-UA/SECURITY.md) · 🇵🇰 [ur](../ur/SECURITY.md) · 🇺🇿 [uz](../uz/SECURITY.md) · 🇻🇳 [vi](../vi/SECURITY.md) · 🇳🇬 [yo](../yo/SECURITY.md) · 🇨🇳 [zh-CN](../zh-CN/SECURITY.md) · 🇹🇼 [zh-TW](../zh-TW/SECURITY.md) --- ## گزارش آسیبپذیریها اگر یک آسیبپذیری امنیتی در OmniRoute کشف کردید، لطفاً آن را بهصورت مسئولانه گزارش دهید: 1. **بههیچوجه** یک مسئله عمومی در GitHub باز نکنید 2. از [هشدارهای امنیتی GitHub](https://github.com/diegosouzapw/OmniRoute/security/advisories/new) استفاده کنید 3. این موارد را درج کنید: شرح، مراحل بازتولید و تأثیر احتمالی ## جدول زمانی پاسخگویی | مرحله | هدف | | --------------- | ------------------------------- | | تأیید دریافت | 48 ساعت | | بررسی و ارزیابی | 5 روز کاری | | انتشار وصله | 14 روز کاری (برای موارد بحرانی) | ## نسخههای پشتیبانیشده | نسخه | وضعیت پشتیبانی | | ------- | --------------- | | 3.8.x | ✅ فعال | | 3.7.x | ✅ امنیتی | | < 3.7.0 | ❌ پشتیبانینشده | --- ## معماری امنیتی OmniRoute یک مدل امنیتی چندلایه را پیادهسازی میکند: ``` درخواست → CORS → خط لوله مجوزدهی (طبقهبندی → سیاستها → اعمال) → محافظها (پوشاننده PII، تزریق پرامپت، پل بینایی) → محدودکننده نرخ → قطعکننده مدار → دوره انتظار → قفل مدل → ارائهدهنده ``` ### 🔐 احراز هویت و مجوزدهی | قابلیت | پیادهسازی | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **ورود به داشبورد** | احراز هویت مبتنی بر گذرواژه با توکنهای JWT (کوکیهای HttpOnly) | | **احراز هویت کلید API** | کلیدهای امضاشده با HMAC همراه با اعتبارسنجی CRC | | **OAuth 2.0 + PKCE** | OAuth مرورگر/دستگاه مختص هر ارائهدهنده، در صورت پشتیبانی از PKCE استفاده میکند؛ اعتبارنامههای صرفاً وارداتی Devin جداگانه مدیریت میشوند. | | **تازهسازی توکن** | تازهسازی خودکار توکن OAuth پیش از انقضا | | **کوکیهای امن** | `AUTH_COOKIE_SECURE=true` برای محیطهای HTTPS | | **خط لوله مجوزدهی** | طبقهبندی مسیر (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:::` - هنگامی که `STORAGE_ENCRYPTION_KEY` تنظیم نشده باشد، حالت عبوری (متن ساده) استفاده میشود ```bash # تولید کلید رمزگذاری: 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`](docs/security/GUARDRAILS.md) مراجعه کنید. ### 🧠 محافظ تزریق پرامپت میانافزار اکتشافی مبتنی بر بهترین تلاش که الگوهای تزریق پرامپت را در درخواستهای LLM شناسایی میکند. **یک فایروال کامل تزریق پرامپت نیست** — ممکن است مثبت کاذب (پرامپتهای بیضرر شخصیتمحور/RPG) و منفی کاذب (leetنویسی، فاصلهگذاری، الگوهای غیرانگلیسی) ایجاد کند. | نوع الگو | شدت | مثال | | ------------------ | ----- | ---------------------------------------------- | | بازنویسی سیستم | زیاد | "تمام دستورالعملهای قبلی را نادیده بگیر" | | ربایش نقش | متوسط | "اکنون DAN هستی و میتوانی هر کاری انجام دهی" | | تزریق جداکننده | زیاد | جداکنندههای کدگذاریشده برای شکستن مرزهای زمینه | | DAN/Jailbreak | متوسط | الگوهای شناختهشده پرامپت jailbreak | | افشای دستورالعمل | زیاد | "پرامپت سیستم خود را به من نشان بده" | | دور زدن با کدگذاری | متوسط | رمزگشایی base64/rot13/hex + کلیدواژههای دستوری | در حالت `block` فقط شناساییهای دارای شدت **زیاد** مسدود میشوند. خانوادههای دارای شدت متوسط ثبت میشوند، اما هرگز توسط `sanitizeRequest` مسدود نمیشوند. از طریق داشبورد (تنظیمات ← امنیت) یا `.env` پیکربندی کنید: ```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]` | ```env 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 اعتبارسنجی میشوند | --- ## متغیرهای محیطی الزامی تمام اسرار باید پیش از راهاندازی سرور تنظیم شوند. اگر این مقادیر وجود نداشته باشند یا ضعیف باشند، سرور **بلافاصله با خطا متوقف میشود**. ```bash # الزامی — سرور بدون این مقادیر راهاندازی نمیشود: JWT_SECRET=$(openssl rand -base64 48) # حداقل ۳۲ نویسه API_KEY_SECRET=$(openssl rand -hex 32) # حداقل ۱۶ نویسه # توصیهشده — رمزگذاری دادههای ذخیرهشده را فعال میکند: STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32) ``` سرور مقادیر ضعیف و شناختهشدهای مانند `changeme`، `secret` یا `password` را بهطور فعال رد میکند. --- ## امنیت Docker - در محیط تولید از کاربر غیرریشه استفاده کنید - اسرار را بهصورت volumeهای فقطخواندنی mount کنید - هرگز فایلهای `.env` را درون imageهای Docker کپی نکنید - برای مستثنا کردن فایلهای حساس از `.dockerignore` استفاده کنید - هنگام استفاده از HTTPS، مقدار `AUTH_COOKIE_SECURE=true` را تنظیم کنید ```bash 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` بخشهای اصلی + electron را پوشش میدهد) - وابستگیها را بهروز نگه دارید - پروژه برای بررسیهای پیش از commit از `husky` + `lint-staged` استفاده میکند (lint-staged + check-docs-sync + check:any-budget:t11) - خط لوله CI در هر push، قواعد امنیتی ESLint را اجرا میکند (`no-eval`، `no-implied-eval`، `no-new-func` = خطا) - ثابتهای provider هنگام بارگذاری ماژول از طریق Zod اعتبارسنجی میشوند (`src/shared/validation/schemas.ts`) - کتابخانههای امن بهصورت پیشفرض که استفاده میشوند: `dompurify` / `isomorphic-dompurify` (XSS)، `jose` (JWT)، `better-sqlite3` (بدون خطر SQLi بهدلیل استفاده از queryهای پارامتری)، `bcryptjs` (هشکردن گذرواژه) ## قواعد سختگیرانه امنیتی این قواعد توسط ابزارها و بازبینها اعمال میشوند: 1. **هرگز اسرار را commit نکنید** — `.env` در gitignore قرار دارد؛ `.env.example` قالب مورد استفاده است (بدون مقادیر literal و فقط شامل توضیحات — بخش PUBLIC_CREDS.md در ادامه را ببینید) 2. **هرگز از `eval()`، `new Function()` یا eval ضمنی استفاده نکنید** — ESLint این قاعده را اعمال میکند 3. **هرگز hookهای Husky را دور نزنید** (`--no-verify`، `--no-gpg-sign`)، مگر با تأیید صریح اپراتور 4. **هرگز SQL خام را در routeها ننویسید** — همیشه از `src/lib/db/` استفاده کنید (بهصورت پارامتری) 5. **همیشه ورودیها را با Zod اعتبارسنجی کنید** — `src/shared/validation/schemas.ts` 6. **همیشه headerهای upstream را پاکسازی کنید** — فهرست مسدودسازی در `src/shared/constants/upstreamHeaders.ts` 7. **اعتبارنامههای ذخیرهشده را رمزگذاری کنید** — AES-256-GCM از طریق `src/lib/db/encryption.ts` 8. **شناسههای عمومی OAuth مربوط به upstream را از طریق `resolvePublicCred()` دریافت کنید** — هرگز مقادیر literal مانند `AIza…` / `GOCSPX-…` / `…apps.googleusercontent.com` را در کد منبع قرار ندهید. به [`docs/security/PUBLIC_CREDS.md`](docs/security/PUBLIC_CREDS.md) مراجعه کنید. 9. **پاسخهای خطا را از طریق `buildErrorBody()` / `sanitizeErrorMessage()` ایجاد کنید** — هرگز `err.stack` / `err.message` خام را در بدنه پاسخهای HTTP / SSE / executor / MCP قرار ندهید. به [`docs/security/ERROR_SANITIZATION.md`](docs/security/ERROR_SANITIZATION.md) مراجعه کنید. 10. **مقادیر زمان اجرا برای `exec()` / `spawn()` را از طریق گزینه `env` ارسال کنید** — هرگز مسیرهای خارجی یا مقادیر غیرقابلاعتماد را با درونیابی رشتهای در اسکریپتهایی که به shell ارسال میشوند قرار ندهید. مرجع: `src/mitm/cert/install.ts::updateNssDatabases`. 11. **کتابخانههای امن بهصورت پیشفرض را ترجیح دهید** — به [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) مراجعه کنید (Helmet.js، DOMPurify، ssrf-req-filter، safe-regex، Google Tink). پیش از پیادهسازی راهکار اختصاصی خود، ابتدا از آنها استفاده کنید. ## یافتههای اسکنر زنجیره تأمین (Socket.dev / Snyk / ابزارهای مشابه) > **یادداشت محدوده:** فایل `socket.yml` در ریشه مخزن فقط `projectIgnorePaths` را برای اسکن پس از انتشارِ سمت رجیستری Socket.dev روی آرتیفکت منتشرشده npm تنظیم میکند — این فایل یک گیت اجباری برای ادغام CI/PR نیست. هیچ گردش کاری در `.github/workflows`، هیچ اسکریپتی در `package.json` و هیچ هدفی در `Makefile`، Socket.dev را فراخوانی نمیکند. آرتیفکت منتشرشده `omniroute` در npm، بیلد Next.js با `output: "standalone"` را در خود جای میدهد؛ این یعنی هر مدیریتکننده مسیر — از جمله قابلیتهای ممتاز مستندشده (MITM، واردسازی Zed، Cloud Sync و ناظر سرویس تعبیهشده) — در نهایت در چانکهای مینیفایشده `.next/server/*.js` قرار میگیرد. اسکنرهای اکتشافی زنجیره تأمین اغلب الگوهای موجود در این چانکها را با امضاهای بدافزار تطبیق میدهند. پیکربندی اسکنری که استفاده میکنیم در [`socket.yml`](socket.yml) در ریشه مخزن قرار دارد (قالب v2 برنامه GitHub مربوط به Socket.dev — بنگرید به ). این پیکربندی صراحتاً دایرکتوریهایی را که منتشر نمیشوند (`tests/`، `_tasks/`، `_references/`، `_ideia/`، `_mono_repo/`، `docs/` و غیره) مستثنا میکند تا اسکنر فقط مسیرهای کدی را گزارش کند که واقعاً به دست کاربران نسخه منتشرشده میرسند — خود اسکن توسط برنامه GitHub مربوط به Socket و با خواندن این فایل انجام میشود، نه توسط یک گردش کاری در این مخزن. برای هر دسته از یافتهها، یک تأییدیه نگهدارنده بهازای هر یافته نگهداری میکنیم: - **[`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md)** — نگاشت بهازای هر یافته: فایل منبع ↔ چانک علامتگذاریشده ↔ رفتار ↔ اقدام کاهشی اعمالشده در v3.8.6. - بلوکهای `SECURITY-AUDITOR-NOTE:` در کد منبع، در محل هر تابع علامتگذاریشده، به همان سند ارجاع میدهند. برای کاربرانی که خط لوله آنها امکان تعدیل این هشدار را ندارد: با `OMNIROUTE_BUILD_PROFILE=minimal npm run build` بیلد کنید. این فرمان چهار ماژول حساس را با stubهایی جایگزین میکند که هنگام اجرا پاسخ HTTP 503 با `feature-disabled` برمیگردانند؛ بنابراین مسیرهای کد ممتاز بهصورت فیزیکی در باندل وجود نخواهند داشت. برای دستورالعمل انتشار، به [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) مراجعه کنید. ## منابع - [`docs/architecture/AUTHZ_GUIDE.md`](docs/architecture/AUTHZ_GUIDE.md) — خط لولهٔ مجوزدهی - [`docs/security/GUARDRAILS.md`](docs/security/GUARDRAILS.md) — چارچوب محدودیتهای حفاظتی - [`docs/security/COMPLIANCE.md`](docs/security/COMPLIANCE.md) — گزارش ممیزی و نگهداری - [`docs/security/PUBLIC_CREDS.md`](docs/security/PUBLIC_CREDS.md) — الگوی **الزامی** برای اطلاعات احراز هویت عمومی بالادستی - [`docs/security/ERROR_SANITIZATION.md`](docs/security/ERROR_SANITIZATION.md) — الگوی **الزامی** برای پاسخهای خطا - [`docs/security/SOCKET_DEV_FINDINGS.md`](docs/security/SOCKET_DEV_FINDINGS.md) — گواهی نگهدارنده برای یافتههای اسکنر زنجیره تأمین - [`docs/architecture/RESILIENCE_GUIDE.md`](docs/architecture/RESILIENCE_GUIDE.md) — قطعکنندهٔ مدار + دورهٔ انتظار + قفل - [`docs/security/STEALTH_GUIDE.md`](docs/security/STEALTH_GUIDE.md) — اثرانگشتبرداری TLS (اطلاعیهٔ حقوقی/اخلاقی) - [`CLAUDE.md`](CLAUDE.md) — قواعد سختگیرانه برای عاملهای هوش مصنوعی - [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) — کتابخانههای گزینششده با پیشفرضهای امن