پرش به محتوای اصلی
بلاگ
۴ دقیقه مطالعه

دستیارهای کدنویسی هوش مصنوعی کلید API را در گیت‌هاب لو می‌دهند؛ پروژه شما هم جزو آن‌هاست؟

بررسی تازه‌ای در نوامبر ۲۰۲۶ بیش از هزار ریپوی عمومی پیدا کرد که رمز و کلید API واقعی‌شان را یک ایجنت کدنویسی ذخیره کرده بود. چطور اتفاق می‌افتد، چطور در پنج دقیقه ریپوهای خودتان را چک کنید و من چطور رمزها را از دسترس ایجنت دور نگه می‌دارم.

  • امنیت هوش مصنوعی
  • لو رفتن کلید API
  • مدیریت رمزها
  • ایجنت کدنویسی
  • Claude Code
دستیارهای کدنویسی هوش مصنوعی کلید API را در گیت‌هاب لو می‌دهند؛ پروژه شما هم جزو آن‌هاست؟

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

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

پژوهش چه چیزی پیدا کرد

شرکت امنیتی Apiiro در ۵ نوامبر ۲۰۲۶ گزارشی درباره‌ی Claude Code، یکی از محبوب‌ترین ایجنت‌های کدنویسی، منتشر کرد. وقتی این ایجنت برای اجرای یک دستور اجازه می‌خواهد، می‌توانید گزینه‌ی «بله، دیگر نپرس» را بزنید. ایجنت بعد از آن، همان دستور را کلمه‌به‌کلمه در فایلی به اسم .claude/settings.local.json داخل پروژه ذخیره می‌کند.

مشکل در محتوای همین دستورهاست. اگر یک بار اجازه داده باشید ایجنت چیزی مثل psql postgres://admin:S3cret@db... یا یک curl با توکن API در هدر اجرا کند، حالا آن رمز در یک فایل متنی ساده داخل پروژه‌تان نشسته است. خیلی‌ها هم بعد کل پوشه را کامیت می‌کنند.

طبق گزارش Dark Reading و رسانه‌های دیگر:

  • Apiiro بین ۱ تا ۳ نوامبر ۱۰۴٬۱۸۵ فایل عمومی settings.local.json را بررسی کرد.
  • در ۱٬۱۲۲ تا از آن‌ها، یعنی حدود ۱٫۱ درصد، دست‌کم یک رمز واقعی بود؛ در مجموع ۱٬۳۷۹ رمز متفاوت.
  • با حساب تاریخچه‌ی گیت، فایل مشترک .claude/settings.json و گفتگوهای ذخیره‌شده‌ی ایجنت، عدد به ۲٬۵۳۹ رمز در ۱٬۹۹۴ ریپوی عمومی رسید: رمز دیتابیس، کلیدهای کلود، توکن API و حتی دسترسی SSH.

Apiiro بررسی نکرده که این رمزها هنوز کار می‌کنند یا نه. ولی رمزی که حتی یک ساعت در گیت‌هاب عمومی بوده باید دزدیده‌شده حساب شود. ربات‌ها کامیت‌های تازه را ظرف چند دقیقه برای پیدا کردن کلید می‌گردند.

این فقط مشکل Claude Code نیست

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

تغییر واقعی این است: پوشه‌ی پروژه‌ی شما حالا یک نویسنده‌ی دوم دارد که نمی‌داند رمز چیست. هر چیزی را که ببیند در هر فایلی که به کارش کمک کند کپی می‌کند. عادت‌های قدیمی ما، یعنی یک .gitignore و حافظه‌ی خوب، برای پروژه‌ای با یک نویسنده طراحی شده بودند.

ریپوهایتان را در پنج دقیقه چک کنید

اگر از هر ایجنت کدنویسی استفاده می‌کنید، همین امروز این کارها را بکنید.

۱. فایل‌های ایجنت را در ریپوها و تاریخچه‌شان بگردید:

git log --all --oneline -- .claude/settings.local.json .claude/settings.json
git grep -n -E "(password|passwd|token|secret|api[_-]?key)" $(git rev-list --all) -- .claude/ 2>/dev/null | head

در خود گیت‌هاب هم می‌توانید با path:.claude/settings.local.json user:YOUR_NAME حساب خودتان را جستجو کنید.

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

۳. فایل را از گیت خارج کنید و برای همیشه نادیده بگیرید:

git rm --cached .claude/settings.local.json
echo ".claude/settings.local.json" >> .gitignore

۴. اسکن رمز را روشن کنید. قابلیت Push Protection گیت‌هاب خیلی از قالب‌های شناخته‌شده‌ی کلید را قبل از رسیدن به سرور می‌گیرد. ابزارهایی مثل gitleaks هم می‌توانند قبل از هر کامیت روی سیستم خودتان اجرا شوند.

من چطور رمزها را از ایجنت دور نگه می‌دارم

تمیزکاری بخش واکنشی کار است. راه بهتر این است که اصلاً چیزی برای لو رفتن وجود نداشته باشد.

  • هیچ‌وقت رمز را در دستوری که ایجنت می‌بیند تایپ نکنید. آن را از متغیر محیطی یا فایل بخوانید: psql "$DATABASE_URL"، نه آدرس کامل. این‌طوری چیزی که ذخیره می‌شود اسم یک متغیر است، نه رمز.
  • به ایجنت کلید جدا و محدود بدهید. یک کاربر دیتابیس تستی بدون دسترسی به محیط اصلی، یا یک کلید پرداخت در حالت تست. اگر لو برود، اتفاق مهمی نمی‌افتد.
  • رمزهای واقعی را رمزنگاری‌شده نگه دارید. دقیقاً به همین دلیل goraz را ساختم؛ یک ابزار متن‌باز کوچک که توکن‌ها و رمزها را به جای یک فایل .env ساده، در یک فایل رمزنگاری‌شده نگه می‌دارد. ایجنتی که پوشه‌ی پروژه را می‌خواند فقط متن رمزشده می‌بیند، نه کلید.
  • چیزی را که ایجنت کامیت می‌کند بازبینی کنید، نه فقط کدی که می‌نویسد. تغییری که به فایل تنظیمات یا فایل‌های مخفی دست می‌زند ارزش یک نگاه دوباره را دارد.

نظر من

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

برنامه‌نویس‌هایی که با این ابزارها موفق می‌شوند آن‌هایی نیستند که بیشتر از همه به آن‌ها اعتماد می‌کنند؛ آن‌هایی هستند که محیط کارشان را طوری می‌چینند که اشتباه ایجنت هزینه‌ی کمی داشته باشد. رمزها اولین جایی است که باید از آن شروع کرد.

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

دستیارهای کدنویسی هوش مصنوعی کلید API را در گیت‌هاب لو می‌دهند؛ پروژه شما هم جزو آن‌هاست؟ | متین عسکری