ความปลอดภัยและการรักษาความปลอดภัย
Rosetta ได้รับการออกแบบมาให้มีความปลอดภัยในสภาพแวดล้อมที่อาจมีภัยคุกคาม — ซึ่งข้อมูล locale อาจมาจากแหล่งที่ไม่น่าเชื่อถือ, การสร้างชื่อไฟล์ที่อาจหลุดรอดขอบเขตของไดเรกทอรี, และผลลัพธ์จาก LLM ที่อาจมีเนื้อหาใดๆ ก็ได้
รูปแบบภัยคุกคาม
| ภัยคุกคาม | ช่องทางการโจมตี | การบรรเทาผลกระทบ |
|---|---|---|
| Prototype pollution | คีย์ JSON ที่ถูกสร้างขึ้นมา (__proto__, constructor) | ปฏิเสธตั้งแต่ขั้นตอนการแยกวิเคราะห์ (Parse time) |
| Path traversal | รหัส Locale เช่น ../../etc/passwd | การเขียนไฟล์จะถูกตรวจสอบความถูกต้องให้อยู่ในไดเรกทอรีที่กำหนดไว้เท่านั้น |
| Code block corruption | LLM แปลเนื้อหาภายในบล็อกโค้ด | ป้องกันด้วย Unicode sentinel |
| Hallucinated keys | LLM ส่งคืนคีย์ที่ไม่ได้ถูกส่งไป | การตรวจสอบความถูกต้องของการตอบกลับ — จะเขียนเฉพาะคีย์ที่ได้รับการยอมรับเท่านั้น |
| Runaway token spend | การวนลูปลองใหม่แบบไม่สิ้นสุด | จำกัดงบประมาณผ่าน maxRetries |
การป้องกัน Prototype Pollution
คีย์ locale ทั้งหมดจะถูกตรวจสอบความถูกต้องกับ blocklist ก่อนการประมวลผล:
__proto__constructorprototype
คีย์ใดๆ ที่ตรงกับรูปแบบเหล่านี้จะถูกปฏิเสธและแสดงข้อผิดพลาด สิ่งนี้ช่วยป้องกันไม่ให้ผู้โจมตีใช้ไฟล์ locale ที่สร้างขึ้นมาเพื่อแก้ไข JavaScript object prototypes
การจำกัดขอบเขต Path
เมื่อเขียนไฟล์ locale rosetta จะตรวจสอบความถูกต้องว่า path ผลลัพธ์ยังคงอยู่ภายในไดเรกทอรีที่กำหนดไว้ (localesDir, contentDir) รหัส Locale จะถูกทำความสะอาด (Sanitized) — รหัสเช่น ../../secrets จะไม่สามารถเขียนออกไปนอกไดเรกทอรีที่คาดหวังได้
การป้องกันบล็อกเนื้อหา
ในระหว่างการแปลเนื้อหา Markdown องค์ประกอบที่มีโครงสร้างจะถูกแทนที่ด้วย Unicode sentinel placeholders ก่อนที่ข้อความจะถูกส่งไปยัง LLM:
- Code blocks (fenced และ inline) → sentinel
- Hugo shortcodes (
{{< >}},{{% %}}) → sentinel - Raw HTML → sentinel
- Interpolation variables (
{{ .Count }}) → sentinel
หลังจากการแปล sentinels จะถูกแทนที่กลับด้วยเนื้อหาต้นฉบับ LLM จะไม่เห็น code blocks, shortcodes หรือ HTML เลย — จึงไม่สามารถทำให้ข้อมูลเหล่านี้เสียหายได้
การตรวจสอบความถูกต้องของการตอบกลับ
เมื่อ LLM ส่งคืนการตอบกลับแบบ JSON rosetta จะตรวจสอบความถูกต้องว่า:
- มีเฉพาะคีย์ที่ถูกส่งไปในชุดข้อมูล (Batch) เท่านั้นที่ปรากฏในการตอบกลับ
- ไม่มีคีย์ส่วนเกินถูกแทรกเข้ามา
- การตอบกลับสามารถแยกวิเคราะห์เป็น JSON ที่ถูกต้องได้
คีย์ที่เกิดจากการ Hallucinate จะถูกละทิ้งไปอย่างเงียบๆ สิ่งนี้ช่วยป้องกันไม่ให้ผลลัพธ์จาก LLM แทรกการแปลที่ไม่คาดคิดลงในไฟล์ locale ของคุณ
Quality Gate
ทุกการแปลจะถูกตรวจสอบความถูกต้องผ่านการตรวจสอบแบบกำหนดได้ (Deterministic checks) 5 ขั้นตอนก่อนที่จะถูกเขียนลงดิสก์ ดูรายละเอียดเพิ่มเติมได้ที่ Quality Gate
Exponential Backoff
การเรียกใช้ API จะใช้ exponential backoff พร้อม jitter เมื่อได้รับการตอบกลับแบบ 429 (จำกัดอัตราการเรียก) และ 5xx (ข้อผิดพลาดของเซิร์ฟเวอร์) การลองใหม่ 3 ครั้งพร้อมการหน่วงเวลาที่เพิ่มขึ้นจะช่วยป้องกันการกระหน่ำเรียก API ในช่วงที่ระบบขัดข้อง
Request Timeout
ทุกคำขอ API จะมีการตั้งเวลาหมดอายุ (Timeout) ไว้ที่ 30 วินาทีผ่าน AbortController สิ่งนี้ช่วยป้องกันไม่ให้กระบวนการซิงค์ค้างไปตลอดกาลเมื่อการเชื่อมต่อขาดหาย
โหมด Fallback
เมื่อ API ไม่พร้อมใช้งาน --fallback จะเขียน placeholders ที่นำหน้าด้วย [EN] แทนการแปลจริง:
npx i18n-rosetta sync --fallback
{
"hero.title": "[EN] Welcome to our platform"
}
placeholders เหล่านี้จะถูกตรวจจับโดยอัตโนมัติและแปลใหม่อีกครั้งในการซิงค์ครั้งถัดไปด้วยคีย์ API ที่ถูกต้อง ระบบจะไม่ถือว่าข้อมูลเหล่านี้ "แปลแล้ว" — audit จะทำการติดแฟล็ก (Flag) แจ้งเตือน
การทดสอบ
คุณสมบัติด้านความปลอดภัยได้รับการตรวจสอบโดยชุดการทดสอบแบบ Adversarial:
npm run test:redteam # prototype pollution, path traversal, encoding attacks
ดูเพิ่มเติม
- สถาปัตยกรรม (Architecture) — ระบบนิเวศทั้งสามส่วนเชื่อมต่อกันอย่างไร
- ข้อมูลอ้างอิง CLI — integrity — คำสั่งตรวจสอบความสมบูรณ์ (Integrity)
- ข้อมูลอ้างอิง CLI — provenance — คำสั่งตรวจสอบแหล่งที่มา (Provenance)
- ข้อกำหนดของปลั๊กอิน (Plugin Specification) — ฟิลด์แหล่งที่มาใน plugin manifests
- Quality Gate — การตรวจสอบความปลอดภัยในระดับการแปล