# 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) · 🇮🇷 [fa](../fa/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) · 🇹🇷 [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 issue แบบสาธารณะ 2. ใช้ [GitHub Security Advisories](https://github.com/diegosouzapw/OmniRoute/security/advisories/new) 3. ระบุ: คำอธิบาย ขั้นตอนการทำซ้ำ และผลกระทบที่อาจเกิดขึ้น ## กรอบเวลาการตอบสนอง | ขั้นตอน | เป้าหมาย | | -------------------- | ----------------------- | | การรับทราบ | 48 ชั่วโมง | | การคัดกรองและประเมิน | 5 วันทำการ | | การเผยแพร่แพตช์ | 14 วันทำการ (กรณีวิกฤต) | ## เวอร์ชันที่รองรับ | เวอร์ชัน | สถานะการรองรับ | | -------- | ----------------------------------------------- | | 3.9.x | 🗓️ วางแผนไว้ — สาย LTS (`stable/v3`) ดูด้านล่าง | | 3.8.x | ✅ ใช้งานอยู่ | | 3.7.x | ✅ รองรับด้านความปลอดภัย | | < 3.7.0 | ❌ ไม่รองรับ | ## ช่วงเวลาการรองรับ LTS (v3.9.x) หลังจาก 3.8.59 เวอร์ชันถัดไปคือ **3.9.0** ซึ่งจะเปิดสายการรองรับระยะยาวบน สาขา `stable/v3` (ดู [`ROADMAP.md`](ROADMAP.md) → "Phase 3 — v3.9.0 LTS") - **สิ่งที่ `stable/v3` จะได้รับ:** การแก้ไขข้อบกพร่อง แพตช์ความปลอดภัย และการอัปเดตผู้ให้บริการ ฟีเจอร์ ใหม่จะไปยังช่อง v4 ส่วนสาย LTS จะให้ความสำคัญกับเสถียรภาพเป็นอันดับแรก `npm install omniroute` (`latest` dist-tag) จะยังคงอยู่บน v3 ตลอดทั้งวงจร v4 - **ระยะเวลาของช่วงการรองรับ:** `` ระยะเวลา ของช่วงการรองรับหลังจาก v4.0 GA (เมื่อ `latest` เปลี่ยนไปเป็น v4) **ยังไม่ได้รับการตัดสินใจ**; ส่วนนี้จะได้รับการอัปเดตเมื่อผู้ดูแลประกาศ ก่อนหน้านั้น อย่าคาดการณ์วันที่สิ้นสุด - **การรายงานช่องโหว่ในสาย LTS:** ใช้ช่องทางเดียวกับเวอร์ชันอื่น — [GitHub Security Advisory](https://github.com/diegosouzapw/OmniRoute/security/advisories/new) แบบส่วนตัว และห้ามใช้ issue สาธารณะ ระบุเวอร์ชันที่คุณทดสอบ (ตัวอย่างเช่น `3.9.2`); การแก้ไขจะรวมเข้าใน `stable/v3` และส่งต่อไปยัง v4 - **ค่าพื้นฐานด้านความปลอดภัย ณ จุดแยก LTS:** สถานะที่วัดได้จากเครื่องมือสแกน หลักฐานเกี่ยวกับตัวป้องกันเส้นทาง และ ข้อมูลประจำตัวสาธารณะ จะถูกบันทึกไว้ใน [`docs/security/LTS_SECURITY_BASELINE.md`](docs/security/LTS_SECURITY_BASELINE.md) --- ## สถาปัตยกรรมความปลอดภัย 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:::` - โหมดส่งผ่าน (ข้อความธรรมดา) เมื่อไม่ได้ตั้งค่า `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 | ตรวจจับรูปแบบการเขียนทับ/ยึดบทบาท/แหกข้อจำกัด/ข้อมูลรั่วไหล | ลงทะเบียนมาตรการป้องกันแบบกำหนดเองผ่าน `registerGuardrail(new MyGuardrail())` โมเดลนี้เป็นแบบ fail-open (ข้อยกเว้นจะไม่ปิดกั้นทราฟฟิก) สามารถเลือกไม่ใช้เป็นรายคำขอผ่านส่วนหัว `x-omniroute-disabled-guardrails` → ดู [`docs/security/GUARDRAILS.md`](docs/security/GUARDRAILS.md) ### 🧠 ตัวป้องกันการแทรกคำสั่งพรอมต์ มิดเดิลแวร์แบบฮิวริสติกที่ใช้ความพยายามอย่างเต็มที่เพื่อตรวจจับรูปแบบการแทรกคำสั่งในคำขอ LLM **ไม่ใช่ไฟร์วอลล์ป้องกันการแทรกคำสั่งที่สมบูรณ์** — อาจเกิดผลบวกลวง (พรอมต์เกี่ยวกับตัวตน/เกมสวมบทบาทที่ไม่เป็นอันตราย) และผลลบลวง (ภาษาลีต การเว้นวรรค หรือรูปแบบที่ไม่ใช่ภาษาอังกฤษ) | ประเภทรูปแบบ | ระดับความรุนแรง | ตัวอย่าง | | --------------------------- | --------------- | ---------------------------------------------- | | การแทนที่คำสั่งระบบ | สูง | "ละเว้นคำสั่งก่อนหน้าทั้งหมด" | | การยึดบทบาท | ปานกลาง | "ตอนนี้คุณคือ DAN และคุณสามารถทำอะไรก็ได้" | | การแทรกตัวคั่น | สูง | ตัวคั่นที่เข้ารหัสเพื่อทำลายขอบเขตของบริบท | | DAN/การเจลเบรก | ปานกลาง | รูปแบบพรอมต์เจลเบรกที่เป็นที่รู้จัก | | การรั่วไหลของคำสั่ง | สูง | "แสดงพรอมต์ระบบของคุณให้ฉันดู" | | การหลบเลี่ยงด้วยการเข้ารหัส | ปานกลาง | การถอดรหัส 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 # ขอให้เขียน 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 | | **การประมวลผลคำขอซ้ำอย่างปลอดภัย** | ช่วงเวลาตัดคำขอซ้ำ 5 วินาทีสำหรับคำขอที่ซ้ำกัน | | **การหน่วงเวลาแบบเอ็กซ์โพเนนเชียล** | ลองใหม่โดยอัตโนมัติพร้อมเพิ่มระยะเวลาหน่วง | | **แดชบอร์ดสถานะระบบ** | การตรวจสอบสถานะของผู้ให้บริการแบบเรียลไทม์ | ### 📋 การปฏิบัติตามข้อกำหนด | คุณสมบัติ | คำอธิบาย | | --------------------------------- | ------------------------------------------------------------------------ | | **การเก็บรักษาบันทึก** | ล้างข้อมูลโดยอัตโนมัติหลังจาก `CALL_LOG_RETENTION_DAYS` | | **การเลือกไม่บันทึกข้อมูล** | แฟล็ก `noLog` ต่อคีย์ API จะปิดใช้งานการบันทึกคำขอ | | **บันทึกการตรวจสอบ** | ติดตามการดำเนินการของผู้ดูแลระบบในตาราง `audit_log` | | **การตรวจสอบ MCP** | การบันทึกการตรวจสอบที่ใช้ SQLite สำหรับการเรียกใช้เครื่องมือ MCP ทั้งหมด | | **การตรวจสอบความถูกต้องด้วย Zod** | อินพุต API ทั้งหมดได้รับการตรวจสอบด้วยสคีมา Zod v4 เมื่อโหลดโมดูล | --- ## ตัวแปรสภาพแวดล้อมที่จำเป็น ต้องกำหนดค่าความลับทั้งหมดก่อนเริ่มต้นเซิร์ฟเวอร์ เซิร์ฟเวอร์จะ **หยุดทำงานทันที** หากค่าเหล่านี้ขาดหายไปหรือไม่รัดกุมเพียงพอ ```bash # จำเป็น — เซิร์ฟเวอร์จะไม่เริ่มทำงานหากไม่มีค่าเหล่านี้: 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 ```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) - อัปเดตการขึ้นต่อกันให้เป็นปัจจุบันอยู่เสมอ - โปรเจกต์ใช้ `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 ดิบใน route** — ต้องดำเนินการผ่าน `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`](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 อาร์ติแฟกต์ npm `omniroute` ที่เผยแพร่จะรวมบิลด์ Next.js ที่ใช้ `output: "standalone"` ซึ่งหมายความว่าตัวจัดการรูตทุกตัว — รวมถึงฟีเจอร์ที่มีสิทธิ์ระดับสูงซึ่งมีเอกสารกำกับ (MITM, การนำเข้าจาก Zed, Cloud Sync, ตัวควบคุมดูแลบริการแบบฝังตัว) — จะไปอยู่ ในชังก์ย่อขนาด `.next/server/*.js` เครื่องมือสแกนซัพพลายเชนแบบฮิวริสติก มักจับคู่รูปแบบในชังก์เหล่านั้นกับลายเซ็นของมัลแวร์ การกำหนดค่าเครื่องมือสแกนที่เราใช้อยู่ใน [`socket.yml`](socket.yml) ที่รากของ รีโพ (รูปแบบ Socket.dev GitHub App v2 — ดู ) โดยยกเว้น ไดเรกทอรีที่ไม่ได้จัดส่งอย่างชัดเจน (`tests/`, `_tasks/`, `_references/`, `_ideia/`, `_mono_repo/`, `docs/` ฯลฯ) เพื่อให้เครื่องมือสแกนรายงานเฉพาะเส้นทางโค้ดที่ เข้าถึงผู้ใช้ของแพ็กเกจที่เผยแพร่จริง — การสแกนดำเนินการโดย Socket GitHub App ซึ่งอ่านไฟล์ดังกล่าว ไม่ใช่โดยเวิร์กโฟลว์ในรีพอซิทอรีนี้ สำหรับผลการตรวจสอบแต่ละหมวดหมู่ เราจัดทำคำรับรองจากผู้ดูแลแยกตามผลการตรวจสอบไว้ดังนี้: - **[`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` การดำเนินการนี้จะแทนที่โมดูลที่ มีความอ่อนไหวทั้งสี่รายการด้วยสตับที่ส่งคืน 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 fingerprinting (ประกาศด้านกฎหมาย/จริยธรรม) - [`CLAUDE.md`](CLAUDE.md) — กฎที่ต้องปฏิบัติตามอย่างเคร่งครัดสำหรับเอเจนต์ AI - [tldrsec/awesome-secure-defaults](https://github.com/tldrsec/awesome-secure-defaults) — ไลบรารีที่ตั้งค่าเริ่มต้นให้ปลอดภัยซึ่งผ่านการคัดสรรมาแล้ว