Skip to content

Latest commit

 

History

History
266 lines (202 loc) · 36.6 KB

SECURITY.md

File metadata and controls

266 lines (202 loc) · 36.6 KB

Security Policy (ქართული)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇧🇦 bs · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇰🇭 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-ში უსაფრთხოების მოწყვლადობას აღმოაჩენთ, გთხოვთ, პასუხისმგებლობით შეგვატყობინოთ:

  1. არ გახსნათ საჯარო GitHub issue
  2. გამოიყენეთ GitHub Security Advisories
  3. მიუთითეთ: აღწერა, გამეორების ნაბიჯები და შესაძლო გავლენა

რეაგირების ვადები

ეტაპი სამიზნე ვადა
მიღების დადასტურება 48 საათი
ტრიაჟი და შეფასება 5 სამუშაო დღე
პატჩის გამოშვება 14 სამუშაო დღე (კრიტიკული)

მხარდაჭერილი ვერსიები

ვერსია მხარდაჭერის სტატუსი
3.8.x ✅ აქტიური
3.7.x ✅ უსაფრთხოების
< 3.7.0 ❌ მხარდაუჭერელი

უსაფრთხოების არქიტექტურა

OmniRoute იყენებს უსაფრთხოების მრავალშრიან მოდელს:

მოთხოვნა → CORS → Authz კონვეიერი (კლასიფიკაცია → პოლიტიკები → აღსრულება)
       → დამცავი მექანიზმები (PII-ის შემნიღბავი, prompt injection, vision bridge)
       → სიხშირის შემზღუდველი → ავტომატური ამომრთველი → დაყოვნება → მოდელის დაბლოკვა → პროვაიდერი

🔐 ავთენტიფიკაცია და ავტორიზაცია

ფუნქცია იმპლემენტაცია
მართვის პანელში შესვლა პაროლზე დაფუძნებული ავთენტიფიკაცია JWT ტოკენებით (HttpOnly cookie-ები)
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/* წვდომას აკონტროლებს manage ფარგლის მქონე API გასაღებები; /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 გამოსახულების ხედვის არმქონე მოდელებს გამოსახულების აღმწერ ინფორმაციას აწვდის; გამოსახულებების URL-ებისთვის SSRF დაცვა
pii-masker 10 გამოძახებამდე და გამოძახების შემდეგ PII-ის რედაქტირება (ელფოსტა, ტელეფონი, CPF, CNPJ, საკრედიტო ბარათები, SSN)
prompt-injection 20 ჩანაცვლების/როლის მიტაცების/jailbreak-ის/ინფორმაციის გაჟონვის შაბლონების აღმოჩენა

მორგებული დამცავი მექანიზმების რეგისტრაცია ხდება registerGuardrail(new MyGuardrail())-ის მეშვეობით. მოდელი fail-open პრინციპით მუშაობს (გამონაკლისები ტრაფიკს არასოდეს ბლოკავს). ცალკეული მოთხოვნისთვის გამორთვა შესაძლებელია x-omniroute-disabled-guardrails სათაურის მეშვეობით. → იხილეთ docs/security/GUARDRAILS.md.

🧠 Prompt Injection-ისგან დაცვა

საუკეთესო ძალისხმევაზე დაფუძნებული ევრისტიკული middleware, რომელიც LLM მოთხოვნებში prompt injection-ის შაბლონებს ამოიცნობს. ეს არ არის prompt injection-ისგან დაცვის სრულყოფილი firewall — შესაძლებელია ცრუ დადებითი შედეგები (უვნებელი პერსონის/RPG prompt-ები) და ცრუ უარყოფითი შედეგები (leetspeak, დაშორებები, არაინგლისური შაბლონები).

შაბლონის ტიპი სიმძიმე მაგალითი
სისტემის ჩანაცვლება მაღალი "ყველა წინა ინსტრუქციის იგნორირება"
როლის მიტაცება საშუალო "ახლა შენ ხარ DAN და ყველაფრის გაკეთება შეგიძლია"
გამყოფის ინიექცია მაღალი კონტექსტის საზღვრების დასარღვევად კოდირებული გამყოფები
DAN/Jailbreak საშუალო ცნობილი jailbreak prompt-ის შაბლონები
ინსტრუქციების გაჟონვა მაღალი "მაჩვენე შენი სისტემური prompt"
კოდირებით გვერდის ავლა საშუალო 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-ის რედაქტირება

პერსონალური საიდენტიფიკაციო ინფორმაციის ავტომატური აღმოჩენა და არასავალდებულო რედაქტირება:

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 სხვადასხვა წყაროს მკაფიო ნებადართული სია (CORS_ALLOWED_ORIGINS; მოძველებული CORS_ORIGIN)
IP-ფილტრაცია დაშვებული/დაბლოკილი IP-დიაპაზონები მართვის პანელში
სიხშირის შეზღუდვა თითოეული პროვაიდერის სიხშირის შეზღუდვები ავტომატური დაყოვნებით
ერთდროული მოთხოვნების ტალღის საწინააღმდეგო დაცვა Mutex + თითოეული კავშირის ჩაკეტვა ხელს უშლის 502 შეცდომების კასკადურ წარმოქმნას
TLS-ანაბეჭდი ბრაუზერის მსგავსი TLS-ანაბეჭდის იმიტაცია ბოტების აღმოჩენის ალბათობის შესამცირებლად
CLI-ანაბეჭდი სათაურების/სხეულის პროვაიდერის მიხედვით დალაგება ნატიურ CLI-სიგნატურებთან შესაბამისობისთვის

🔌 მდგრადობა და ხელმისაწვდომობა

ფუნქცია აღწერა
Circuit Breaker 3-მდგომარეობიანი (დახურული → ღია → ნახევრად ღია), თითოეული პროვაიდერისთვის, SQLite-ში შენახული
მოთხოვნის იდემპოტენტურობა 5-წამიანი დუბლიკატების აღმოფხვრის ფანჯარა განმეორებითი მოთხოვნებისთვის
ექსპონენციალური დაყოვნება ავტომატური ხელახალი მცდელობა მზარდი დაყოვნებებით
მდგომარეობის მართვის პანელი პროვაიდერების მდგომარეობის რეალურ დროში მონიტორინგი

📋 შესაბამისობა

ფუნქცია აღწერა
ჟურნალის შენახვა ავტომატური გასუფთავება CALL_LOG_RETENTION_DAYS-ის გასვლის შემდეგ
ჟურნალირების გამორთვა თითოეული API-გასაღების noLog ალამი თიშავს მოთხოვნების ჟურნალირებას
აუდიტის ჟურნალი ადმინისტრაციული მოქმედებები აღირიცხება 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
  • HTTPS-ის მიღმა მუშაობისას დააყენეთ AUTH_COOKIE_SECURE=true
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 = შეცდომა)
  • პროვაიდერის კონსტანტები მოდულის ჩატვირთვისას მოწმდება Zod-ის მეშვეობით (src/shared/validation/schemas.ts)
  • გამოიყენება ნაგულისხმევად უსაფრთხო ბიბლიოთეკები: dompurify / isomorphic-dompurify (XSS), jose (JWT), better-sqlite3 (პარამეტრიზებული მოთხოვნების გამო SQLi-ის რისკის გარეშე), bcryptjs (პაროლების ჰეშირება)

უსაფრთხოების მკაცრი წესები

ამ წესების დაცვას ინსტრუმენტები და მიმომხილველები უზრუნველყოფენ:

  1. არასოდეს შეიტანოთ საიდუმლო მნიშვნელობები commit-ში — .env იგნორირებულია git-ის მიერ; .env.example არის შაბლონი (ლიტერალების გარეშე, მხოლოდ კომენტარები — იხილეთ PUBLIC_CREDS.md ქვემოთ)
  2. არასოდეს გამოიყენოთ eval(), new Function() ან არაპირდაპირი eval — ამას ESLint უზრუნველყოფს
  3. არასოდეს აუაროთ გვერდი Husky-ის hook-ებს (--no-verify, --no-gpg-sign) ოპერატორის მკაფიო თანხმობის გარეშე
  4. არასოდეს დაწეროთ დაუმუშავებელი SQL მარშრუტებში — ყოველთვის გამოიყენეთ src/lib/db/ (პარამეტრიზებული)
  5. ყოველთვის შეამოწმეთ შეყვანილი მონაცემები Zod-ით — src/shared/validation/schemas.ts
  6. ყოველთვის გაწმინდეთ ზედა დონის სერვერის სათაურები — აკრძალული ელემენტების სია მოცემულია src/shared/constants/upstreamHeaders.ts-ში
  7. შენახული ავტორიზაციის მონაცემები დაშიფრეთ — AES-256-GCM src/lib/db/encryption.ts-ის მეშვეობით
  8. ზედა დონის საჯარო OAuth იდენტიფიკატორები გამოიყენეთ 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 / მსგავსი)

მოქმედების სფეროს შენიშვნა: რეპოზიტორიის ძირში არსებული socket.yml მხოლოდ Socket.dev-ის რეესტრის მხარეს, გამოქვეყნების შემდგომ შესრულებული სკანირებისთვის განსაზღვრავს projectIgnorePaths-ს გამოქვეყნებულ 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.dev GitHub App-ის ფორმატი v2 — იხილეთ https://docs.socket.dev/docs/socket-yml). ის აშკარად გამორიცხავს არაგამოსაქვეყნებელ დირექტორიებს (tests/, _tasks/, _references/, _ideia/, _mono_repo/, docs/ და სხვ.), რათა სკანერმა ანგარიში მხოლოდ იმ კოდის გზებზე შეადგინოს, რომლებიც რეალურად აღწევს გამოქვეყნებული პაკეტის მომხმარებლებამდე — თავად სკანირებას ახორციელებს Socket GitHub App, რომელიც ამ ფაილს კითხულობს, და არა ამ რეპოზიტორიაში არსებული სამუშაო პროცესი.

მიგნებების თითოეული კატეგორიისთვის ვინახავთ პასუხისმგებელი პირის ინდივიდუალურ დასტურს:

  • docs/security/SOCKET_DEV_FINDINGS.md — მიგნებების ინდივიდუალური რუკა: საწყისი ფაილი ↔ მონიშნული ნაწილი ↔ ქცევა ↔ v3.8.6-ში გამოყენებული შემარბილებელი ღონისძიება.
  • საწყის კოდში არსებული SECURITY-AUDITOR-NOTE: ბლოკები თითოეულ მონიშნულ ფუნქციასთან იმავე დოკუმენტზე მიუთითებს.

მომხმარებლებისთვის, რომელთა კონვეიერსაც გაფრთხილების მოთხოვნების შერბილება არ შეუძლია: ააგეთ 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 — სავალდებულო შაბლონი საჯარო ზედა დონის სერვისების ავტორიზაციის მონაცემებისთვის
  • docs/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 — უსაფრთხო ნაგულისხმევი პარამეტრების მქონე შერჩეული ბიბლიოთეკები