Skip to content

הגנה בעומק

Triggerfish מיישמת אבטחה כ-13 שכבות עצמאיות וחופפות. אף שכבה בודדת אינה מספיקה לבדה. יחד, הן מרכיבות הגנה שמתדרדרת בחן -- גם אם שכבה אחת נפרצת, השכבות הנותרות ממשיכות להגן על המערכת.

אבטחה הגנה בעומק אומרת שפגיעות בכל שכבה בודדת אינה פוגעת במערכת.

תוקף שעוקף אימות ערוץ עדיין מתמודד עם מעקב Taint של סשן, Hook-י מדיניות ורישום ביקורת. LLM שעובר prompt injection עדיין לא יכול להשפיע על שכבת המדיניות הדטרמיניסטית מתחתיו. :::

13 השכבות

שכבה 1: אימות ערוצים

מגינה מפני: התחזות, גישה לא מורשית, בלבול זהויות.

זהות נקבעת על ידי קוד בעת יצירת הסשן, לא על ידי ה-LLM שמפרש תוכן הודעות. לפני שה-LLM רואה הודעה כלשהי, מתאם הערוץ מסמן אותה בתווית בלתי ניתנת לשינוי:

{ source: "owner" }    -- זהות ערוץ מאומתת תואמת לבעלים הרשום
{ source: "external" } -- כל אחד אחר; קלט בלבד, לא מטופל כפקודה

שיטות אימות משתנות לפי ערוץ:

ערוץשיטהאימות
Telegram / WhatsAppקוד זיווגקוד חד-פעמי, תוקף 5 דקות, נשלח מחשבון המשתמש
Slack / Discord / TeamsOAuthזרימת הסכמת OAuth של הפלטפורמה, מחזירה מזהה משתמש מאומת
CLIתהליך מקומירץ על מחשב המשתמש, מאומת על ידי מערכת ההפעלה
WebChatללא (ציבורי)כל המבקרים הם EXTERNAL, לעולם לא owner
Emailהתאמת דומייןדומיין שולח מושווה לדומיינים פנימיים מוגדרים

ה-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: Hook-י אכיפת מדיניות

מגינה מפני: התקפות prompt injection, עקיפות אבטחה מונעות LLM, הרצת כלים ללא בקרה.

שמונה Hook-ים דטרמיניסטיים מיירטים כל פעולה בנקודות קריטיות בזרימת הנתונים:

Hookמה הוא מיירט
PRE_CONTEXT_INJECTIONקלט חיצוני הנכנס לחלון ההקשר
PRE_TOOL_CALLLLM מבקש הרצת כלי
POST_TOOL_RESPONSEנתונים חוזרים מהרצת כלי
PRE_OUTPUTתגובה עומדת לצאת מהמערכת
SECRET_ACCESSבקשת גישה לפרטי הזדהות
SESSION_RESETבקשת איפוס Taint
AGENT_INVOCATIONקריאה בין סוכנים
MCP_TOOL_CALLהפעלת כלי שרת MCP

Hook-ים הם קוד טהור: דטרמיניסטי, סינכרוני, מתועד ובלתי ניתן לזיוף. ה-LLM לא יכול לעקוף אותם כי אין נתיב מפלט ה-LLM להגדרת Hook-ים. שכבת ה-Hook-ים לא מנתחת פלט LLM בחיפוש אחר פקודות.

שכבה 6: MCP Gateway

מגינה מפני: גישה לא מבוקרת לכלים חיצוניים, נתונים לא מסווגים הנכנסים דרך שרתי MCP, הפרות סכמה.

כל שרתי ה-MCP מוגדרים כ-UNTRUSTED כברירת מחדל ולא ניתן להפעילם עד שמנהל או משתמש מסווגים אותם. ה-Gateway אוכף:

  • אימות שרת וסטטוס סיווג
  • הרשאות ברמת כלי (כלים בודדים יכולים להיחסם גם אם השרת מותר)
  • אימות סכמת בקשה/תגובה
  • מעקב Taint על כל תגובות MCP
  • סריקת דפוסי הזרקה בפרמטרים
מצבי שרת MCP: UNTRUSTED (ברירת מחדל), CLASSIFIED (נבדק ומותר), BLOCKED (נחסם מפורשות)

שכבה 7: ארגז חול לתוספים

מגינה מפני: קוד תוספים זדוני או פגום, חילוץ נתונים, גישה לא מורשית למערכת.

תוספים רצים בתוך ארגז חול כפול:

ארגז חול לתוספים: ארגז חול Deno עוטף ארגז חול WASM, קוד התוסף רץ בשכבה הפנימית ביותר

תוספים לא יכולים:

  • לגשת לנקודות קצה רשת שלא הוצהרו
  • לפלוט נתונים ללא תוויות סיווג
  • לקרוא נתונים מבלי להפעיל הפצת Taint
  • להתמיד נתונים מחוץ ל-Triggerfish
  • להשתמש בפרטי הזדהות מערכתיים (רק פרטי הזדהות מואצלים של המשתמש)
  • לחלץ נתונים דרך ערוצים צדדיים (מגבלות משאבים, ללא raw sockets)

ארגז החול לתוספים נבדל מסביבת ההרצה של הסוכן. תוספים הם קוד לא מהימן

שהמערכת מגינה מפניו. סביבת ההרצה היא סביבת עבודה שהסוכן מורשה לבנות בה -- עם גישה מנוהלת על ידי מדיניות, לא בידוד ארגז חול. :::

שכבה 8: בידוד סודות

מגינה מפני: גניבת פרטי הזדהות, סודות בקבצי הגדרות, אחסון פרטי הזדהות בטקסט גלוי.

פרטי הזדהות מאוחסנים ב-OS keychain (רמה אישית) או אינטגרציית vault (רמה ארגונית). הם לעולם לא מופיעים ב:

  • קבצי הגדרות
  • ערכי StorageProvider
  • רשומות יומן
  • הקשר LLM (פרטי הזדהות מוזרקים בשכבת HTTP, מתחת ל-LLM)

ה-Hook SECRET_ACCESS מתעד כל גישה לפרטי הזדהות עם התוסף המבקש, היקף פרטי ההזדהות וההחלטה.

שכבה 9: ארגז חול לכלי מערכת קבצים

מגינה מפני: התקפות חציית נתיבים, גישה לא מורשית לקבצים, עקיפת סיווג דרך פעולות מערכת קבצים ישירות.

כל פעולות כלי מערכת הקבצים (קריאה, כתיבה, עריכה, רישום, חיפוש) רצות בתוך Deno Worker בארגז חול עם הרשאות ברמת מערכת ההפעלה המוגבלות לתיקיית סביבת העבודה המתאימה ל-Taint של הסשן. ארגז החול אוכף שלושה גבולות:

  • כלא נתיבים — כל נתיב מותאם לנתיב מוחלט ונבדק מול שורש הכלא בהתאמה מודעת מפרידים. ניסיונות חצייה (../) שבורחים מסביבת העבודה נדחים לפני כל I/O
  • סיווג נתיבים — כל נתיב מערכת קבצים מסווג דרך שרשרת התאמה קבועה: נתיבים מוגנים קבועים בקוד (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

מגינה מפני: Server-side request forgery, סריקת רשת פנימית, חילוץ מטא-נתונים של ענן.

כל בקשות HTTP יוצאות (מ-web_fetch, browser.navigate וגישת רשת של תוספים) מפענחות DNS קודם ובודקות את ה-IP המפוענח מול רשימת חסימה קבועה בקוד של טווחים פרטיים ושמורים. זה מונע מתוקף להערים על הסוכן לגשת לשירותים פנימיים דרך כתובות URL מזויפות.

  • טווחים פרטיים (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) תמיד חסומים
  • Link-local (169.254.0.0/16) ונקודות קצה של מטא-נתונים בענן חסומים
  • Loopback (127.0.0.0/8) חסום
  • רשימת החסימה קבועה בקוד ולא ניתנת להגדרה -- אין דריסת מנהל
  • פענוח DNS מתבצע לפני הבקשה, מה שמונע התקפות DNS rebinding

שכבה 13: סינון סיווג זיכרון

מגינה מפני: דליפת נתונים בין סשנים דרך זיכרון, הורדת דרגת סיווג דרך כתיבות זיכרון, גישה לא מורשית לזיכרונות מסווגים.

מערכת הזיכרון בין-סשני אוכפת סיווג בזמן כתיבה וקריאה כאחד:

  • כתיבות: רשומות זיכרון נכפות לרמת Taint הנוכחית של הסשן. ה-LLM לא יכול לבחור סיווג נמוך יותר לזיכרונות מאוחסנים.
  • קריאות: שאילתות זיכרון מסוננות על ידי canFlowTo -- סשן יכול לקרוא רק זיכרונות ברמה שווה או נמוכה מרמת ה-Taint הנוכחית שלו.

זה מונע מסוכן לאחסן נתוני CONFIDENTIAL כ-PUBLIC בזיכרון ומאוחר יותר לאחזר אותם בסשן עם Taint נמוך יותר כדי לעקוף את כלל אי-כתיבה למטה.

היררכיית אמון

מודל האמון מגדיר למי יש סמכות על מה. רמות גבוהות יותר לא יכולות לעקוף כללי אבטחה של רמות נמוכות יותר, אך הן יכולות להגדיר את הפרמטרים המתכווננים בתוך כללים אלו.

היררכיית אמון: ספק Triggerfish (גישה אפס), מנהל ארגוני (מגדיר מדיניות), עובד (משתמש בסוכן בתוך גבולות)

רמה אישית: המשתמש הוא מנהל הארגון. ריבונות מלאה. ללא נראות

Triggerfish. לספק אין גישה לנתוני המשתמש כברירת מחדל ויכול לקבל גישה רק דרך הענקה מפורשת, מוגבלת בזמן ומתועדת מהמשתמש. :::

כיצד השכבות עובדות יחד

שקלו התקפת prompt injection שבה הודעה זדונית מנסה לחלץ נתונים:

שלבשכבהפעולה
1אימות ערוץהודעה מתויגת { source: "external" } -- לא בעלים
2PRE_CONTEXT_INJECTIONקלט נסרק לדפוסי הזרקה, מסווג
3Taint של סשןTaint של סשן ללא שינוי (לא ניגשו לנתונים מסווגים)
4LLM מעבד הודעהLLM עשוי להיות מנוהל לבקש קריאת כלי
5PRE_TOOL_CALLבדיקת הרשאת כלי כנגד כללי מקור חיצוני
6POST_TOOL_RESPONSEכל נתונים שחזרו מסווגים, Taint מתעדכן
7PRE_OUTPUTסיווג פלט מול יעד נבדק
8רישום ביקורתכל הרצף מתועד לסקירה

גם אם ה-LLM נפרץ לחלוטין בשלב 4 ומבקש קריאת כלי לחילוץ נתונים, השכבות הנותרות (בדיקות הרשאות, מעקב Taint, סיווג פלט, רישום ביקורת) ממשיכות לאכוף מדיניות. אין נקודת כשל בודדת שפוגעת במערכת.