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

آیا هوک‌های امنیتی Claude Code مانع ذخیرهٔ داده‌های حساس می‌شوند؟

·۱۴ مهر ۱۴۰۵۱۵ دقیقه مطالعه
آیا قلاب UserPromptSubmit در Claude Code از ثبت پرامپت مسدودشده در گفتار جلوگیری می‌کند؟ ۶ مورد هیچ‌کدام به مدل نرسیدند، اما
آیا قلاب UserPromptSubmit در Claude Code از ثبت پرامپت مسدودشده در گفتار جلوگیری می‌کند؟ ۶ مورد هیچ‌کدام به مدل نرسیدند، اما
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

کشف نشت داده در لایه ذخیره‌سازی محلی Claude Code؛ در حالی که پرامپت‌ها به مدل نمی‌رسند، اما در فایل‌های JSONL محلی ثبت می‌شوند.

تصور کنید برای جلوگیری از ارسال رمز عبور یا کلیدهای حساس به سرورهای آنتروپیک، یک فیلتر امنیتی می‌سازید، اما همان رمزها در یک فایل متنی ساده روی سیستم شما حک می‌شوند. این دقیقاً همان شکاف امنیتی است که در سازوکار مسدودسازی پرامپت‌های 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 است که در آن داده‌های ثبت‌شده لزوماً بازتاب‌دهنده واقعیت عملیاتی نیستند.

بررسی هوک UserPromptSubmit در Claude Code: آیا پرامپت مسدودشده از رونوشت حذف می‌شود؟ ۶ مورد بررسی شد.

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

تزریق زمینه و هزینه‌های توکن

این ممیزی همچنین اثر خروجی‌های مختلف هوک را بر پنجرهٔ زمینه (Context Window) — یعنی میزان متنی که مدل هم‌زمان در ذهن نگه می‌دارد — اندازه گرفت. وقتی هوک متنی ساده را چاپ می‌کند، این متن به عنوان یک یادآور سیستمی تزریق می‌شود. برای یک رشته ۸۳ کاراکتری، ۵۵ توکن (Token) — تکه‌های کوچکی از متن که مدل می‌خواند — به درخواست اضافه شد.

استفاده از JSON برای ارائه additionalContext نتیجه مشابهی داشت و ۵۷ توکن اضافه کرد. بنابراین، مگر در موارد خاص، دلیلی برای ترجیح JSON بر متن ساده در تزریق زمینه وجود ندارد. در واقع، تفاوت مدیریت پرامپت در محیط تولید نشان می‌دهد که سادگی در ساختار داده‌ها اغلب به پایداری بیشتر سیستم منجر می‌شود.

پرتگاه ۱۰,۰۰۰ کاراکتری

در این ابزار یک حد سخت در ۱۰,۰۰۰ کاراکتر وجود دارد. آزمایش‌ها نشان داد:

  • زیر حد: خروجی ۱۰,۰۰۰ کاراکتری به‌طور کامل ارسال شد و ۳,۶۵۱ توکن به درخواست اول افزود.
  • بالای حد: خروجی ۵۰,۰۰۰ کاراکتری قطع شد. Claude Code متن کامل را در یک فایل محلی ذخیره کرد و تنها یک پیش‌نمایش ۱۹۴۹ کاراکتری را برای مدل فرستاد.

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

نقاط شکست و تله‌های JSON

دو حالت رایج شکست خاموش در هوک‌ها شناسایی شد:

۱. خطاهای غیرمسدودکننده: اگر هوک با کد ۱ خارج شود، عملیات ادامه می‌یابد اما تمام متونی که هوک پیش از شکست چاپ کرده بود، دور ریخته می‌شوند و هرگز به مدل نمی‌رسند.
۲. اشیاء JSON عریان: اگر هوک یک شیء JSON را مستقیماً چاپ کند (بدون قرار دادن در فیلد additionalContext)، Claude Code آن را تجزیه می‌کند اما کلیدها را نادیده می‌گیرد و هیچ داده‌ای به مدل ارسال نمی‌شود.

بررسی هوک UserPromptSubmit در Claude Code: آیا پرامپت مسدودشده از رونوشت حذف می‌شود؟

رفتار در خط لوله‌های CI/CD

برای کسانی که از این ابزار در محیط‌های CI/CD استفاده می‌کنند، رفتار سیستم فریبنده است. حتی وقتی پرامپت مسدود می‌شود، فرآیند claude -p با کد خروجی ۰ و پیام subtype: success پایان می‌یابد. اسکریپت‌هایی که فقط کد خروجی را چک می‌کنند، به اشتباه تصور می‌کنند پرامپت با موفقیت پردازش شده است.

تحلیل: توهم امنیتی

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

بنابراین، suppressOriginalPrompt یک ویژگی رابط کاربری (UI) است، نه یک ویژگی امنیتی. این فلگ فقط مانع نمایش راز در ترمینال می‌شود، اما هیچ حفاظتی برای دیسک محلی ایجاد نمی‌کند.

گام بعدی شما

  • تمام دستورات جمع‌آوری زمینه را طوری بنویسید که حتماً با کد خروجی ۰ پایان یابند تا داده‌ها دور ریخته نشوند.
  • داده‌ها را همیشه در فیلد additionalContext قرار دهید و از چاپ JSON عریان بپرهیزید.
  • برای جلوگیری از ثبت تاریخچه روی دیسک، از فلگ --no-session-persistence استفاده کنید.
  • در اسکریپت‌های CI، به‌جای کد خروجی، مقدار num_turns: 0 را برای تشخیص مسدود شدن پرامپت چک کنید.

اما داستان سخت‌افزاری این تحول حتی شگفت‌انگیزتر است — به تحلیل ما درباره‌ی تراشه‌های Blackwell مراجعه کنید.

چرا این موضوع مهم است؟

این موضوع اعتبار ادعاهای امنیتی در ابزارهای Agentic را به چالش می‌کشد و نشان می‌دهد که حفاظ‌های لایه کاربر (UI) نباید با حفاظ‌های لایه داده اشتباه گرفته شوند. سازمان‌های حساس باید سیاست‌های جدیدی برای مدیریت دایرکتوری‌های محلی AI اتخاذ کنند.

تأثیر برای ایران

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

·نگاه ما
تحریریه دات‌هوش

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

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.