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

آپدیت پنهان Claude Code استقلال عامل‌های هوش مصنوعی را بدون اجازه کاربر فعال کرد

·۲۶ تیر ۱۴۰۵۲۶ دقیقه مطالعه۲ بازدید
گزارش تحقیقی
کد کلود: آناتومی یک ویژگی نادرست
کد کلود: آناتومی یک ویژگی نادرست
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

افشای مکانیسم «تایمر ۶۰ ثانیه‌ای» برای دور زدن تأیید کاربر در Claude Code؛ تغییری که به‌صورت عمدی در باینری کد شده اما در مستندات پنهان مانده بود.

تصور کنید یک دقیقه از میز کارتان بلند شوید و وقتی برگردید، ببینید عامل هوش مصنوعی شما یک تصمیم حیاتی در معماری پروژه گرفته است. این کابوس در ۱ جولای ۲۰۲۶ به واقعیت تبدیل شد؛ زمانی که آنتروپیک (Anthropic) یک «ایستره‌اگ» (Easter Egg) غافلگیرکننده را در نسخه ۲.۱.۱۹۸ ابزار Claude Code جای‌گذاری کرد. این به‌روزرسانی یک میان‌بر برای بهره‌وری ایجاد کرد که به عامل (Agent) — شبیه دستیاری که برای انجام کارهای تکراری استخدام شده اما گاهی تصمیمات جسورانه می‌گیرد — اجازه می‌داد اگر کاربر طی ۶۰ ثانیه‌ پاسخ نداد، بدون کسب تکلیف ادامه دهد.

اگر شما این بازه زمانی را از دست بدهید، کلود به‌طور مفید کاری را که فکر می‌کند بهترین است انجام می‌دهد و به مسیر خود ادامه می‌دهد. خروجی ترمینال دقیقاً این عبارت را چاپ می‌کرد: «کلود پرسید: ⎿ … ● پاسخی پس از ۶۰ ثانیه دریافت نشد — بدون پاسخ ادامه یافت ● کاربر از سیستم فاصله گرفت. من با بهترین قضاوت پیش می‌روم. برنامه من:"

این تغییر رفتار در حالی رخ می‌دهد که ما به عامل‌های هوش مصنوعی برای کارهای حساس اعتماد بیشتری می‌کنیم. برنامه‌نویسان معمولاً چندین عامل را به‌طور موازی اجرا می‌کنند و نظارت لحظه‌ای بر تک‌تک پرامپت‌ها تقریباً غیرممکن است. همان‌طور که در پوشش پیشین ما از کشفیات مدل‌های داخلی آنتروپیک و فضای کاری‌های عملکردی دیدیم، این اتفاق شکافی هشداردهنده میان وعده «حضور انسان در چرخه» (human-in-the-loop) و اجرای واقعی استقلال عامل‌محور را نشان می‌دهد. این موضوع اهمیت بیشتری می‌یابد وقتی به تجربیات توسعه‌دهندگانی که سعی کرده‌اند Claude Code را برای ماه‌ها به‌صورت بدون نظارت اجرا کنند و با پیچیدگی‌های فنی این مسیر روبرو شده‌اند، نگاه می‌کنیم.

کالبدشکافی یک «قابلیت اشتباه»

به نقل از بررسی فنی سایت olafalders.com، هسته این اتفاق ابزار AskUserQuestion است. در حالت عادی، این ابزار تا زمانی که انسان پاسخ ندهد، حرکت عامل را متوقف می‌کند (Blocking). اما در نسخه ۲.۱.۱۹۸، کد باینری تغییر کرد تا پس از ۶۰ ثانیه بی‌تحرکی، نتیجه «در هر صورت ادامه بده» (proceed anyway) را به‌صورت خودکار برگرداند.

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

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

رابط کاربری فریبکار

اگرچه ابزار یک شمارش معکوس زنده را نمایش می‌داد، اما این شمارنده بلافاصله ظاهر نمی‌شد. بررسی باینری نشان می‌دهد که شمارش معکوس تنها در ۲۰ ثانیه پایانیِ پنجره ۶۰ ثانیه‌ای (که توسط متغیر CLAUDE_AFK_COUNTDOWN_MS کنترل می‌شود) فعال می‌شد. در ۴۰ ثانیه اول، دیالوگ شبیه یک پرسش متوقف‌کننده استاندارد به نظر می‌رسید. متن رندر شده تنها زمانی که آستانه زمانی می‌رسید، به صورت «auto-continue in {s}s · any key to stay» ظاهر می‌شد.

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

شکاف مستندات

این تغییر در فهرست تغییرات رسمی (Changelog) نسخه‌های ۲.۱.۱۹۸ و ۲.۱.۱۹۹ به‌طور کامل حذف شده بود. با وجود اینکه ابزار AskUserQuestion در ۱۳ نسخه مختلف (از نسخه ۲.۰.۵۵ به بعد) ۱۵ بار ذکر شده بود، این تغییر رفتاری خاص هنگام اضافه شدن هرگز مورد اشاره قرار نگرفت.

در جزئیات نسخه‌ها، نسخه ۲.۱.۱۹۷ فقط به عرضه مدل Sonnet 5 اشاره داشت. نسخه ۲.۱.۱۹۸ حدود ۳۰ مورد و نسخه ۲.۱.۱۹۹ حدود ۲۴ مورد را در لیست تغییرات ثبت کرده بود، اما هیچ‌کدام به رفتار «ادامه خودکار» اشاره نکردند. ثبت رسمی این قابلیت تنها زمانی رخ داد که در نسخه ۲.۱.۲۰۰ در ۳ جولای ۲۰۲۶ لغو شد و اعلام شد که دیالوگ‌ها «دیگر به‌طور پیش‌فرض ادامه خودکار نمی‌یابند» و کاربران را به بخش /config ارجاع داد.

شواهد جرم‌شناختی در باینری

چون آنتروپیک کد منبع (Source Code) Claude Code را منتشر نمی‌کند، پژوهشگران مجبور شدند باینری‌های کامپایل‌شده را با هم مقایسه (Diff) کنند. بررسی‌ها نشان داد این ویژگی یک طراحی عمدی در ساخت (Build) بوده و یک باگ اتفاقی نبوده است. با دانلود نسخه‌های .۱۹۷ و .۱۹۸ از npm و اجرای تحلیل strings بر روی آن‌ها، ثابت شد عبارات مربوط به AFK (دور از کیبورد) در نسخه .۱۹۷ غایب و در نسخه .۱۹۸ موجود بودند.

این قابلیت شامل موارد فنی زیر بود:

  • نام‌گذاری داخلی: استفاده از برچسب پیش‌فرض CLAUDE_AFK_TIMEOUT_MS (مخفف Away From Keyboard).
  • آنالیتیکس تخصصی: رویدادی به نام tengu_ask_user_question_afk_auto_advance که داده‌ها را (به‌جز متن سوال) برای تحلیل به سرورهای آنتروپیک می‌فرستاد.
  • ابزار اندازه‌گیری: ردیابی متغیرهای hadPartialAnswers (داشتن پاسخ‌های ناقص)، questionCount (تعداد سوالات) و isInPlanMode برای تحلیل اینکه عامل‌ها هر چند وقت یک‌بار ورودی‌ها را حدس می‌زنند.
  • فیلد اسکیما: یک میدان داخلی مبتنی بر Zod به نام afkTimeoutMs که فرآیند حل خودکار (Auto-resolution) را توصیف می‌کرد.

خطر به‌روزرسانی‌های خودکار

ابزار Claude Code به‌طور پیش‌فرض در نصب‌های نیتیو و npm خود را به‌روز می‌کند. این یعنی یک دروازه ایمنی حیاتی — نیاز به تأیید انسان — می‌تواند بدون هیچ اقدامی از سوی کاربر، به‌سادگی تغییر کند. برای کسانی که عامل‌ها را روی محیط‌های عملیاتی (Production) اجرا می‌کنند — و احتمالاً قبلاً از دستور --dangerously-skip-permissions استفاده کرده یا دستورات استقرار را در لیست سفید قرار داده‌اند — انتخاب AskUserQuestion تنها دروازه ایمنی باقی‌مانده بود. وقتی این دروازه به یک تایمر ۶۰ ثانیه‌ای تبدیل شد، سیستم ایمنی عملاً باطل شد.

نحوه متوقف کردن به‌روزرسانی‌ها

برای جلوگیری از تغییرات رفتاری پنهان، کاربران می‌توانند به‌روزرسانی‌های خودکار را از طریق settings.json با متغیرهای محیطی زیر غیرفعال کنند. سیستم این متغیرها را با ترتیب خاصی بررسی می‌کند:

  • DISABLE_UPDATES=1: سخت‌گیرانه‌ترین حالت؛ تمام مسیرهای به‌روزرسانی از جمله دستورات دستی claude update را می‌بندد.
  • DISABLE_AUTOUPDATER=1: فقط بررسی‌های پس‌زمینه را متوقف می‌کند؛ به‌روزرسانی دستی همچنان کار می‌کند. این متغیر بر تنظیمات autoUpdates در کانفیگ اولویت دارد.
  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1: یک «پتک» سخت که معادل غیرفعال کردن به‌روزرسان، دستورات بازخورد، گزارش خطا و تله‌متری است.

تله افزونه‌ها

یک نکته عجیب این است که غیرفعال کردن به‌روزرسان، به‌روزرسانی افزونه‌ها (Plugins) را هم متوقف می‌کند. این یک اثر جانبی است که به‌خوبی مستند نشده است. اگر به‌روزرسان به هر دلیلی خاموش باشد، سیستم پیام Plugin autoupdate: skipped (auto-updater disabled) را ثبت می‌کند و متوقف می‌شود.

کاربران باید برای به‌روز نگه داشتن افزونه‌ها در عین ثابت نگه داشتن باینری اصلی، عبارت FORCE_AUTOUPDATE_PLUGINS=1 را در settings.json قرار دهند. توجه کنید که متغیر CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC فقط بر اساس «حضور» (Presence) تشخیص داده می‌شود؛ یعنی حتی اگر آن را برابر با 0 قرار دهید، باز هم به‌روزرسان را می‌بندد و افزونه‌ها را منجمد می‌کند چون باینری فقط وجود متغیر را چک می‌کند، نه مقدارش را.

بحران حاکمیت باینری

این بررسی یک مشکل حاکمیتی را افشا می‌کند: مخزن گیت‌هاب Claude Code تنها شامل مستندات و مثال‌هاست، نه کد ارسالی. برای مثال، دستور git ls-files نشان می‌دهد از ۲۱۶ فایل ردیابی‌شده، ۱۰۴ مورد Markdown هستند. این مخزن در واقع فقط یک لیست تغییرات و مجموعه‌ای از مثال‌هاست.

مقایسه تگ‌های انتشار (مثلاً بین v2.1.197..v2.1.198) فقط تغییرات در CHANGELOG.md و feed.xml را نشان می‌دهد. هیچ منبع عمومی برای مقایسه کد وجود ندارد. در نتیجه، تنها راه تأیید آنچه روی ماشین شما اجرا می‌شود، تحلیل باینری است؛ مانند شناسایی اینکه این یک باینری کامپایل‌شده با Bun (غیر stripped) است و استخراج بسته JS از انتهای فایل.

این حادثه، بحث «حضور انسان در چرخه» را از یک هدف فلسفی به یک الزام فنی تبدیل می‌کند. وقتی یک دروازه ایمنی تنها با تغییر یک خط کد (یک عبارت && در منطق دروازه باینری) غیرفعال می‌شود، ریسک فقط سوزاندن توکن‌ها نیست، بلکه ایجاد تغییرات غیرمجاز در محیط‌های عملیاتی است. در این راستا، بهینه‌سازی نحوه تعامل با مدل برای کاهش هزینه‌ها نیز اهمیت دارد، همان‌طور که در بررسی‌های ما درباره مدیریت بستر متن در Claude Code برای کاهش هزینه‌های API مشاهده کردیم.

برای مدیرانی که ناوگان‌های AI سازمانی را مدیریت می‌کنند، درس روشن است: به وعده‌های فروشنده درباره «پرامپت‌های متوقف‌کننده» (blocking prompts) تکیه نکنید. در عوض، نسخه‌های محیطی را قفل (Pin) کنید و auditing دقیقی روی لاگ‌های عامل‌ها پیاده کنید تا مطمئن شوید هوش مصنوعی به‌جای شما «بهترین قضاوت» را نمی‌کند.

شما اکنون می‌توانید نسخه فعلی خود را با دستور /doctor در CLI بررسی کنید تا ببینید در کانال به‌روزرسانی خودکار هستید یا پین‌شده.

گام بعدی شما

  • نسخه فعلی خود را با دستور /doctor در CLI بررسی کنید تا ببینید در کانال به‌روزرسانی خودکار هستید یا پین‌شده.
  • اگر از Claude Code در محیط‌های حساس استفاده می‌کنید، متغیر DISABLE_AUTOUPDATER=1 را در تنظیمات فعال کنید.
  • لاگ‌های اخیر عامل‌های خود را برای عبارات «continued without an answer» بازرسی کنید تا متوجه تغییرات احتمالی شوید.

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

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

این incident اعتبار مدل‌های «Human-in-the-loop» را با نمایش یک نقطه ضعف ساختاری به چالش می‌کشد. تکیه بر Trust در ابزارهای Agentic بدون داشتن Audit-logهای شفاف، می‌تواند منجر به تغییرات غیرقابل بازگشت در دیتابیس‌های عملیاتی شود.

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

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

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

این اتفاق نشان می‌دهد که «ایمنی در سطح کاربر» در ابزارهای عامل‌محور، بیشتر شبیه یک لایه بصری (UI) است تا یک پروتکل سخت‌افزاری یا نرم‌افزاری متزلزل‌ناپذیر. وقتی یک شرکت برای افزایش نرخ «تکمیل تسک» (Completion Rate)، نظارت انسانی را به یک تایمر تبدیل می‌کند، در واقع دارد کارایی را فدای امنیت می‌کند. ریسک واقعی اینجا نیست که مدل اشتباه کند، بلکه این است که کاربر حتی متوجه نشود مدل چه زمانی تصمیم گرفته است.

منابع

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

گفتگو

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

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

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

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

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

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

دات‌هوش

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

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