تفویض عامل
با افزایش تعامل عاملهای هوش مصنوعی با یکدیگر — یک عامل عامل دیگری را برای تکمیل زیروظایف فراخوانی میکند — دسته جدیدی از خطرات امنیتی پدید میآید. زنجیره عامل میتواند برای پولشویی داده از طریق عاملی با محدودیت کمتر استفاده شود و کنترلهای طبقهبندی را دور بزند. Triggerfish با هویت رمزنگاری عامل، سقفهای طبقهبندی و وراثت اجباری Taint از این امر جلوگیری میکند.
گواهینامههای عامل
هر عامل در 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 | سقف طبقهبندی — بالاترین سطح Taint که این عامل میتواند در آن فعالیت کند. عاملی با سقف INTERNAL نمیتواند توسط نشستی با Taint CONFIDENTIAL فراخوانی شود. |
can_invoke_agents | آیا این عامل اجازه فراخوانی عاملهای دیگر را دارد. |
can_be_invoked_by | لیست صریح عاملهایی که مجاز به فراخوانی این عامل هستند. |
max_delegation_depth | حداکثر عمق زنجیره فراخوانی عامل. از بازگشت نامحدود جلوگیری میکند. |
signature | امضای Ed25519 از مالک. از دستکاری گواهینامه جلوگیری میکند. |
جریان فراخوانی
وقتی یک عامل عامل دیگری را فراخوانی میکند، لایه سیاست قبل از اجرای عامل فراخوانیشده، تفویض را تأیید میکند. بررسی قطعی است و در کد اجرا میشود — عامل فراخوانیکننده نمیتواند بر تصمیم تأثیر بگذارد.
در این مثال، عامل A دارای Taint نشست CONFIDENTIAL است (قبلاً به دادههای Salesforce دسترسی پیدا کرده). عامل B دارای سقف طبقهبندی INTERNAL است. چون CONFIDENTIAL بالاتر از INTERNAL است، فراخوانی مسدود میشود. دادههای آلوده عامل A نمیتوانند به عاملی با سقف طبقهبندی پایینتر جریان یابند.
امنیت لایه سیاست Taint فعلی نشست فراخوانیکننده را بررسی میکند، نه سقف آن. حتی اگر عامل A سقف CONFIDENTIAL داشته باشد، آنچه اهمیت دارد سطح واقعی Taint نشست در لحظه فراخوانی است. اگر عامل A به هیچ داده طبقهبندیشدهای دسترسی نداشته باشد (Taint PUBLIC است)، میتواند عامل B (سقف INTERNAL) را بدون مشکل فراخوانی کند. :::
ردیابی زنجیره تفویض
وقتی عاملها عاملهای دیگر را فراخوانی میکنند، کل زنجیره با مُهرهای زمانی و سطوح Taint در هر مرحله ردیابی میشود:
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
}این زنجیره در گزارش بازرسی ثبت میشود و برای تحلیل انطباق و بررسیهای قانونی قابل جستجو است. میتوانید دقیقاً ردیابی کنید که کدام عاملها درگیر بودهاند، سطوح Taint آنها چه بوده و چه وظایفی انجام دادهاند.
ثابتهای امنیتی
چهار ثابت بر تفویض عامل حاکم هستند. همه توسط کد در لایه سیاست اجرا میشوند و توسط هیچ عاملی در زنجیره قابل لغو نیستند.
| ثابت | اجرا |
|---|---|
| Taint فقط افزایش مییابد | هر فراخوانیشده max(Taint خود، Taint فراخوانیکننده) را به ارث میبرد. فراخوانیشده هرگز نمیتواند Taint پایینتری از فراخوانیکنندهاش داشته باشد. |
| سقف رعایت میشود | عاملی نمیتواند فراخوانی شود اگر Taint فراخوانیکننده از سقف max_classification فراخوانیشده فراتر رود. |
| محدودیت عمق اجرا میشود | زنجیره در max_delegation_depth متوقف میشود. اگر محدودیت ۳ باشد، فراخوانی سطح چهارم مسدود میشود. |
| فراخوانی دایرهای مسدود میشود | عاملی نمیتواند دو بار در یک زنجیره ظاهر شود. اگر عامل A عامل B را فراخوانی کند و B تلاش کند A را فراخوانی کند، فراخوانی دوم مسدود میشود. |
وراثت Taint به تفصیل
وقتی عامل A (Taint: CONFIDENTIAL) با موفقیت عامل B (سقف: CONFIDENTIAL) را فراخوانی میکند، عامل B با Taint CONFIDENTIAL شروع میکند — به ارث رسیده از عامل A. اگر عامل B سپس به دادههای RESTRICTED دسترسی پیدا کند، Taint آن به RESTRICTED بالا میرود. این Taint افزایشیافته وقتی فراخوانی تکمیل شود به عامل A بازمیگردد.
Taint در هر دو جهت جریان مییابد — از فراخوانیکننده به فراخوانیشده در لحظه فراخوانی، و از فراخوانیشده به فراخوانیکننده در لحظه تکمیل. فقط میتواند افزایش یابد.
جلوگیری از پولشویی داده
یک بردار حمله کلیدی در سیستمهای چندعامله پولشویی داده است — استفاده از زنجیره عامل برای انتقال دادههای طبقهبندیشده به مقصدی با طبقهبندی پایینتر از طریق مسیریابی از عاملهای واسطه.
حمله
هدف مهاجم: استخراج دادههای CONFIDENTIAL از طریق کانال PUBLIC
جریان تلاششده:
۱. عامل A به Salesforce دسترسی پیدا میکند (Taint --> CONFIDENTIAL)
۲. عامل A عامل B را فراخوانی میکند (که کانال PUBLIC دارد)
۳. عامل B دادهها را به کانال PUBLIC میفرستدچرا شکست میخورد
Triggerfish این حمله را در نقاط متعدد مسدود میکند:
نقطه مسدودسازی ۱: بررسی فراخوانی. اگر عامل B سقفی پایینتر از CONFIDENTIAL داشته باشد، فراخوانی کاملاً مسدود میشود. Taint عامل A (CONFIDENTIAL) از سقف عامل B فراتر است.
نقطه مسدودسازی ۲: وراثت Taint. حتی اگر عامل B سقف CONFIDENTIAL داشته باشد و فراخوانی موفق شود، عامل B Taint CONFIDENTIAL عامل A را به ارث میبرد. وقتی عامل B تلاش کند به کانال PUBLIC خروجی بدهد، Hook PRE_OUTPUT نوشتن به پایین را مسدود میکند.
نقطه مسدودسازی ۳: عدم بازنشانی Taint در تفویض. عاملها در زنجیره تفویض نمیتوانند Taint خود را بازنشانی کنند. بازنشانی Taint فقط برای کاربر نهایی در دسترس است و کل تاریخچه مکالمه را پاک میکند. هیچ مکانیزمی برای یک عامل برای «شستن» سطح Taint خود در طول زنجیره وجود ندارد.
دادهها نمیتوانند از طبقهبندی خود از طریق تفویض عامل فرار کنند. ترکیب بررسیهای سقف، وراثت اجباری Taint و عدم بازنشانی Taint در زنجیرهها، پولشویی داده از طریق زنجیرههای عامل را در مدل امنیتی Triggerfish غیرممکن میسازد. :::
سناریوهای نمونه
سناریو ۱: تفویض موفق
عامل A (سقف: CONFIDENTIAL، Taint فعلی: INTERNAL)
عامل B را فراخوانی میکند (سقف: CONFIDENTIAL)
بررسی سیاست:
- A میتواند B را فراخوانی کند؟ بله (B در لیست تفویض A است)
- Taint A (INTERNAL) <= سقف B (CONFIDENTIAL)؟ بله
- محدودیت عمق صحیح؟ بله (عمق ۱ از حداکثر ۳)
- دایرهای؟ خیر
نتیجه: مجاز
عامل B با Taint: INTERNAL شروع میکند (به ارث رسیده از A)سناریو ۲: مسدود به دلیل سقف
عامل A (سقف: RESTRICTED، Taint فعلی: CONFIDENTIAL)
عامل B را فراخوانی میکند (سقف: INTERNAL)
بررسی سیاست:
- Taint A (CONFIDENTIAL) <= سقف B (INTERNAL)؟ خیر
نتیجه: مسدود شد
دلیل: سقف عامل B (INTERNAL) پایینتر از Taint نشست (CONFIDENTIAL)سناریو ۳: مسدود به دلیل محدودیت عمق
عامل A عامل B را فراخوانی میکند (عمق ۱)
عامل B عامل C را فراخوانی میکند (عمق ۲)
عامل C عامل D را فراخوانی میکند (عمق ۳)
عامل D عامل E را فراخوانی میکند (عمق ۴)
بررسی سیاست برای عامل E:
- عمق ۴ > max_delegation_depth (۳)
نتیجه: مسدود شد
دلیل: حداکثر عمق تفویض رد شدهسناریو ۴: مسدود به دلیل ارجاع دایرهای
عامل A عامل B را فراخوانی میکند (عمق ۱)
عامل B عامل C را فراخوانی میکند (عمق ۲)
عامل C عامل A را فراخوانی میکند (عمق ۳)
بررسی سیاست برای فراخوانی دوم عامل A:
- عامل A قبلاً در زنجیره وجود دارد
نتیجه: مسدود شد
دلیل: فراخوانی دایرهای عامل شناسایی شدصفحات مرتبط
- طراحی امنیتمحور — مروری بر معماری امنیتی
- قانون عدم نوشتن به پایین — قانون جریان طبقهبندی که تفویض اجرا میکند
- هویت و احراز هویت — نحوه برقراری هویت کاربر و کانال
- بازرسی و انطباق — نحوه ثبت زنجیرههای تفویض در گزارش بازرسی
