تصور کنید برای جلوگیری از ارسال رمز عبور یا کلیدهای حساس به سرورهای آنتروپیک، یک فیلتر امنیتی میسازید، اما همان رمزها در یک فایل متنی ساده روی سیستم شما حک میشوند. این دقیقاً همان شکاف امنیتی است که در سازوکار مسدودسازی پرامپتهای Claude Code کشف شده است.
بر اساس نتایج ۲۰ آزمایش کنترلشده در ۳۰ سپتامبر ۲۰۲۶، محققان دریافتند که اگرچه هوک UserPromptSubmit با موفقیت مانع رسیدن پرامپت به مدل میشود، اما متن کامل درخواست همچنان در فایل تاریخچهٔ جلسه (Session Transcript) در دیسک محلی ثبت میگردد. این یافته در حالی منتشر میشود که توسعهدهندگان بهشدت به عاملهای هوش مصنوعی محلی برای مدیریت کدهای حساس تکیه میکنند. این چالش با مشکلات دسترسی به دیسک در محیطهای عملیاتی که پیشتر بررسی کردیم، همراستا است و نشان میدهد مدیریت فایلها همچنان نقطه ضعف عاملهای کدنویس است.
همانطور که در پوشش پیشین ما دربارهی انطباق Claude Code با استانداردهای GovCloud اشاره کردیم، تفکیک بین «زمینهٔ مدل» و «ماندگاری روی دیسک» حیاتی است. برای یک برنامهنویس، تفاوت این دو در واقع فاصله میان ارسال یک راز به سرور شخص ثالث و ذخیره همان راز در یک فایل JSONL ساده روی ماشین شخصی است.
سازوکار هوکهای امنیتی
هوک UserPromptSubmit — شبیه نگهبانی که قبل از ورود نامه به دفتر مدیر، محتوای آن را چک میکند — دقیقاً پس از فشردن کلید Enter و پیش از دیدن ورودی توسط مدل اجرا میشود. طبق مستندات code.claude.com، این هوک برای دو هدف طراحی شده است: تزریق زمینهٔ لحظهای (مانند شاخه فعلی git) یا مسدود کردن کامل پرامپت برای جلوگیری از نشت کلیدهای API.
به نقل از نتایج آزمایشگاهی، وقتی هوکی تصمیم به مسدودسازی (block) میگیرد یا با کد ۲ خارج میشود، مدل هرگز فراخوانی نمیشود. در ۶ مورد از ۶ اجرای مسدودشده، هزینه استنتاج (Inference) — یعنی همان لحظه تولید جواب توسط مدل — صفر دلار باقی ماند و هیچ دادهای به ابر ارسال نشد.
جزئیات محیط آزمایش
برای تایید این رفتار، محیطی با نسخه ۲.۱.۲۸۵ از Claude Code و مدل claude-opus-5-5 ایجاد شد. تنظیمات در فایل .claude/settings.json به گونهای بود که یک اسکریپت پایتون (ups-probe.py) را فراخوانی میکرد. جزئیات فنی این محیط به شرح زیر است:
- منطق اسکریپت: اسکریپت
ups-probe.pyحالت اجرا را از یک فایل میخواند و هر اجرا را برای تایید دقیق، لاگ میکرد. - دستور اجرا: از دستور
claude -pبا فلگهای--strict-mcp-configو--session-idبرای جداسازی کامل جلسات استفاده شد. - ایزولاسیون: متغیرهای محیطی مانند
CLAUDECODEحذف شدند تا هیچ وضعیتی از جلسات قبلی به اجرای جدید منتقل نشود.
توهمِ پاکسازی و نشت تاریخچه
بررسیها نشان داد که «پاکسازی» پرامپت تنها در سطح فراخوانی API رخ میدهد، نه در سیستم فایل محلی. محققان دریافتند اولین رکورد در هر جلسه مسدودشده، یک رکورد queue-operation است که متن کامل پرامپت را در خود دارد. نکته تکاندهنده این است که این رکورد حتی پیش از پردازش خروجی هوک ثبت میشود. این تضاد بین آنچه سیستم گزارش میدهد و آنچه واقعاً رخ میدهد، یادآور بحث لاگهای توهمی در ارزیابی عملکرد AI است که در آن دادههای ثبتشده لزوماً بازتابدهنده واقعیت عملیاتی نیستند.

حتی با فعال کردن فلگ suppressOriginalPrompt — که باعث میشود پرامپت از دید کاربر در ترمینال حذف شود — دادهها همچنان در تاریخچه محلی باقی میمانند. در ۴ مورد از ۶ اجرای مسدودشده، پرامپت حتی دو بار روی دیسک نوشته شد: یک بار در رکورد صف و یک بار در رکورد سیستم.
تزریق زمینه و هزینههای توکن
این ممیزی همچنین اثر خروجیهای مختلف هوک را بر پنجرهٔ زمینه (Context Window) — یعنی میزان متنی که مدل همزمان در ذهن نگه میدارد — اندازه گرفت. وقتی هوک متنی ساده را چاپ میکند، این متن به عنوان یک یادآور سیستمی تزریق میشود. برای یک رشته ۸۳ کاراکتری، ۵۵ توکن (Token) — تکههای کوچکی از متن که مدل میخواند — به درخواست اضافه شد.
استفاده از JSON برای ارائه additionalContext نتیجه مشابهی داشت و ۵۷ توکن اضافه کرد. بنابراین، مگر در موارد خاص، دلیلی برای ترجیح JSON بر متن ساده در تزریق زمینه وجود ندارد. در واقع، تفاوت مدیریت پرامپت در محیط تولید نشان میدهد که سادگی در ساختار دادهها اغلب به پایداری بیشتر سیستم منجر میشود.
پرتگاه ۱۰,۰۰۰ کاراکتری
در این ابزار یک حد سخت در ۱۰,۰۰۰ کاراکتر وجود دارد. آزمایشها نشان داد:
- زیر حد: خروجی ۱۰,۰۰۰ کاراکتری بهطور کامل ارسال شد و ۳,۶۵۱ توکن به درخواست اول افزود.
- بالای حد: خروجی ۵۰,۰۰۰ کاراکتری قطع شد. Claude Code متن کامل را در یک فایل محلی ذخیره کرد و تنها یک پیشنمایش ۱۹۴۹ کاراکتری را برای مدل فرستاد.
این سازوکار باعث میشود خروجیهای حجیم ارزانتر تمام شوند؛ خروجی ۵۰ هزار کاراکتری تقریباً یکچهارم هزینه خروجی ۱۰ هزار کاراکتری را داشت، زیرا مدل فقط پیشنمایش را دید و مسیر فایل را دریافت کرد.
نقاط شکست و تلههای JSON
دو حالت رایج شکست خاموش در هوکها شناسایی شد:
۱. خطاهای غیرمسدودکننده: اگر هوک با کد ۱ خارج شود، عملیات ادامه مییابد اما تمام متونی که هوک پیش از شکست چاپ کرده بود، دور ریخته میشوند و هرگز به مدل نمیرسند.
۲. اشیاء JSON عریان: اگر هوک یک شیء JSON را مستقیماً چاپ کند (بدون قرار دادن در فیلد additionalContext)، Claude Code آن را تجزیه میکند اما کلیدها را نادیده میگیرد و هیچ دادهای به مدل ارسال نمیشود.

رفتار در خط لولههای CI/CD
برای کسانی که از این ابزار در محیطهای CI/CD استفاده میکنند، رفتار سیستم فریبنده است. حتی وقتی پرامپت مسدود میشود، فرآیند claude -p با کد خروجی ۰ و پیام subtype: success پایان مییابد. اسکریپتهایی که فقط کد خروجی را چک میکنند، به اشتباه تصور میکنند پرامپت با موفقیت پردازش شده است.
تحلیل: توهم امنیتی
این کشف، درک ما از «مسدودسازی» در عاملهای هوش مصنوعی را تغییر میدهد. برای کاربر عادی، ترس اصلی نشت داده به تامینکننده مدل است و در این مورد، هوک عالی عمل میکند. اما برای سازمانهای حساس، تاریخچه محلی به یک بردار حمله جدید تبدیل میشود. اگر توسعهدهندهای از هوک برای مسدود کردن یک راز استفاده کند، آن راز را برای همیشه در دایرکتوری .claude پروژه حک کرده است.
بنابراین، suppressOriginalPrompt یک ویژگی رابط کاربری (UI) است، نه یک ویژگی امنیتی. این فلگ فقط مانع نمایش راز در ترمینال میشود، اما هیچ حفاظتی برای دیسک محلی ایجاد نمیکند.
گام بعدی شما
- تمام دستورات جمعآوری زمینه را طوری بنویسید که حتماً با کد خروجی ۰ پایان یابند تا دادهها دور ریخته نشوند.
- دادهها را همیشه در فیلد
additionalContextقرار دهید و از چاپ JSON عریان بپرهیزید. - برای جلوگیری از ثبت تاریخچه روی دیسک، از فلگ
--no-session-persistenceاستفاده کنید. - در اسکریپتهای CI، بهجای کد خروجی، مقدار
num_turns: 0را برای تشخیص مسدود شدن پرامپت چک کنید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو