الدفاع في العمق
ينفذ Triggerfish الأمان كـ 13 طبقة مستقلة ومتداخلة. لا توجد طبقة واحدة كافية بمفردها. معاً تشكل دفاعاً يتدهور بشكل رشيق -- حتى لو تم اختراق طبقة واحدة، تستمر الطبقات المتبقية في حماية النظام.
SECURITY الدفاع في العمق يعني أن ثغرة في أي طبقة فردية لا تخترق
النظام. المهاجم الذي يتجاوز مصادقة القناة لا يزال يواجه تتبع taint الجلسة، hooks السياسات، وتسجيل التدقيق. LLM الذي تعرض لحقن prompt لا يزال غير قادر على التأثير على طبقة السياسات الحتمية أسفله. :::
الطبقات الـ 13
الطبقة 1: مصادقة القناة
تحمي ضد: الانتحال، الوصول غير المصرح به، الخلط في الهوية.
يتم تحديد الهوية بواسطة الكود عند إنشاء الجلسة، وليس بواسطة LLM الذي يفسر محتوى الرسالة. قبل أن يرى LLM أي رسالة، يقوم محول القناة بوضع تسمية غير قابلة للتغيير:
{ source: "owner" } -- هوية القناة المُتحقق منها تطابق المالك المسجل
{ source: "external" } -- أي شخص آخر؛ إدخال فقط، لا يُعامل كأمرتختلف طرق المصادقة حسب القناة:
| القناة | الطريقة | التحقق |
|---|---|---|
| Telegram / WhatsApp | رمز اقتران | رمز لمرة واحدة، انتهاء صلاحية 5 دقائق، يُرسل من حساب المستخدم |
| Slack / Discord / Teams | OAuth | تدفق موافقة OAuth للمنصة، يُعيد معرف مستخدم مُتحقق منه |
| CLI | عملية محلية | يعمل على جهاز المستخدم، مُصادق عليه من نظام التشغيل |
| WebChat | لا يوجد (عام) | جميع الزوار EXTERNAL، ليسوا أبداً owner |
| البريد الإلكتروني | مطابقة النطاق | مقارنة نطاق المرسل مع النطاقات الداخلية المُكوّنة |
لا يقرر LLM أبداً من هو المالك. رسالة تقول "أنا المالك" من مرسل غير
مُتحقق منه تُوسم بـ { source: "external" } ولا يمكنها تشغيل أوامر مستوى المالك. هذا القرار يُتخذ في الكود، قبل أن يعالج LLM الرسالة. :::
الطبقة 2: الوصول للبيانات المدرك للصلاحيات
تحمي ضد: الوصول المفرط للبيانات، تصعيد الامتيازات من خلال بيانات اعتماد النظام.
يستخدم Triggerfish رموز OAuth المُفوضة من المستخدم -- وليس حسابات خدمة النظام -- لاستعلام الأنظمة الخارجية. يفرض النظام المصدر نموذج صلاحياته الخاص:
يفرض Plugin SDK هذا على مستوى API:
| طريقة SDK | السلوك |
|---|---|
sdk.get_user_credential(integration) | يُعيد رمز OAuth المُفوض من المستخدم |
sdk.query_as_user(integration, query) | يُنفذ بصلاحيات المستخدم |
sdk.get_system_credential(name) | محظور -- يُثير PermissionError |
الطبقة 3: تتبع Taint الجلسة
تحمي ضد: تسرب البيانات من خلال تلوث السياق، وصول البيانات المصنفة إلى قنوات أقل تصنيفاً.
كل جلسة تتبع بشكل مستقل مستوى taint يعكس أعلى تصنيف للبيانات التي تم الوصول إليها خلال الجلسة. يتبع Taint ثلاثة ثوابت:
- لكل محادثة -- كل جلسة لها taint خاص بها
- التصعيد فقط -- يزداد taint، ولا ينخفض أبداً
- إعادة التعيين الكاملة تمسح كل شيء -- يُمسح taint والسجل معاً
عندما يُقيّم محرك السياسات مخرجاً، يقارن taint الجلسة مع التصنيف الفعلي للقناة المستهدفة. إذا تجاوز taint الهدف، يُحظر المخرج.
الطبقة 4: نسب البيانات
تحمي ضد: تدفقات بيانات غير قابلة للتتبع، عدم القدرة على تدقيق أين ذهبت البيانات، فجوات الامتثال.
كل عنصر بيانات يحمل بيانات وصفية للمنشأ من المصدر إلى الوجهة:
- المصدر: أي تكامل وسجل ووصول مستخدم أنتج هذه البيانات
- التصنيف: أي مستوى تم تعيينه ولماذا
- التحويلات: كيف عدّل LLM البيانات أو لخصها أو جمعها
- الوجهة: أي جلسة وقناة استلمت المخرج
يمكّن النسب من التتبع الأمامي ("أين ذهب سجل Salesforce هذا؟")، والتتبع الخلفي ("ما المصادر التي ساهمت في هذا المخرج؟")، والتصدير الكامل للامتثال.
الطبقة 5: hooks تنفيذ السياسات
تحمي ضد: هجمات حقن prompt، تجاوزات أمنية بواسطة LLM، تنفيذ أدوات غير متحكم فيه.
ثمانية hooks حتمية تعترض كل إجراء في نقاط حرجة في تدفق البيانات:
| Hook | ما يعترضه |
|---|---|
PRE_CONTEXT_INJECTION | المدخلات الخارجية التي تدخل نافذة السياق |
PRE_TOOL_CALL | طلب LLM لتنفيذ أداة |
POST_TOOL_RESPONSE | البيانات العائدة من تنفيذ الأداة |
PRE_OUTPUT | الاستجابة على وشك مغادرة النظام |
SECRET_ACCESS | طلب الوصول لبيانات اعتماد |
SESSION_RESET | طلب إعادة تعيين taint |
AGENT_INVOCATION | استدعاء وكيل لوكيل آخر |
MCP_TOOL_CALL | استدعاء أداة خادم MCP |
hooks هي كود صرف: حتمية، متزامنة، مُسجلة، وغير قابلة للتزوير. لا يستطيع LLM تجاوزها لأنه لا يوجد مسار من مخرجات LLM إلى تكوين hook. طبقة hook لا تحلل مخرجات LLM بحثاً عن أوامر.
الطبقة 6: MCP Gateway
تحمي ضد: الوصول غير المتحكم فيه للأدوات الخارجية، بيانات غير مصنفة تدخل عبر خوادم MCP، انتهاكات المخطط.
جميع خوادم MCP تبدأ كـ UNTRUSTED ولا يمكن استدعاؤها حتى يصنفها مسؤول أو مستخدم. يفرض Gateway:
- مصادقة الخادم وحالة التصنيف
- صلاحيات على مستوى الأداة (يمكن حظر أدوات فردية حتى لو كان الخادم مسموحاً به)
- التحقق من مخطط الطلب/الاستجابة
- تتبع taint على جميع استجابات MCP
- فحص أنماط الحقن في المعاملات
الطبقة 7: عزل Plugin
تحمي ضد: كود plugin خبيث أو به أخطاء، استخراج البيانات، الوصول غير المصرح به للنظام.
تعمل plugins داخل عزل مزدوج:
لا تستطيع plugins:
- الوصول إلى نقاط نهاية شبكة غير مُعلنة
- إصدار بيانات بدون تسميات تصنيف
- قراءة بيانات بدون تشغيل انتشار taint
- تخزين بيانات خارج Triggerfish
- استخدام بيانات اعتماد النظام (فقط بيانات اعتماد المستخدم المُفوضة)
- التسريب عبر قنوات جانبية (حدود الموارد، بدون مآخذ خام)
عزل plugin يختلف عن بيئة exec الوكيل. plugins هي كود غير موثوق يحمي
النظام منه. بيئة exec هي مساحة عمل حيث يُسمح للوكيل بالبناء -- مع وصول محكوم بالسياسات، وليس عزل sandbox. :::
الطبقة 8: عزل الأسرار
تحمي ضد: سرقة بيانات الاعتماد، الأسرار في ملفات التكوين، تخزين بيانات الاعتماد بنص عادي.
يتم تخزين بيانات الاعتماد في سلسلة مفاتيح نظام التشغيل (المستوى الشخصي) أو تكامل الخزنة (المستوى المؤسسي). لا تظهر أبداً في:
- ملفات التكوين
- قيم
StorageProvider - إدخالات السجل
- سياق LLM (يتم حقن بيانات الاعتماد في طبقة HTTP، أسفل LLM)
يسجل hook SECRET_ACCESS كل وصول لبيانات اعتماد مع plugin الطالب ونطاق بيانات الاعتماد والقرار.
الطبقة 9: عزل أداة نظام الملفات
تحمي ضد: هجمات اجتياز المسار، الوصول غير المصرح به للملفات، تجاوز التصنيف عبر عمليات نظام الملفات المباشرة.
جميع عمليات أداة نظام الملفات (قراءة، كتابة، تحرير، سرد، بحث) تعمل داخل Deno Worker معزول بصلاحيات على مستوى نظام التشغيل محددة النطاق بدليل مساحة العمل الفرعي المناسب لـ taint الجلسة. يفرض العزل ثلاث حدود:
- سجن المسار — كل مسار يُحل إلى مسار مطلق ويُفحص مقابل جذر السجن بمطابقة مدركة للفاصل. محاولات الاجتياز (
../) التي تهرب من مساحة العمل تُرفض قبل أي عملية إدخال/إخراج - تصنيف المسار — كل مسار نظام ملفات يُصنف عبر سلسلة حل ثابتة: مسارات محمية مُرمزة (RESTRICTED)، أدلة تصنيف مساحة العمل، تعيينات المسارات المُكوّنة، ثم التصنيف الافتراضي. لا يستطيع الوكيل الوصول إلى مسارات أعلى من taint جلسته
- صلاحيات محددة بـ taint — صلاحيات Deno لـ Worker محددة بدليل مساحة العمل الفرعي المطابق لمستوى taint الحالي للجلسة. عند تصاعد taint، يُعاد إنشاء Worker بصلاحيات موسعة. يمكن للصلاحيات أن تتوسع فقط، ولا تضيق أبداً ضمن جلسة
- حماية الكتابة — الملفات الحرجة (
TRIGGER.md,triggerfish.yaml,SPINE.md) محمية من الكتابة في طبقة الأداة بغض النظر عن صلاحيات العزل. يمكن تعديل هذه الملفات فقط عبر أدوات إدارة مخصصة تفرض قواعد تصنيفها الخاصة
الطبقة 10: هوية الوكيل
تحمي ضد: تصعيد الامتيازات عبر سلاسل الوكلاء، غسل البيانات عبر التفويض.
عندما يستدعي الوكلاء وكلاء آخرين، تمنع سلاسل التفويض المشفرة تصعيد الامتيازات:
- كل وكيل لديه شهادة تحدد قدراته وسقف تصنيفه
- المُستدعى يرث
max(own taint, caller taint)-- يمكن لـ taint أن يزداد فقط عبر السلاسل - المُستدعي الذي يتجاوز taint سقف المُستدعى يُحظر
- الاستدعاءات الدائرية تُكتشف وتُرفض
- عمق التفويض محدود ومُنفذ
الطبقة 11: تسجيل التدقيق
تحمي ضد: الاختراقات غير القابلة للكشف، فشل الامتثال، عدم القدرة على التحقيق في الحوادث.
كل قرار متعلق بالأمان يُسجل مع سياق كامل:
json
{
"timestamp": "2025-01-29T10:23:45Z",
"user_id": "user_123",
"session_id": "sess_456",
"action": "slack.postMessage",
"target_channel": "external_webhook",
"session_taint": "CONFIDENTIAL",
"target_classification": "PUBLIC",
"decision": "DENIED",
"reason": "classification_violation",
"hook": "PRE_OUTPUT",
"policy_rules_evaluated": ["rule_001", "rule_002"],
"lineage_ids": ["lin_789", "lin_790"]
}ما يُسجل:
- جميع طلبات الإجراءات (المسموحة والمرفوضة)
- قرارات التصنيف
- تغييرات taint الجلسة
- أحداث مصادقة القناة
- تقييمات قواعد السياسات
- إنشاء وتحديث سجلات النسب
- قرارات MCP Gateway
- استدعاءات وكيل لوكيل
لا يمكن تعطيل تسجيل التدقيق. إنه قاعدة ثابتة في تسلسل السياسات الهرمي.
حتى مسؤول المنظمة لا يستطيع إيقاف التسجيل لإجراءاته الخاصة. يمكن لعمليات النشر المؤسسية تفعيل تسجيل المحتوى الكامل اختيارياً (بما في ذلك محتوى الرسائل المحظورة) للمتطلبات الجنائية. :::
الطبقة 12: منع SSRF
تحمي ضد: تزوير الطلبات من جانب الخادم، استطلاع الشبكة الداخلية، استخراج بيانات سحابة metadata.
جميع طلبات HTTP الصادرة (من web_fetch, browser.navigate, ووصول شبكة plugin) تحل DNS أولاً وتفحص عنوان IP المُحل مقابل قائمة حظر مُرمزة من النطاقات الخاصة والمحجوزة. هذا يمنع المهاجم من خداع الوكيل للوصول إلى خدمات داخلية عبر عناوين URL مُصاغة.
- نطاقات خاصة (
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16) محظورة دائماً - ربط محلي (
169.254.0.0/16) ونقاط نهاية metadata السحابة محظورة - Loopback (
127.0.0.0/8) محظور - قائمة الحظر مُرمزة وغير قابلة للتكوين -- لا يوجد تجاوز من المسؤول
- يحدث حل DNS قبل الطلب، مما يمنع هجمات إعادة ربط DNS
الطبقة 13: بوابة تصنيف الذاكرة
تحمي ضد: تسرب البيانات عبر الجلسات من خلال الذاكرة، خفض تصنيف عبر كتابات الذاكرة، الوصول غير المصرح به للذكريات المصنفة.
يفرض نظام الذاكرة عبر الجلسات التصنيف عند الكتابة والقراءة:
- الكتابة: تُجبر إدخالات الذاكرة على مستوى taint الجلسة الحالية. لا يستطيع LLM اختيار تصنيف أقل للذكريات المخزنة.
- القراءة: تُفلتر استعلامات الذاكرة بـ
canFlowTo-- يمكن للجلسة قراءة الذكريات فقط عند مستوى taint الحالي أو أقل.
هذا يمنع الوكيل من تخزين بيانات CONFIDENTIAL كـ PUBLIC في الذاكرة واستردادها لاحقاً في جلسة بـ taint أقل لتجاوز قاعدة منع الكتابة للأسفل.
تسلسل الثقة الهرمي
يحدد نموذج الثقة من لديه صلاحية على ماذا. لا تستطيع المستويات الأعلى تجاوز قواعد أمان المستويات الأدنى، لكن يمكنها تكوين المعاملات القابلة للتعديل ضمن تلك القواعد.
المستوى الشخصي: المستخدم هو مسؤول المنظمة. سيادة كاملة. بدون رؤية
من Triggerfish. ليس للمورد أي وصول إلى بيانات المستخدم افتراضياً ولا يمكنه الحصول على وصول إلا من خلال منح صريح ومحدد بالوقت ومُسجل من المستخدم. :::
كيف تعمل الطبقات معاً
فكر في هجوم حقن prompt حيث تحاول رسالة خبيثة استخراج البيانات:
| الخطوة | الطبقة | الإجراء |
|---|---|---|
| 1 | مصادقة القناة | الرسالة مُوسمة { source: "external" } -- ليس مالكاً |
| 2 | PRE_CONTEXT_INJECTION | يُفحص المدخل لأنماط الحقن، يُصنف |
| 3 | Taint الجلسة | taint الجلسة لم يتغير (لم يتم الوصول لبيانات مصنفة) |
| 4 | LLM يعالج الرسالة | قد يُتلاعب بـ LLM لطلب استدعاء أداة |
| 5 | PRE_TOOL_CALL | فحص صلاحية الأداة مقابل قواعد المصدر الخارجي |
| 6 | POST_TOOL_RESPONSE | أي بيانات مُعادة تُصنف، يُحدث taint |
| 7 | PRE_OUTPUT | يُفحص تصنيف المخرج مقابل الهدف |
| 8 | تسجيل التدقيق | يُسجل التسلسل بالكامل للمراجعة |
حتى لو تم اختراق LLM بالكامل في الخطوة 4 وطلب استدعاء أداة لاستخراج البيانات، تستمر الطبقات المتبقية (فحوصات الصلاحيات، تتبع taint، تصنيف المخرجات، تسجيل التدقيق) في تنفيذ السياسة. لا توجد نقطة فشل واحدة تخترق النظام.
