پرش به محتوای اصلی

MCP برای ارتباطات عامل به عامل: با لایه انتقال مانند سطح حمله رفتار کنید

پروتکل‌های عامل به عامل، فرض‌های اعتماد لایه فراخوانی ابزار را که گسترش می‌دهند به ارث می‌برند؛ بنابراین اصالت پیام و محدودسازی قابلیت باید در لایه انتقال طراحی شوند، نه اینکه بعداً به عامل‌ها پیچ شوند.

U.S. Air Force Senior Airman Andrew Cranley, 423d Security Forces Squadron Base Defense Operations Controller, monitors base operations at R

پروتکل همان محیط پیرامونی است

لایه‌های انتقال به سبک MCP برای یک فراخوانِ واحد و مورد اعتماد که ابزارها را فرامی‌خواند ساخته شده‌اند. در آن مدل، لایه انتقال یک لوله است: فریم‌های JSON-RPC را بین یک کلاینت و یک سرور جابه‌جا می‌کند و تصمیم‌های امنیتی مهم بالاتر از آن، در پیاده‌سازی ابزار، گرفته می‌شوند. وقتی همان لایه انتقال برای عامل‌های همتا با هویت‌های متفاوت به کار می‌رود، این لوله به محیط پیرامونی تبدیل می‌شود. هر گامی که درخواست را دوباره سریال‌سازی می‌کند، جایی است که منشأ پیام از دست می‌رود. پیامی که به‌عنوان درخواست کاربر آغاز شده، توسط یک عامل برنامه‌ریز بازنویسی شده و توسط یک عامل بازیابی ارسال شده، به سرور ابزار می‌رسد بدون هیچ نشانه قابل اعتمادی از اینکه چه کسی چه چیزی را خواسته است.

درهم‌آمیختن کشف قابلیت و مجوزدهی به قابلیت این وضعیت را بدتر می‌کند. کشف به این پرسش پاسخ می‌دهد: «این نقطه پایانی چه کاری می‌تواند انجام دهد؟» مجوزدهی پاسخ می‌دهد: «آیا این هویت مجاز است آن قابلیت را برای این وظیفه فراخوانی کند؟» رجیستری‌های به سبک MCP معمولاً اولی را آشکار می‌کنند و دومی را به فراخوان واگذار می‌کنند. در مدل تک‌فراخوان این قابل دفاع است. در مدل عامل همتا یعنی هر عاملی که بتواند به رجیستری برسد می‌تواند کل سطح قابلیت را برشمارد و فراخوانی را بیازماید، و عامل گیرنده هیچ مبنای سطح‌انتقالی برای رد کردن ندارد. رجیستری به نقشه‌ای از سطح حمله تبدیل می‌شود که به هر شرکت‌کننده داده شده است.

این نقص MCP به‌عنوان یک پروتکل ابزار نیست. گسترش یک پروتکل ابزار به پیام‌رسانی همتا بدون بازبینی مدل اعتمادش، یک خطای مقوله‌ای است. پرسش مرتبط این نیست که آیا فریم‌ها خوش‌ساخت هستند، بلکه این است که آیا لایه انتقال می‌تواند تصدیق کند چه کسی آن‌ها را فرستاده، به نمایندگی از چه کسی، و تحت چه محدودیت‌هایی.

جعل هویت بین عامل‌هایی که یک فضای نام مشترک دارند

وقتی عامل‌ها با یک رشته در یک فیلد پیام شناسایی می‌شوند نه با یک هویت رمزنگارانه، هر عاملی می‌تواند هر هویتی را ادعا کند. در یک ازدحام که یک برنامه‌ریز یک کارگر را با نام خطاب می‌کند، یک کارگر به‌خطرافتاده یا صرفاً دارای اشکال می‌تواند پیام‌هایی بفرستد که به‌نظر می‌رسد از برنامه‌ریز آمده‌اند. عامل‌های پایین‌دستی هیچ راهی برای تشخیص دستور اصیل از جعلی ندارند، چون لایه انتقال نه امضایی حمل می‌کند و نه اتصال کانالی. شکست بی‌صدا است: پیام جعلی خوش‌ساخت است، قابلیت وجود دارد، و فراخوانی موفق می‌شود.

جریان‌های نماینده گیج‌شده

U.S. Air Force Staff Sgt. Andrew Foster, 332nd Expeditionary Security Forces Squadron small unmanned aircraft systems mid-shift lead operato

یک عامل کم‌اختیار یک فراخوان پُراختیار را بازپخش می‌کند. این هر زمان رخ می‌دهد که لایه انتقال اتصال را مجاز می‌کند نه پیام را. عاملی که برای کار مشروع خود یک اعتبارنامه گسترده دارد می‌تواند وادار شود آن اعتبارنامه را به نمایندگی از فراخوانی که نباید آن را داشته باشد به کار ببرد. نماینده بدخواه نیست؛ دارد همان کاری را می‌کند که پروتکل اجازه می‌دهد. کاهش‌دهنده کلاسیک — بررسی هویت فراخوان — شکست می‌خورد چون فراخوان همان نماینده است و نماینده مجاز است. آنچه غایب است، پیوندی بین هویت اصلی و فراخوانی مشخص است.

بازپخش پیام در اجراهای بلندمدت

اجراهای بلندمدت عامل وضعیت را نقطه‌گذاری و از سر می‌گیرند. اگر لایه انتقال nonce‌ای حمل نکند که از نقطه‌گذاری جان سالم به در ببرد، پیامی که در یک گام گرفته شده می‌تواند در گام دیگری بازپخش شود. بازپخش ممکن است از نظر معنایی معتبر باشد: قابلیت هنوز وجود دارد، آرگومان‌ها هنوز تجزیه می‌شوند، و عامل گیرنده هیچ خاطره‌ای از دیدن پیام قبلی ندارد. در اجرایی که ساعت‌ها و عامل‌های بسیاری را در بر می‌گیرد، پنجره بازپخش گسترده است، و نبود یک nonce پایدار یعنی لایه انتقال نمی‌تواند تلاش مجدد را از حمله تشخیص دهد.

هر پیام را به یک هویت و یک شناسه وظیفه گره بزنید

یک شناسه نشست کافی نیست. نشست‌ها بازاستفاده، استخر و گاهی بین وظایف مشترک می‌شوند. هر پیام باید یک هویت صریح (چه کسی عمل می‌کند) و یک شناسه وظیفه (این عمل بخشی از چه چیزی است) حمل کند، و هر دو باید توسط امضای پیام پوشش داده شوند. هویت همان درخواست‌کننده اصلی است، نه فرستنده بی‌واسطه. شناسه وظیفه به گیرنده اجازه می‌دهد سیاستی را اعمال کند که به کار محدود است، نه به اتصال.

یک سازوکار مشخص: سریال‌سازی متعارف پوشش پیام را امضا کنید، شامل هویت، شناسه وظیفه، نام قابلیت، و یک شماره ترتیب یکنوا افزایش‌یابنده، با کلیدی که عامل فرستنده نگه می‌دارد. گیرنده امضا را در برابر کلیدی که به هویت گره خورده بررسی می‌کند، شماره ترتیب را با آخرین شماره دیده‌شده برای آن وظیفه می‌سنجد، و تنها پس از آن ارزیابی می‌کند که آیا قابلیت مجاز است. این رمزنگاری بدیعی نیست؛ کمینه چیزی است که

قابلیت‌ها را به پیام محدود کنید، نه به اتصال

A soldier belonging to the African Union Mission in Somalia monitors traffic along a street during an operation aimed at improving security

مجوزدهی در سطح اتصال ریشه جریان‌های نماینده گیج‌شده است. اتصالی که مجاز به فراخوانی یک قابلیت است می‌تواند آن را به هر دلیلی فراخوانی کند. در مقابل، اعطای قابلیت در سطح پیام، قابلیت، وظیفه، هویت و یک انقضا را نام می‌برد. گیرنده اعطا را بررسی می‌کند، نه اتصال را. این یعنی نماینده نمی‌تواند ارتقا یابد: فقط می‌تواند اعطاهایی را ارائه دهد که به آن صادر شده‌اند، برای وظایفی که به آن داده شده‌اند.

این بده‌بستان واقعی است. اعطاهای سطح پیام به هر فراخوان یک توکن اضافه می‌کنند، به یک صادرکننده نیاز دارند، و یک مسئله ابطال را معرفی می‌کنند. در ازدحام‌های داخلی با توان بالا، سربار در تأخیر و در پیچیدگی صادرکننده قابل اندازه‌گیری است. جایگزین — اعتماد به اتصال — ارزان‌تر است و باز شکست می‌خورد. انتخاب طراحی این است که آیا لایه انتقال باید در برابر منشأ بسته شکست بخورد. برای ارتباط عامل به عامل در مرزهای اعتماد، باید چنین باشد.

لاگ لایه انتقال را به سند معتبر تبدیل کنید

لاگ‌های سمت عامل توصیه‌ای هستند. یک عامل می‌تواند به‌خطر بیفتد، دوباره راه‌اندازی شود، یا صرفاً درباره کاری که کرده اشتباه کند. اگر تنها سند یک پیام در عامل فرستنده یا گیرنده باشد، آن سند شواهد نیست. لایه انتقال باید هر پوشش امضاشده را همراه با نتیجه تأییدش ثبت کند، و آن لاگ باید سند معتبر برای حسابرسی و برای تشخیص بازپخش باشد. این همچنین جایی فراهم می‌کند برای اعمال یکتایی nonce در سراسر نقطه‌گذاری‌ها: لایه انتقال، نه عامل، به یاد می‌آورد چه چیزی دیده شده است.

بده‌بستان صادقانه

هر یک از این قواعد کار را از عامل به لایه انتقال منتقل می‌کند. این همان نکته است، و همان هزینه هم هست. لایه‌های انتقالی که امضاها را تأیید می‌کنند، شماره‌های ترتیب را ردیابی می‌کنند، اعطاهای محدود به پیام را صادر و ابطال می‌کنند، و یک لاگ پایدار نگه می‌دارند، پیچیده‌تر از لوله‌هایی هستند که بایت جابه‌جا می‌کنند. آن‌ها به مدیریت کلید، یک صادرکننده، و لاگی نیاز دارند که از راه‌اندازی مجدد جان سالم به در ببرد. تأخیر و حالت‌های شکست اضافه می‌کنند. در فراخوانی ابزار تک‌فراخوان، این پیچیدگی توجیه ندارد. در ازدحام عامل همتا که هویت‌ها واگرا می‌شوند و اجراهای بلندمدت نقطه‌گذاری و از سر می‌گیرند، پیچیدگی همان ویژگی امنیتی است. پرسش این نیست که آیا باید هزینه‌اش را پرداخت، بلکه کجا: در لایه انتقال، یک بار، یا در هر عامل، به‌طور مکرر و ناسازگار.

گام بعدی چه باشد

با لایه انتقال مانند یک سطح حمله رفتار کنید و آن را به‌عنوان یکی حسابرسی کنید. گام‌هایی را که درخواست دوباره سریال‌سازی می‌شود برشمارید و بپرسید چه منشأیی جان سالم به در می‌برد. کشف قابلیت را از مجوزدهی به قابلیت جدا کنید و در زمان فراخوانی یک اعطا بخواهید. پیام‌ها را به هویت‌ها و وظایف گره بزنید، نه به نشست‌ها. لاگ لایه انتقال را معتبر کنید و از آن برای تشخیص بازپخش استفاده کنید. هیچ‌یک از این‌ها نیازمند رها کردن لایه‌های انتقال به سبک MCP نیست؛ نیازمند گسترش آن‌ها با ابتدایی‌های اعتمادی است که ارتباط همتا لازم دارد. برای کار مرتبط درباره امنیت پروتکل عامل، این تحلیل را ببینید.

اشتراک‌گذاریXLinkedInپیوند یکتا5 دقیقه مطالعه

خواندن مرتبط

پرسش‌هایی که این پاسخ می‌دهد

Why is MCP-style transport insufficient for peer agents?

MCP-style transports were designed for a single trusted caller invoking tools. They do not bind messages to principals or tasks, so provenance is lost at every re-serialisation hop, and capability discovery is conflated with authorisation.

What is a confused-deputy flow in agent-to-agent communication?

It occurs when a low-privilege agent relays a high-privilege call because the transport authorises the connection rather than the message. The deputy is authorised, so identity checks pass, but the original principal should not have had the capability.

How can replay attacks be prevented in long-horizon agent runs?

Bind a nonce or monotonically increasing sequence number to each message and have the transport, not the agent, track seen values across checkpoints. Agent-side memory is insufficient because it does not survive restarts reliably.

Should capability grants be per-connection or per-message?

Per-message. Connection-level grants enable confused-deputy escalation. Message-level grants name the capability, task, principal, and expiry, so a deputy can only present grants issued to it. The trade-off is added token overhead and a revocation problem.