Files
OmniRoute/docs/i18n/th/SECURITY.md
Diego Rodrigues de Sa e Souza b637350680 fix(docs): re-sync the 65 documentation mirror sets; section-level docs pipeline; drift gate blocking (#13940)
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
2026-09-17 02:55:31 -03:00

32 KiB

Security Policy (ไทย)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 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 · 🇹🇷 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, การแทรกพรอมต์, บริดจ์วิชัน)
       → ตัวจำกัดอัตรา → เซอร์กิตเบรกเกอร์ → ช่วงพัก → การล็อกโมเดล → ผู้ให้บริการ

🔐 การยืนยันตัวตนและการให้สิทธิ์

ฟีเจอร์ การทำงาน
การเข้าสู่ระบบแดชบอร์ด การยืนยันตัวตนด้วยรหัสผ่านพร้อมโทเค็น JWT (คุกกี้ HttpOnly)
การยืนยันตัวตนด้วย API Key คีย์ที่ลงนามด้วย HMAC พร้อมการตรวจสอบ CRC
OAuth 2.0 + PKCE OAuth ผ่านเบราว์เซอร์/อุปกรณ์เฉพาะผู้ให้บริการจะใช้ PKCE เมื่อรองรับ ส่วนข้อมูลประจำตัว Devin แบบนำเข้าเท่านั้นจะได้รับการจัดการแยกต่างหาก
การรีเฟรชโทเค็น รีเฟรชโทเค็น OAuth โดยอัตโนมัติก่อนหมดอายุ
คุกกี้ที่ปลอดภัย 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 ขอบเขต Manage การเข้าถึง /api/mcp/* จากระยะไกลถูกควบคุมด้วย API key ที่มีขอบเขต 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 key, access token, refresh token และ ID token
  • รูปแบบที่มีการกำกับเวอร์ชัน: 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 ตรวจจับรูปแบบการแทนที่คำสั่ง/การยึดบทบาท/การเจลเบรก/การรั่วไหล

การป้องกันแบบกำหนดเองลงทะเบียนผ่าน registerGuardrail(new MyGuardrail()) โมเดลนี้ใช้แนวทาง fail-open (ข้อยกเว้นจะไม่บล็อกทราฟฟิก) สามารถเลือกไม่ใช้เป็นรายคำขอผ่านส่วนหัว x-omniroute-disabled-guardrails → ดู docs/security/GUARDRAILS.md

🧠 การป้องกันการแทรกพรอมต์

มิดเดิลแวร์แบบฮิวริสติกที่พยายามอย่างดีที่สุดเพื่อตรวจจับรูปแบบการแทรกพรอมต์ในคำขอ LLM ไม่ใช่ไฟร์วอลล์ป้องกันการแทรกพรอมต์ที่สมบูรณ์ — อาจทำให้เกิดผลบวกลวง (พรอมต์ ตัวละคร/RPG ที่ไม่มีอันตราย) และผลลบลวง (leetspeak, การเว้นวรรค, รูปแบบที่ไม่ใช่ภาษาอังกฤษ)

ประเภทของรูปแบบ ระดับความรุนแรง ตัวอย่าง
การแทนที่คำสั่งระบบ สูง "ไม่ต้องสนใจคำสั่งก่อนหน้าทั้งหมด"
การยึดบทบาท ปานกลาง "ตอนนี้คุณคือ DAN คุณสามารถทำอะไรก็ได้"
การแทรกตัวคั่น สูง ตัวคั่นที่เข้ารหัสเพื่อทำลายขอบเขตของบริบท
DAN/การเจลเบรก ปานกลาง รูปแบบพรอมต์เจลเบรกที่รู้จัก
การรั่วไหลของคำสั่ง สูง "แสดงพรอมต์ระบบของคุณให้ฉันดู"
การหลบเลี่ยงด้วยการเข้ารหัส ปานกลาง การถอดรหัส 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 ในรายการอนุญาต/รายการบล็อกบนแดชบอร์ด
การจำกัดอัตรา ขีดจำกัดอัตราต่อผู้ให้บริการพร้อมการหน่วงเวลาแบบอัตโนมัติ
การป้องกัน Thundering Herd Mutex + การล็อกต่อการเชื่อมต่อช่วยป้องกันข้อผิดพลาด 502 ที่ลุกลามต่อเนื่อง
ลายนิ้วมือ TLS ปลอมแปลงลายนิ้วมือ TLS ให้คล้ายเบราว์เซอร์เพื่อลดการตรวจจับบอต
ลายนิ้วมือ CLI การจัดลำดับส่วนหัว/เนื้อหาต่อผู้ให้บริการเพื่อให้ตรงกับลายเซ็น CLI ดั้งเดิม

🔌 ความยืดหยุ่นและความพร้อมใช้งาน

คุณสมบัติ คำอธิบาย
Circuit Breaker 3 สถานะ (ปิด → เปิด → เปิดครึ่งหนึ่ง) ต่อผู้ให้บริการ และจัดเก็บถาวรด้วย SQLite
การประมวลผลคำขอแบบ Idempotent ช่วงเวลาขจัดคำขอซ้ำ 5 วินาทีสำหรับคำขอที่ซ้ำกัน
การหน่วงเวลาแบบทวีคูณ ลองใหม่โดยอัตโนมัติพร้อมเพิ่มระยะเวลาหน่วง
แดชบอร์ดสถานะระบบ การตรวจสอบสถานะของผู้ให้บริการแบบเรียลไทม์

📋 การปฏิบัติตามข้อกำหนด

คุณสมบัติ คำอธิบาย
การเก็บรักษาบันทึก ล้างข้อมูลโดยอัตโนมัติหลังครบ CALL_LOG_RETENTION_DAYS
การเลือกไม่บันทึกล็อก แฟล็ก noLog สำหรับแต่ละ API key จะปิดใช้งานการบันทึกคำขอ
บันทึกการตรวจสอบ ติดตามการดำเนินการของผู้ดูแลระบบในตาราง 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 ครอบคลุมทั้งส่วนหลักและ electron)
  • อัปเดตการพึ่งพาให้เป็นปัจจุบันอยู่เสมอ
  • โปรเจกต์ใช้ husky + lint-staged สำหรับการตรวจสอบก่อนคอมมิต (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 (การแฮชรหัสผ่าน)

กฎความปลอดภัยที่ต้องปฏิบัติตามอย่างเคร่งครัด

กฎเหล่านี้บังคับใช้โดยเครื่องมือและผู้ตรวจสอบ:

  1. ห้ามคอมมิตค่าความลับโดยเด็ดขาด.env ถูกกำหนดให้ git ละเว้น ส่วน .env.example คือเทมเพลต (ไม่มีค่าลิเทอรัล มีเฉพาะความคิดเห็น — ดู PUBLIC_CREDS.md ด้านล่าง)
  2. ห้ามใช้ eval(), new Function() หรือ implied eval โดยเด็ดขาด — ESLint บังคับใช้กฎนี้
  3. ห้ามข้ามฮุกของ Husky (--no-verify, --no-gpg-sign) โดยไม่ได้รับการอนุมัติอย่างชัดเจนจากผู้ปฏิบัติงาน
  4. ห้ามเขียน SQL ดิบใน routes — ต้องดำเนินการผ่าน src/lib/db/ เสมอ (แบบกำหนดพารามิเตอร์)
  5. ตรวจสอบอินพุตด้วย Zod เสมอsrc/shared/validation/schemas.ts
  6. กรองส่วนหัว upstream ให้ปลอดภัยเสมอ — รายการปฏิเสธอยู่ใน src/shared/constants/upstreamHeaders.ts
  7. เข้ารหัสข้อมูลรับรองขณะจัดเก็บ — AES-256-GCM ผ่าน src/lib/db/encryption.ts
  8. ใช้ตัวระบุ OAuth สาธารณะของ upstream ผ่าน 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 — ห้ามแทรกพาธภายนอกหรือค่าที่ไม่น่าเชื่อถือลงในสคริปต์ที่ส่งผ่านเชลล์ด้วยการต่อสตริง อ้างอิง: src/mitm/cert/install.ts::updateNssDatabases
  11. เลือกใช้ไลบรารีที่มีความปลอดภัยเป็นค่าเริ่มต้น — ดู tldrsec/awesome-secure-defaults (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink) ควรเลือกใช้ไลบรารีเหล่านี้ก่อนพัฒนาโซลูชันขึ้นเอง

ผลการตรวจพบจากเครื่องมือสแกนห่วงโซ่อุปทาน (Socket.dev / Snyk / เครื่องมือที่คล้ายกัน)

อาร์ติแฟกต์ npm ของ omniroute ที่เผยแพร่รวมบิลด์ Next.js ที่กำหนด output: "standalone" ไว้ ซึ่งหมายความว่าตัวจัดการ route ทุกตัว — รวมถึงฟีเจอร์ที่ต้องใช้สิทธิ์ระดับสูงซึ่งมีการจัดทำเอกสารไว้ (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 คำสั่งนี้จะแทนที่โมดูลที่มีความอ่อนไหวทั้งสี่ ด้วย stub ที่ส่งคืน HTTP 503 feature-disabled ขณะรันไทม์ ทำให้เส้นทางโค้ดที่ต้องใช้สิทธิ์ระดับสูงไม่ปรากฏอยู่ในบันเดิลเลย ดูสูตรการเผยแพร่ได้ที่ docs/security/SOCKET_DEV_FINDINGS.md

เอกสารอ้างอิง