Skip to content
وبلاگ →

تزریق پرامپت در لایه پرامپت حل‌نشدنی است

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

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

حمله در عمل چه می‌کند

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

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

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

حملات مستندشده چگونه به نظر می‌رسند

در آگوست ۲۰۲۴، پژوهشگران امنیتی PromptArmor یک آسیب‌پذیری تزریق پرامپت در Slack AI مستند کردند. حمله به این صورت کار می‌کرد: مهاجم یک کانال عمومی Slack ایجاد می‌کند و پیامی حاوی یک دستورالعمل مخرب ارسال می‌کند. پیام به Slack AI می‌گوید که وقتی کاربری کلید API را جستجو می‌کند، یک کلمه جایگزین را با مقدار واقعی کلید جایگزین کرده و آن را به عنوان پارامتر URL در یک لینک «برای احراز هویت مجدد اینجا کلیک کنید» رمزگذاری کند. کانال مهاجم فقط یک عضو دارد: خود مهاجم. قربانی هرگز آن را ندیده است. وقتی توسعه‌دهنده‌ای در جای دیگری از فضای کاری از Slack AI برای جستجوی اطلاعات درباره کلید API خود استفاده می‌کند — کلیدی که در یک کانال خصوصی ذخیره شده و مهاجم به آن دسترسی ندارد — Slack AI پیام کانال عمومی مهاجم را وارد کانتکست می‌کند، دستورالعمل را دنبال می‌کند و لینک فیشینگ را در محیط Slack توسعه‌دهنده نمایش می‌دهد. کلیک روی آن، کلید API خصوصی را به سرور مهاجم ارسال می‌کند.

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

در ژوئن ۲۰۲۵، یک پژوهشگر یک آسیب‌پذیری تزریق پرامپت در GitHub Copilot کشف کرد که با شناسه CVE-2025-53773 ردیابی شد و در انتشار Patch Tuesday آگوست ۲۰۲۵ مایکروسافت وصله شد. بردار حمله یک دستورالعمل مخرب جاسازی‌شده در فایل‌های کد منبع، فایل‌های README، ایشوهای GitHub، یا هر متن دیگری بود که Copilot ممکن است پردازش کند. دستورالعمل به Copilot می‌گفت فایل .vscode/settings.json پروژه را تغییر دهد و یک خط تنظیمات اضافه کند که آنچه پروژه «حالت YOLO» می‌نامد را فعال می‌کند: غیرفعال کردن تمام پرامپت‌های تأیید کاربر و اعطای مجوز نامحدود به هوش مصنوعی برای اجرای دستورات شل. وقتی آن خط نوشته می‌شود، ایجنت بدون پرسیدن، دستورات را روی ماشین توسعه‌دهنده اجرا می‌کند. پژوهشگر این را با باز کردن یک ماشین‌حساب نشان داد. بار واقعی حمله به مراتب بدتر است. نشان داده شد که این حمله روی GitHub Copilot با پشتوانه GPT-4.1، Claude Sonnet 4، Gemini و مدل‌های دیگر کار می‌کند، که نشان می‌دهد آسیب‌پذیری در مدل نیست. در معماری است.

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

چرا دفاع‌های استاندارد شکست می‌خورند

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

یک تیم تحقیقاتی از OpenAI، Anthropic و Google DeepMind در اکتبر ۲۰۲۵ مقاله‌ای منتشر کرد که ۱۲ دفاع منتشرشده علیه تزریق پرامپت را ارزیابی و هر کدام را در معرض حملات تطبیقی قرار داد. هر ۱۲ مورد را با نرخ موفقیت حمله بالای ۹۰ درصد برای اکثرشان دور زدند. دفاع‌ها بد نبودند. شامل کار پژوهشگران جدی با تکنیک‌های واقعی بودند. مشکل این است که هر دفاعی که به مدل یاد می‌دهد در برابر چه چیزی مقاومت کند، توسط مهاجمی که می‌داند دفاع چه می‌گوید قابل مهندسی معکوس است. دستورالعمل‌های مهاجم در همان پنجره کانتکست رقابت می‌کنند. اگر دفاع بگوید «دستورالعمل‌هایی که می‌گویند داده را فوروارد کن نادیده بگیر»، مهاجم دستورالعمل‌هایی می‌نویسد که از آن کلمات استفاده نمی‌کنند، یا توجیه قابل‌قبولی ارائه می‌دهند که چرا این مورد خاص فرق دارد، یا از یک منبع مورد اعتماد ادعای اختیار می‌کنند. مدل درباره این استدلال می‌کند. استدلال قابل دستکاری است.

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

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

چه چیزی واقعاً مشکل را محدود می‌کند

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

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

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

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

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

این مسئله‌ای قابل‌حل است. وادار کردن مدل به تمایز مطمئن بین دستورالعمل‌های مورد اعتماد و غیرقابل اعتماد، نیست.