RAG Security: คู่มือฉบับสมบูรณ์
Securing Retrieval-Augmented Generation systems against document poisoning, retrieval manipulation, and embedding attacks
Updated: August 2026 • ส่วนหนึ่งของ OWASP LLM08
RAG คืออะไร
Retrieval-Augmented Generation (RAG) is an AI architecture that combines large language models with external knowledge retrieval. Enterprise LLM deployments now use RAG extensively, making its security critical.
1. ข้อความค้นหาผู้ใช้
ผู้ใช้ส่งคำถามหรือข้อความแจ้งไปยังระบบ
2. การฝัง
ข้อความค้นหาถูกแปลงเป็นการฝังเวกเตอร์
3. การดึงข้อมูล
เอกสารที่คล้ายกันที่ดึงมาจาก vector DB
4. การเพิ่ม
เพิ่มบริบทที่ดึงมาในพรอมต์
5. การสร้าง
LLM สร้างการตอบสนองโดยใช้บริบท
The Trust Paradox
RAG systems have a fundamental security flaw: user queries are treated as untrusted input, but retrieved context is implicitly trusted - even though both enter the same prompt. This creates a significant attack surface that traditional security doesn't address.
เวกเตอร์การโจมตี
1. พิษจากเอกสาร||เวกเตอร์การโจมตี
การแทรกเนื้อหาที่เป็นอันตรายลงในเอกสารที่เก็บไว้ในฐานความรู้
วิธีการทำงาน
- ผู้โจมตีอัปโหลดหรือแทรกเอกสารที่เป็นอันตราย
- เอกสารถูกฝังและจัดเก็บไว้ในฐานข้อมูลเวกเตอร์
- เมื่อมีการสืบค้นที่เกี่ยวข้อง เอกสารที่ถูกวางยาจะถูกเรียกค้น
- LLM รวมบริบทที่เป็นอันตรายไว้ในการตอบสนอง
ผลกระทบ
- 90% success ด้วยเอกสารพิษเพียง 5 ฉบับ
- ใช้งานได้แม้ในฐานข้อมูลที่มีเอกสารนับล้าน
- อาจทำให้เกิดผลลัพธ์ที่เป็นอันตราย อคติ หรือไม่ถูกต้อง
- ตรวจพบได้ยากหลังจากการปรับใช้
2. การจัดการการดึงข้อมูล
การจัดการเอกสารที่จะดึงมาเพื่อมีอิทธิพลต่อเอาต์พุต
วิธีการทำงาน
- การสืบค้นของ Attacker เพื่อทริกเกอร์การดึงข้อมูลที่เฉพาะเจาะจง
- ใช้ประโยชน์จากจุดอ่อนของอัลกอริทึมการจัดอันดับ
- ใช้ความหมายที่คล้ายคลึงกันในการดึงข้อมูลการแย่งชิง
- การจัดการผู้ใช้ข้ามระบบในระบบที่ใช้ร่วมกัน
ผลกระทบ
- บังคับให้ดึงข้อมูลเนื้อหาที่ผู้โจมตีควบคุม
- สามารถระงับเนื้อหาที่ถูกต้องตามกฎหมาย
- เปิดใช้งานการจัดการแบบกำหนดเป้าหมาย
- ทำลายความไว้วางใจในคุณภาพการดึงข้อมูล
3. การฝังการผกผัน
การกู้คืนข้อมูลต้นฉบับจากการฝังเวกเตอร์
วิธีการทำงาน
- ผู้โจมตีได้รับสิทธิ์เข้าถึงฐานข้อมูลเวกเตอร์
- ใช้เทคนิคการกลับรายการในการฝัง
- สร้างข้อความต้นฉบับขึ้นใหม่จากเวกเตอร์
- กู้คืนข้อมูลที่ฝังตัวที่ละเอียดอ่อน
ผลกระทบ
- Recover 50-70% of input words
- เปิดเผยข้อมูลที่ละเอียดอ่อนในการฝัง
- การละเมิดความเป็นส่วนตัว
- ปัญหาด้านการปฏิบัติตามข้อกำหนด (GDPR ฯลฯ)
4. การโจมตีข้ามผู้เช่า
การใช้ประโยชน์จากโครงสร้างพื้นฐาน RAG ที่ใช้ร่วมกันในระบบที่มีผู้เช่าหลายราย
วิธีการทำงาน
- Attacker เป็นหนึ่งในผู้เช่าของระบบที่ใช้ร่วมกัน
- แทรกเนื้อหาที่ส่งผลกระทบต่อผู้เช่ารายอื่น
- ใช้ประโยชน์จากฐานข้อมูลเวกเตอร์ที่แชร์
- ดึงข้อมูลจากผู้เช่ารายอื่น
ผลกระทบ
- ข้อมูลรั่วไหลระหว่างผู้เช่า
- การเข้าถึงข้อมูลของคู่แข่งโดยไม่ได้รับอนุญาต
- การละเมิดการปฏิบัติตามข้อกำหนด
- ความเสียหายต่อชื่อเสียง
CVE ในโลกแห่งความเป็นจริง
บันทึกช่องโหว่ในระบบ RAG
| CVE ID | ผลิตภัณฑ์ | คำอธิบาย | ความรุนแรง | CVSS |
|---|---|---|---|---|
CVE-2025-68700 |
RAGFlow | RCE via Canvas CodeExec component - untrusted data parsed with eval() | Critical | 9.1 |
CVE-2025-69286 |
RAGFlow | Insecure API key generation allows mutual token derivation (authentication bypass) | Critical | 8.9 |
CVE-2025-25282 |
RAGFlow | IDOR vulnerability allowing cross-tenant access and unauthorized user addition | High | 8.1 |
CVE-2025-69286 |
RAGFlow | Token generation using same URLSafeTimedSerializer for API keys | High | 8.9 |
GHSA-8xw3-v6c2-j84j |
RAGFlow | RCE via stdout parsing in CodeExec component | High | 8.5 |
กลยุทธ์การป้องกัน
1. การรักษาความปลอดภัยขั้นตอนการนำเข้า
การตรวจสอบเอกสาร
- สแกนเอกสารทั้งหมดเพื่อหามัลแวร์
- ตรวจสอบความถูกต้องของรูปแบบและโครงสร้างเอกสาร
- ตรวจสอบรูปแบบเนื้อหาที่น่าสงสัย
- จำกัดประเภทเอกสารที่อนุญาต
การกรองเนื้อหา
- ลบ PII ออกก่อนที่จะฝัง
- กรองรูปแบบข้อมูลที่ละเอียดอ่อน
- บล็อกรูปแบบที่เป็นอันตรายที่ทราบ
- นำรายการที่อนุญาต/บล็อกไปใช้
การควบคุมการเข้าถึง
- ตรวจสอบแหล่งที่มาของเอกสาร
- ใช้ RBAC สำหรับการนำเข้า
- เส้นทางการตรวจสอบสำหรับการอัปโหลดทั้งหมด
- กักกันเอกสารใหม่
2. การรักษาความปลอดภัยระยะการเรียกข้อมูล
การทำความสะอาดแบบสอบถาม
- ตรวจสอบความถูกต้องและกำจัดคำถามของผู้ใช้
- ตรวจจับความพยายามในการแทรก
- จำกัดความซับซ้อนของการสืบค้น
- การจำกัดอัตรา
การกรองการดึงข้อมูล
- ใช้การรักษาความปลอดภัยในการจัดอันดับใหม่
- การอ้างอิงโยงกับแหล่งที่มาที่เชื่อถือได้
- ตรวจจับรูปแบบการดึงข้อมูลที่ผิดปกติ
- จำกัดจำนวนเอกสาร
การแยกผู้เช่าหลายราย
- เนมสเปซเวกเตอร์ที่แยกจากกัน
- ขอบเขตผู้เช่าที่เข้มงวด
- การป้องกันการสืบค้นข้ามผู้เช่า
- การเข้ารหัสต่อผู้เช่า
3. Generation Phase Security
การตรวจสอบความถูกต้องของเอาต์พุต
- ตรวจสอบความถูกต้องของเอาท์พุต LLM
- ตรวจสอบเนื้อหาที่แทรก
- ตรวจสอบข้อเท็จจริงกับแหล่งที่มา
- การกรองเนื้อหา
การตรวจสอบบริบท
- ตรวจสอบความถูกต้องของเนื้อหาที่ดึงมา
- ตรวจจับความพยายามในการบงการ
- ตั้งค่าสถานะรูปแบบบริบทที่ผิดปกติ
- บันทึกการใช้งานบริบททั้งหมด
Human-in-the-Loop
- ตรวจสอบเอาต์พุตที่ละเอียดอ่อน
- อนุมัติการดำเนินการที่มีความเสี่ยงสูง
- ความสามารถในการแทนที่ด้วยตนเอง
- เส้นทางการยกระดับ
4. ความปลอดภัยของข้อมูล
การเข้ารหัส
- เข้ารหัสเวกเตอร์ที่เหลือ
- TLS สำหรับข้อมูลที่อยู่ระหว่างทาง
- แนวทางปฏิบัติที่ดีที่สุดในการจัดการคีย์
- พิจารณาการเข้ารหัสแบบโฮโมมอร์ฟิก
ความปลอดภัยของเวกเตอร์ DB
- การตรวจสอบสิทธิ์ที่แข็งแกร่ง
- การแยกเครือข่าย
- การตรวจสอบความปลอดภัยเป็นประจำ
- การจัดการแพตช์
การคุ้มครองความเป็นส่วนตัว
- การลดขนาดข้อมูล
- การตรวจจับและกำจัด PII
- นโยบายการเก็บรักษา
- การสนับสนุนสิทธิ์ในการลบ
วิธีการทดสอบ
รายการตรวจสอบการทดสอบความปลอดภัยของ RAG
- การทดสอบการแทรกเอกสาร
- การทดสอบการจัดการการดึงข้อมูล
- ความพยายามในการฝังการผกผัน
- การทดสอบการแยกระหว่างผู้เช่า
- การทดสอบการรั่วไหลของ PII
- การทดสอบบริบทล้น
- การทดสอบการยักยอกอันดับ
- การทดสอบบายพาสการตรวจสอบสิทธิ์
- การทดสอบการแทรก API
- การทดสอบการปฏิเสธบริการ
- การทดสอบการกรองข้อมูล
- การตรวจสอบการปฏิบัติตามข้อกำหนด
เครื่องมือทดสอบ
ตัวอย่างโค้ด
ตัวอย่างการตรวจสอบเอกสาร
```python
import re
from typing import List
class RAGDocumentValidator:
SUSPICIOUS_PATTERNS = [
r"ignore previous instructions",
r"system prompt:",
r"{{.*}}",
r"you are now dan",
]
PII_PATTERNS = [
r"\b\d{3}-\d{2}-\d{4}\b", # SSN
r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b", # Email
r"\b\d{16}\b", # Credit card
]
def validate_document(self, content: str) -> dict:
"""Validate document before embedding."""
warnings = []
blocked = False
# Check for suspicious patterns
for pattern in self.SUSPICIOUS_PATTERNS:
if re.search(pattern, content, re.IGNORECASE):
warnings.append(f"Suspicious pattern: {pattern}")
blocked = True
# Check for PII
for pattern in self.PII_PATTERNS:
if re.search(pattern, content):
warnings.append(f"PII detected: {pattern}")
return {
"valid": not blocked,
"warnings": warnings,
"pii_detected": len([w for w in warnings if "PII" in w]) > 0
}
```