أمن RAG: الدليل الكامل
Securing Retrieval-Augmented Generation systems against document poisoning, retrieval manipulation, and embedding attacks
Updated: August 2026 • تقنيات الحقن
ما هو 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. الاسترجاع
تم استرداد المستندات المماثلة من قاعدة بيانات المتجهات
4. التعزيز
تمت إضافة السياق المسترد للمطالبة
5. إنشاء
LLM تنشئ استجابة باستخدام السياق
مفارقة الثقة
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. معالجة الاسترجاع
التلاعب بالمستندات التي يتم استردادها للتأثير على المخرجات.
كيف يعمل
- يقوم المهاجم بصياغة استعلامات لتحفيز استرجاع محدد
- يستغل نقاط الضعف في خوارزمية الترتيب
- يستخدم التشابه الدلالي لاسترجاع الاختطاف
- المعالجة عبر المستخدمين في الأنظمة المشتركة
التأثير
- فرض استرجاع المحتوى الذي يتحكم فيه المهاجم
- يمكن منع المحتوى الشرعي
- تمكين المعالجة المستهدفة
- يكسر الثقة في جودة الاسترداد
3. انعكاس التضمين
استرداد البيانات الأصلية من التضمين ناقلات.
كيف يعمل
- يحصل المهاجم على إمكانية الوصول إلى قاعدة بيانات المتجهات
- يستخدم تقنيات الانعكاس على عمليات التضمين
- إعادة بناء النص الأصلي من المتجهات
- يستعيد البيانات المضمنة الحساسة
التأثير
- Recover 50-70% of input words
- كشف البيانات الحساسة في عمليات التضمين
- انتهاكات الخصوصية
- مشكلات الامتثال (اللائحة العامة لحماية البيانات، وما إلى ذلك)
4. الهجمات عبر المستأجرين
استغلال البنية التحتية المشتركة لـ RAG في الأنظمة متعددة المستأجرين.
كيف يعمل
- المهاجم هو أحد مستأجري النظام المشترك
- انتحال الهوية في الأنظمة متعددة الوكلاء
- استغلال قاعدة بيانات المتجهات المشتركة
- يسترد البيانات من المستأجرين الآخرين
التأثير
- تسرب البيانات بين المستأجرين
- الوصول غير المصرح به إلى بيانات المنافس
- انتهاكات الامتثال
- أضرار السمعة
CVEs في العالم الحقيقي
نقاط الضعف الموثقة في أنظمة RAG.
| معرف CVE | المنتج | الوصف | الخطورة | 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. أمان مرحلة العرض
التحقق من صحة المستندات
- فحص جميع المستندات بحثًا عن البرامج الضارة
- التحقق من تنسيق المستند وبنيته
- التحقق من وجود أنماط محتوى مشبوهة
- الحد من أنواع المستندات المسموح بها
تصفية المحتوى
- إزالة معلومات تحديد الهوية الشخصية قبل التضمين
- تصفية أنماط البيانات الحساسة
- حظر الأنماط الضارة المعروفة
- تنفيذ قوائم السماح/الحظر
عناصر التحكم في الوصول
- التحقق من صحة مصدر المستندات
- تنفيذ RBAC للعرض
- مسار التدقيق لجميع التحميلات
- عزل المستندات الجديدة
2. أمان مرحلة الاسترداد
تطهير الاستعلام
- التحقق من صحة استعلامات المستخدم وتصحيحها
- كشف محاولات الحقن
- الحد من تعقيد الاستعلام
- تحديد المعدل
تصفية الاسترجاع
- تنفيذ إعادة ترتيب الأمان
- المرجع الترافقي مع مصادر موثوقة
- كشف أنماط الاسترجاع الشاذة
- الحد من عدد المستندات
عزل الإيجارات المتعددة
- مساحات أسماء المتجهات المنفصلة
- حدود المستأجرين الصارمة
- منع الاستعلام بين المستأجرين
- التشفير لكل مستأجر
3. أمن مرحلة الجيل
التحقق من صحة الإخراج
- التحقق من صحة مخرجات LLM
- التحقق من المحتوى المُدرج
- التحقق من الحقائق مقابل المصادر
- تصفية المحتوى
التحقق من السياق
- التحقق من صحة المحتوى المسترد
- الكشف عن محاولات التلاعب
- وضع علامة على أنماط السياق غير المعتادة
- تسجيل استخدام السياق بأكمله
الإنسان في الحلقة
- مراجعة المخرجات الحساسة
- الموافقة على الإجراءات عالية المخاطر
- إمكانية التجاوز اليدوي
- مسارات التصعيد
4. أمن البيانات
التشفير
- تشفير المتجهات في حالة عدم النشاط
- TLS للبيانات أثناء النقل
- أفضل ممارسات إدارة المفاتيح
- النظر في التشفير المتماثل
أمان قاعدة بيانات المتجهات
- المصادقة القوية
- عزل الشبكة
- عمليات تدقيق الأمان المنتظمة
- إدارة التصحيح
حماية الخصوصية
- تقليل البيانات
- اكتشاف معلومات تحديد الهوية الشخصية وإزالتها
- سياسات الاحتفاظ
- الحق في دعم الحذف
منهجية الاختبار
قائمة التحقق من اختبار أمان RAG
- اختبارات حقن المستندات
- اختبارات معالجة الاسترجاع
- محاولات الانعكاس
- اختبارات العزل بين المستأجرين
- اختبارات تسرب معلومات تحديد الهوية الشخصية (PII)
- اختبارات تجاوز السياق
- اختبارات معالجة الترتيب
- اختبارات تجاوز المصادقة
- اختبارات حقن واجهة برمجة التطبيقات
- اختبارات رفض الخدمة
- اختبارات استخراج البيانات
- تدقيق الامتثال
أدوات الاختبار
أمثلة على التعليمات البرمجية
مثال للتحقق من صحة المستند
```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
}
```