تزریق دستورالعمل (Prompt Injection) در LLM و امنیت حفاظتی (Guardrail)
مدلهای زبانی بزرگ (LLMها) مرز مشخصی بین دستورالعملها و دادهها ندارند. هر آنچه در پنجره بافت (context window) قرار دارد، جریانی واحد از توکنهاست. تزریق دستورالعمل زمانی رخ میدهد که دادههای مهاجم در نقش دستورالعمل عمل کنند. شما نمیتوانید تنها با فیلتر کردن به امنیت برسید؛ بلکه باید با استراتژی «دفاع در عمق» (defense-in-depth) آن را مدیریت کنید.
شکست دفاعهای رایج:
- لیستهای سیاه کلمات کلیدی (Keyword Blocklists): مهاجمان از مترادفها، غلطهای املایی یا زبانهای مختلف برای دور زدن آنها استفاده میکنند. فیلتر کردن رشتهها، فیلتر کردن «قصد و نیت» نیست.
- حذف اطلاعات در خروجی (Output Redaction): مهاجمان میتوانند اطلاعات حساس را تکهتکه یا کدگذاری کنند تا تطبیق دقیق رشتهها با شکست مواجه شود.
- داورهای LLM: یک مدل مجزا را میتوان از طریق مهندسی اجتماعی فریب داد تا باور کند یک اطلاعات حساس، بیخطر است.
- بازبینی انسانی: انسانها متن رندر شده را میبینند، نه بایتهای خام را. آنها نمیتوانند کاراکترهای پنهانی را که در حملات ASCII Smuggling استفاده میشوند، تشخیص دهند.
حملات ASCII Smuggling یک تهدید بزرگ محسوب میشوند. این روش از کاراکترهای نامرئی مانند تگهای یونیکد (Unicode Tags) یا فاصلههای با عرض صفر (zero-width spaces) برای پنهان کردن دستورالعملها استفاده میکند. مدل آنها را میخواند، اما انسان چیزی نمیبیند. این امر امکان جعل هویت و استخراج دادهها (data exfiltration) را از طریق ایمیل یا تقویم فراهم میکند.
چگونه از اپلیکیشن خود دفاع کنید:
- پاکسازی دادههای خام (Sanitize raw payloads): کاراکترهای کنترلی و کاراکترهای با عرض صفر را پیش از رسیدن به مدل حذف کنید.
- استفاده از لیستهای سفید (Allowlists): به جای تعقیب موارد مخرب، دستهبندیهای خاص یونیکد مورد نیاز خود را تعریف کنید.
- نرمالسازی دادهها: از نرمالسازی NFKC روی تمام ورودیها استفاده کنید.
- به حداقل رساندن اطلاعات حساس: اگر مدل به دادههای حساس نیاز ندارد، آنها را در پنجره بافت (context window) قرار ندهید.
- برخورد با RAG به عنوان منبع غیرقابل اعتماد: فرض کنید هر سندی که برای مدل بازیابی میکنید، یک بردار بالقوه برای تزریق (injection vector) است.
- مراقب ناهنجاریها باشید: ورودیهایی را که طول ظاهری آنها با تعداد واقعی کد-پوینتها (code-point count) متفاوت است، علامتگذاری کنید.
امنیت یک نقص در خط لوله (pipeline) است، نه فقط یک نقص در مدل. راه حل در کد اپلیکیشن شما نهفته است.
Source: https://dev.to/geekaara/llm-prompt-injection-guardrail-security-glm
Optional learning community: https://t.me/GyaanSetuAi