از اعتماد به عامل دست بردارید: تأییدیه را به فراخوانی دقیق ابزار محدود کنید
اکثر سیستمهای مبتنی بر عامل (agentic)، اقدامات خطرناکی مانند نوشتن در فایل یا انتقال پول را تنها با یک تأییدیه ساده محافظت میکنند.
معمولاً این تأییدیه یک پرچم بولی (boolean flag) در وضعیت سیستم است.
مثال: approved: true.
این یک اشتباه است. یک مقدار بولی به سه روش شکست میخورد که مهاجمان از آنها سوءاستفاده میکنند:
- جابهجایی (Flip): یک مهاجم وضعیت را از false به true از طریق تزریق پرامپت (prompt injection) یا نقصهای کد تغییر میدهد.
- بازپخش (Replay): شما یک دستور امن مانند "read file" را تأیید میکنید. سیستم مقدار "true" را میبیند و اجازه میدهد دستور دوم و خطرناک مانند "delete database" اجرا شود.
- انحراف آرگومان (Argument Drift): شما "send $10" را تأیید میکنید. یک مهاجم مبلغ را قبل از اجرا به ۱۰,۰۰۰ دلار تغییر میدهد. پرچم همچنان "true" باقی میماند.
مشکل اینجاست که شما تأییدیه را به عنوان ویژگی کل نشست (session) مدلسازی میکنید. تأییدیه باید مدرکی برای یک فراخوانی خاص باشد.
چگونه آن را اصلاح کنیم:
وقتی یک انسان یک فراخوانی را تأیید میکند، یک تگ امن ایجاد کنید. این تگ باید این چهار مورد را قفل کند:
- شناسه (ID) منحصربهفرد فراخوانی ابزار.
- هشِ (hash) آرگومانهای دقیق.
- هویت کاربر.
- زمان انقضا.
این تگ را دقیقاً در لحظه اجرا تأیید کنید. از یک کلید مخفی استفاده کنید که فقط سیستم از آن مطلع است.
برای پیادهسازی، این قوانین را دنبال کنید:
- استفاده از استانداردسازی (Canonicalization): هم تأییدکننده و هم اجراکننده باید دقیقاً همان بایتها را هش کنند. از RFC 8785 استفاده کنید تا مطمئن شوید اعداد و کلیدها مطابقت دارند.
- شکست در حالت بسته (Fail Closed): اگر تگ مفقود، منقضی یا اشتباه بود، یک خطای مشخص "not approved" برگردانید. با آن مانند یک نتیجه استاندارد ابزار برخورد نکنید.
- رد به صورت پیشفرض (Deny by Default): فقط اجازه استفاده از ابزارهایی را بدهید که نیاز به تأیید صریح دارند. بقیه موارد را رد کنید.
- مدیریت بازپخش (Handle Replays): اگر از موتورهایی مانند Temporal استفاده میکنید، مطمئن شوید که کلید مخفی شما قطعی (deterministic) است. اگر کلید پس از بازراهاندازی سیستم تغییر کند، تمام تأییدیههای موجود با شکست مواجه میشوند.
مجوزدهی (Authorization) نباید یک قطعه وضعیت شناور باشد. بلکه باید یک پاکت متصل شده باشد که ثابت کند: «این شخص خاص، این آرگومانهای خاص را برای این ابزار خاص تا این زمان مشخص تأیید کرده است.»
استفاده از مقادیر بولی را متوقف کنید. آنها سادهسازی نیستند؛ آنها یک باگ هستند.
انجمن یادگیری اختیاری: https://t.me/GyaanSetuAi