Skip to content

האצלת סוכנים

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

תעודות סוכנים

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

json
{
  "agent_id": "agent_abc123",
  "agent_name": "Sales Assistant",
  "created_at": "2025-01-15T00:00:00Z",
  "expires_at": "2026-01-15T00:00:00Z",

  "owner": {
    "type": "user",
    "id": "user_456",
    "org_id": "org_789"
  },

  "capabilities": {
    "integrations": ["salesforce", "slack", "email"],
    "actions": ["read", "write", "send_message"],
    "max_classification": "CONFIDENTIAL"
  },

  "delegation": {
    "can_invoke_agents": true,
    "can_be_invoked_by": ["agent_def456", "agent_ghi789"],
    "max_delegation_depth": 3
  },

  "signature": "ed25519:xyz..."
}

שדות מרכזיים בתעודה:

שדהמטרה
max_classificationתקרת הסיווג -- רמת הזיהום הגבוהה ביותר שבה סוכן זה יכול לפעול. סוכן עם תקרת INTERNAL אינו יכול להיקרא על ידי סשן מזוהם ברמת CONFIDENTIAL.
can_invoke_agentsהאם סוכן זה מורשה לקרוא לסוכנים אחרים.
can_be_invoked_byרשימת היתר מפורשת של סוכנים שרשאים להפעיל סוכן זה.
max_delegation_depthעומק מרבי של שרשרת הפעלת הסוכנים. מונע רקורסיה בלתי מוגבלת.
signatureחתימת Ed25519 מהבעלים. מונעת שיבוש תעודות.

זרימת הפעלה

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

רצף האצלת סוכנים: סוכן A מפעיל סוכן B, שכבת המדיניות מאמתת זיהום מול תקרה וחוסמת כאשר הזיהום עולה על התקרה

בדוגמה זו, לסוכן A יש זיהום סשן של CONFIDENTIAL (הוא ניגש לנתוני Salesforce קודם לכן). לסוכן B יש תקרת סיווג של INTERNAL. מכיוון ש-CONFIDENTIAL גבוה מ-INTERNAL, ההפעלה נחסמת. הנתונים המזוהמים של סוכן A אינם יכולים לזרום לסוכן עם תקרת סיווג נמוכה יותר.

אבטחה שכבת המדיניות בודקת את זיהום הסשן הנוכחי של

הקורא, לא את תקרתו. גם אם לסוכן A יש תקרת CONFIDENTIAL, מה שחשוב הוא רמת הזיהום בפועל של הסשן בזמן ההפעלה. אם סוכן A לא ניגש לנתונים מסווגים כלל (זיהום PUBLIC), הוא יכול להפעיל את סוכן B (תקרת INTERNAL) ללא בעיה. :::

מעקב שרשרת האצלה

כאשר סוכנים מפעילים סוכנים אחרים, השרשרת המלאה נעקבת עם חותמות זמן ורמות זיהום בכל שלב:

json
{
  "invocation_id": "inv_123",
  "chain": [
    {
      "agent_id": "agent_abc",
      "agent_name": "Sales Assistant",
      "invoked_at": "2025-01-29T10:00:00Z",
      "taint_at_invocation": "CONFIDENTIAL",
      "task": "Summarize Q4 pipeline"
    },
    {
      "agent_id": "agent_def",
      "agent_name": "Data Analyst",
      "invoked_at": "2025-01-29T10:00:01Z",
      "taint_at_invocation": "CONFIDENTIAL",
      "task": "Calculate win rates"
    }
  ],
  "max_depth_allowed": 3,
  "current_depth": 2
}

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

עקרונות אבטחה בלתי ניתנים לשינוי

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

עיקרוןאכיפה
זיהום רק עולהכל נקרא יורש max(own taint, caller taint). לנקרא לעולם לא יכול להיות זיהום נמוך מהקורא שלו.
תקרה נשמרתסוכן אינו יכול להיקרא אם זיהום הקורא עולה על תקרת max_classification של הנקרא.
מגבלות עומק נאכפותהשרשרת מסתיימת ב-max_delegation_depth. אם המגבלה היא 3, הפעלה ברמה רביעית נחסמת.
הפעלה מעגלית נחסמתסוכן אינו יכול להופיע פעמיים באותה שרשרת. אם סוכן A קורא לסוכן B שמנסה לקרוא לסוכן A, ההפעלה השנייה נחסמת.

ירושת זיהום בפירוט

כאשר סוכן A (זיהום: CONFIDENTIAL) מפעיל בהצלחה את סוכן B (תקרה: CONFIDENTIAL), סוכן B מתחיל עם זיהום CONFIDENTIAL -- שנורש מסוכן A. אם סוכן B ניגש לנתוני RESTRICTED, הזיהום שלו עולה ל-RESTRICTED. זיהום מוגבר זה מועבר חזרה לסוכן A כאשר ההפעלה מסתיימת.

ירושת זיהום: סוכן A (INTERNAL) מפעיל סוכן B, B יורש זיהום, ניגש ל-Salesforce (CONFIDENTIAL), מחזיר זיהום מוגבר ל-A

זיהום זורם בשני הכיוונים -- מקורא לנקרא בזמן ההפעלה, ומנקרא חזרה לקורא בהשלמה. הוא יכול רק לעלות.

מניעת הלבנת נתונים

וקטור תקיפה מרכזי במערכות רב-סוכניות הוא הלבנת נתונים -- שימוש בשרשרת סוכנים להעברת נתונים מסווגים ליעד בסיווג נמוך יותר על ידי ניתובם דרך סוכנים ביניים.

המתקפה

מטרת התוקף: לחלץ נתוני CONFIDENTIAL דרך ערוץ PUBLIC

זרימה מנוסה:
1. סוכן A ניגש ל-Salesforce (זיהום --> CONFIDENTIAL)
2. סוכן A מפעיל סוכן B (שיש לו ערוץ PUBLIC)
3. סוכן B שולח נתונים לערוץ ה-PUBLIC

מדוע היא נכשלת

Triggerfish חוסם מתקפה זו בנקודות מרובות:

נקודת חסימה 1: בדיקת הפעלה. אם לסוכן B תקרה מתחת ל-CONFIDENTIAL, ההפעלה נחסמת מיד. זיהום סוכן A (CONFIDENTIAL) עולה על תקרת סוכן B.

נקודת חסימה 2: ירושת זיהום. גם אם לסוכן B תקרת CONFIDENTIAL וההפעלה מצליחה, סוכן B יורש את זיהום ה-CONFIDENTIAL של סוכן A. כאשר סוכן B מנסה לפלוט לערוץ PUBLIC, הוו PRE_OUTPUT חוסם את הכתיבה-למטה.

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

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

השילוב של בדיקות תקרה, ירושת זיהום חובה ואי-איפוס-זיהום-בשרשראות הופך הלבנת נתונים דרך שרשראות סוכנים לבלתי אפשרית בתוך מודל האבטחה של Triggerfish. :::

תרחישים לדוגמה

תרחיש 1: האצלה מוצלחת

סוכן A (תקרה: CONFIDENTIAL, זיהום נוכחי: INTERNAL)
  קורא לסוכן B (תקרה: CONFIDENTIAL)

בדיקת מדיניות:
  - A יכול להפעיל את B? כן (B ברשימת ההאצלה של A)
  - זיהום A (INTERNAL) <= תקרת B (CONFIDENTIAL)? כן
  - מגבלת עומק בסדר? כן (עומק 1 מתוך מקסימום 3)
  - מעגלי? לא

תוצאה: מותר
סוכן B מתחיל עם זיהום: INTERNAL (נורש מ-A)

תרחיש 2: חסום על ידי תקרה

סוכן A (תקרה: RESTRICTED, זיהום נוכחי: CONFIDENTIAL)
  קורא לסוכן B (תקרה: INTERNAL)

בדיקת מדיניות:
  - זיהום A (CONFIDENTIAL) <= תקרת B (INTERNAL)? לא

תוצאה: חסום
סיבה: תקרת סוכן B (INTERNAL) מתחת לזיהום הסשן (CONFIDENTIAL)

תרחיש 3: חסום על ידי מגבלת עומק

סוכן A קורא לסוכן B (עומק 1)
  סוכן B קורא לסוכן C (עומק 2)
    סוכן C קורא לסוכן D (עומק 3)
      סוכן D קורא לסוכן E (עומק 4)

בדיקת מדיניות עבור סוכן E:
  - עומק 4 > max_delegation_depth (3)

תוצאה: חסום
סיבה: עומק האצלה מרבי נחרג

תרחיש 4: חסום על ידי הפניה מעגלית

סוכן A קורא לסוכן B (עומק 1)
  סוכן B קורא לסוכן C (עומק 2)
    סוכן C קורא לסוכן A (עומק 3)

בדיקת מדיניות עבור הפעלת סוכן A השנייה:
  - סוכן A כבר מופיע בשרשרת

תוצאה: חסום
סיבה: זוהתה הפעלת סוכנים מעגלית

עמודים קשורים