Skip to content

الدفاع في العمق

ينفذ Triggerfish الأمان كـ 13 طبقة مستقلة ومتداخلة. لا توجد طبقة واحدة كافية بمفردها. معاً تشكل دفاعاً يتدهور بشكل رشيق -- حتى لو تم اختراق طبقة واحدة، تستمر الطبقات المتبقية في حماية النظام.

SECURITY الدفاع في العمق يعني أن ثغرة في أي طبقة فردية لا تخترق

النظام. المهاجم الذي يتجاوز مصادقة القناة لا يزال يواجه تتبع taint الجلسة، hooks السياسات، وتسجيل التدقيق. LLM الذي تعرض لحقن prompt لا يزال غير قادر على التأثير على طبقة السياسات الحتمية أسفله. :::

الطبقات الـ 13

الطبقة 1: مصادقة القناة

تحمي ضد: الانتحال، الوصول غير المصرح به، الخلط في الهوية.

يتم تحديد الهوية بواسطة الكود عند إنشاء الجلسة، وليس بواسطة LLM الذي يفسر محتوى الرسالة. قبل أن يرى LLM أي رسالة، يقوم محول القناة بوضع تسمية غير قابلة للتغيير:

{ source: "owner" }    -- هوية القناة المُتحقق منها تطابق المالك المسجل
{ source: "external" } -- أي شخص آخر؛ إدخال فقط، لا يُعامل كأمر

تختلف طرق المصادقة حسب القناة:

القناةالطريقةالتحقق
Telegram / WhatsAppرمز اقترانرمز لمرة واحدة، انتهاء صلاحية 5 دقائق، يُرسل من حساب المستخدم
Slack / Discord / TeamsOAuthتدفق موافقة OAuth للمنصة، يُعيد معرف مستخدم مُتحقق منه
CLIعملية محليةيعمل على جهاز المستخدم، مُصادق عليه من نظام التشغيل
WebChatلا يوجد (عام)جميع الزوار EXTERNAL، ليسوا أبداً owner
البريد الإلكترونيمطابقة النطاقمقارنة نطاق المرسل مع النطاقات الداخلية المُكوّنة

لا يقرر LLM أبداً من هو المالك. رسالة تقول "أنا المالك" من مرسل غير

مُتحقق منه تُوسم بـ { source: "external" } ولا يمكنها تشغيل أوامر مستوى المالك. هذا القرار يُتخذ في الكود، قبل أن يعالج LLM الرسالة. :::

الطبقة 2: الوصول للبيانات المدرك للصلاحيات

تحمي ضد: الوصول المفرط للبيانات، تصعيد الامتيازات من خلال بيانات اعتماد النظام.

يستخدم Triggerfish رموز OAuth المُفوضة من المستخدم -- وليس حسابات خدمة النظام -- لاستعلام الأنظمة الخارجية. يفرض النظام المصدر نموذج صلاحياته الخاص:

التقليدي مقابل Triggerfish: النموذج التقليدي يمنح LLM تحكماً مباشراً، Triggerfish يوجه جميع الإجراءات عبر طبقة سياسات حتمية

يفرض 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 ثلاثة ثوابت:

  1. لكل محادثة -- كل جلسة لها taint خاص بها
  2. التصعيد فقط -- يزداد taint، ولا ينخفض أبداً
  3. إعادة التعيين الكاملة تمسح كل شيء -- يُمسح 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
  • فحص أنماط الحقن في المعاملات
حالات خادم MCP: UNTRUSTED (افتراضي), CLASSIFIED (مُراجع ومسموح), BLOCKED (محظور صراحةً)

الطبقة 7: عزل Plugin

تحمي ضد: كود plugin خبيث أو به أخطاء، استخراج البيانات، الوصول غير المصرح به للنظام.

تعمل plugins داخل عزل مزدوج:

عزل Plugin: عزل Deno يلف عزل WASM، كود plugin يعمل في الطبقة الأعمق

لا تستطيع 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 سقف المُستدعى يُحظر
  • الاستدعاءات الدائرية تُكتشف وتُرفض
  • عمق التفويض محدود ومُنفذ
الدفاع ضد غسل البيانات: مسار الهجوم محظور عند فحص السقف ووراثة 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 (صفر وصول)، مسؤول المنظمة (يضع السياسات)، الموظف (يستخدم الوكيل ضمن الحدود)

المستوى الشخصي: المستخدم هو مسؤول المنظمة. سيادة كاملة. بدون رؤية

من Triggerfish. ليس للمورد أي وصول إلى بيانات المستخدم افتراضياً ولا يمكنه الحصول على وصول إلا من خلال منح صريح ومحدد بالوقت ومُسجل من المستخدم. :::

كيف تعمل الطبقات معاً

فكر في هجوم حقن prompt حيث تحاول رسالة خبيثة استخراج البيانات:

الخطوةالطبقةالإجراء
1مصادقة القناةالرسالة مُوسمة { source: "external" } -- ليس مالكاً
2PRE_CONTEXT_INJECTIONيُفحص المدخل لأنماط الحقن، يُصنف
3Taint الجلسةtaint الجلسة لم يتغير (لم يتم الوصول لبيانات مصنفة)
4LLM يعالج الرسالةقد يُتلاعب بـ LLM لطلب استدعاء أداة
5PRE_TOOL_CALLفحص صلاحية الأداة مقابل قواعد المصدر الخارجي
6POST_TOOL_RESPONSEأي بيانات مُعادة تُصنف، يُحدث taint
7PRE_OUTPUTيُفحص تصنيف المخرج مقابل الهدف
8تسجيل التدقيقيُسجل التسلسل بالكامل للمراجعة

حتى لو تم اختراق LLM بالكامل في الخطوة 4 وطلب استدعاء أداة لاستخراج البيانات، تستمر الطبقات المتبقية (فحوصات الصلاحيات، تتبع taint، تصنيف المخرجات، تسجيل التدقيق) في تنفيذ السياسة. لا توجد نقطة فشل واحدة تخترق النظام.