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

لاگ‌های CI؛ نقشه‌های مخفی زیرساخت شما برای مهاجمان

·۱۷ شهریور ۱۴۰۵۹ دقیقه مطالعه۱ بازدید
راهنما
نقشه کف ساختمان از دامپ کرش: تحلیل ساختار حافظه در هنگام خطای سیستم
نقشه کف ساختمان از دامپ کرش: تحلیل ساختار حافظه در هنگام خطای سیستم
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

معرفی یک متدولوژی «دروازه پیش‌پرواز» (Preflight Gate) برای پاک‌سازی محلی لاگ‌های CI پیش از ارسال به مدل‌های زاینده، به‌جای تکیه بر فیلترهای داخلی مدل.

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

مدل‌های کدنویسی از راه دور تنها به بخش شکست‌خورده (Failing Assertion)، کد منبع مرتبط و زمینه‌ی کافی برای پیشنهاد اصلاح نیاز دارند؛ هر چیز دیگری در یک لاگ معمولی CI، صرفاً فهرست موجودی دارایی‌های شماست؛ از مسیرهای فایل و نام میزبان‌ها گرفته تا توکن‌ها، شناسه‌های کانتینری و داده‌های تست (Fixtures) که شباهت زیادی به داده‌های واقعی مشتریان دارند.

اگر کل لاگ را کپی کنید، پیش از آنکه مدل پاسخی دهد، طرح کلی سیم‌کشی ساختمانتان را فاش کرده‌اید. این موضوع ربطی به مهارت در مهندسی پرامپت (Prompt Engineering) — که هنر سؤال درست پرسیدن است، مثل کسی که می‌داند چطور از یک مشاور باتجربه بهترین جواب را بگیرد — یا آموزش‌های تکراری درباره‌ی gitignore ندارد؛ بلکه بحث بر سر نگه داشتن توپولوژی شبکه در سمت خودتان است. فرقی نمی‌کند مدل در یک تب مرورگر اجرا شود یا روی ماشینی در آن سوی کره زمین. یک مشاور می‌تواند بدون اینکه دسته‌ی کلیدهای اصلی ساختمان را با خود به خانه ببرد، در تعمیر یک درِ گیرکرده به شما کمک کند.

همان‌طور که در تحلیل‌های قبلی ما درباره‌ی امنیت مدل‌های بازمتن اشاره کردیم، مرز اعتماد در لحظه‌ی خروج داده از محیط محلی تعریف می‌شود.

کالبدشکافی یک نشت داده

فرض کنید برای رفع یک خطای متناوب در تست پرداخت، کل لاگ را کپی کرده‌اید چون استخراج دستی بخش‌های کوچک زمان‌بر بود. طبق گزارش‌های امنیتی، این لاگ در ظاهر یک خطا است، اما اگر با دقت بخوانید، شبیه به تور guided در دفتر کار شماست. برچسب‌های Runner، شناسه‌های Image، نام پروژه‌های Compose و ایمیل‌های تست در بخش Assertion همگی در یک جریان متنی قرار دارند. یک مدل لزوماً نباید بدخواه باشد تا این جزئیات را در تاریخچه‌ای که دیگر نمی‌توانید پاک کنید، به خاطر بسپارد.

به یک نمونه واقعی از آثار شکست (Failure Artifact) نگاه کنید. شما برای بررسی خطای tax.py آمده‌اید و تنها یک جمله است که باگ را توصیف می‌کند، اما لاگ حاوی متادیتای ارزشمندی است:

  • توپولوژی شبکه: نام‌های Runner مثل gha-prod-euc1-17 به منطقه و اندازه استخر اشاره دارند و بلوک‌های CIDR مثل 10.8.4.0/24 شبکه خصوصی شما را ترسیم می‌کنند.
  • کلیدهای دسترسی: رشته‌های اتصال به پایگاه‌داده (مثلاً postgres://checkout_ci:[email protected]:5432/orders) در واقع کلیدهای ورود به اتاق‌ها هستند. تیم‌ها بیش از آنچه اعتراف کنند، از رمزهای عبور CI در جاهای دیگر استفاده می‌کنند.
  • شناسه‌های زیرساختی: شناسه‌های Image (مثلاً ghcr.io/acme-internal/checkout-ci@sha256:9f3c0000...) مانند برچسب روی یک کمد قفل‌شده‌اند.
  • توکن‌های شناسایی: توکن‌های JWT برای دیباگ (مثلاً eyJhbGciOiJIUzI1Ni...) شبیه به کارت‌های تردد بازدیدکنندگان عمل می‌کنند.
  • داده‌های کاربر: ایمیل‌های تست مثل Ana Gomez <[email protected]> داده‌های واقعی تولید نیستند، اما «شبیه به تولید» هستند و شناسایی‌های خاموش معمولاً از همین‌جا شروع می‌شود.
  • مسیرهای سیستم: فریم‌های پشته (Stack Frames) مثل /home/runner/work/orders/orders/src/checkout/tax.py:88 دقیقاً مثل شماره اتاق روی دری هستند که شما نمی‌خواستید عکسش را بگیرید.

مدل تهدید در یک نگاه

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

مرز اعتماد دقیقاً لحظه‌ای است که بایت‌ها ماشینِ نگهدارنده‌ی لاگ را ترک می‌کنند. پاک‌سازی محلی، خلاصه‌سازی محلی و استخراج محلی تست‌های شکست‌خورده همگی باید قبل از این مرز رخ دهند. پس از عبور از این مرز، فرض کنید تاریخچه کپی، ایندکس و برای مدتی طولانی‌تر از آنچه رابط کاربری چت نشان می‌دهد، ذخیره شده است. استنتاج (Inference) — لحظه‌ای که مدل واقعاً جواب تولید می‌کند، مثل خودِ آشپزی و نه دوره‌ی آموزش آشپز — از راه دور را به مثابه افشای اطلاعات ببینید و کوچک‌ترین گزاره‌ی صادق درباره‌ی خطا را ارسال کنید.

عامل‌های (Agent) دارای قابلیت فراخوانی ابزار، این مرز را نامرئی‌تر می‌کنند. چون مدل می‌تواند لاگ را به‌عنوان نتیجه‌ی یک ابزار درخواست کند، شما فکر می‌کنید فقط یک سؤال پرسیده‌اید، اما عامل تصمیم می‌گیرد برای کمک بیشتر، کل فایل ci.log را پیوست کند. اگر به دستیار اجازه دهید درخت کاری (Working Tree) را بخواند، کانال ابزار دقیقاً همان افشای اطلاعات است که در کپی-پیست رخ می‌داد. نقشه ساختمان در هر دو راهرو سفر می‌کند و هیچ‌کدام از این راهروها بایت‌ها را به شما برنمی‌گردانند.

پیاده‌سازی دروازه‌ی پیش‌پرواز

عبارات منظم (Regex) نمی‌توانند جلوی یک نشت عمدی را بگیرند، اما تجهیزاتی را که به دلیل تکرار زیاد دیگر نمی‌بینید، شکار می‌کنند. برای توقف این نشت، توسعه‌دهندگان باید پیش از خروج هر بایتی از ماشین، یک اسکن اکتشافی محلی اجرا کنند.

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

  • قوانین سخت (پرخطر):
    • آدرس‌های IPv4 خصوصی (10.x, 192.168.x, 172.16-31.x).
    • URLهای اتصال برای postgres, mysql, mongodb, redis و amqp.
    • بلاک‌های PEM (مثلاً -----BEGIN [A-Z ]*PRIVATE KEY-----).
    • توکن‌های JWT و توکن‌های دسترسی شخصی گیت‌هاب (PATs) که با ghp_ یا github_pat_ شروع می‌شوند.
    • کلیدهای دسترسی AWS که با AKIA شروع می‌شوند.
    • کلیدهای شبیه Stripe (مانند sk_, rk_, یا pk_ که بعد از آن‌ها live یا test می‌آید).
    • توکن‌های Bearer و مسیرهای دایرکتوری Home (مانند /home/ یا /Users/).
    • آدرس‌های ایمیل.
  • قوانین نرم (ریسک زمینه‌ای):
    • برچسب‌های Runner یا کلاستر (مثل gha-prod, eks-, arn:aws:eks, cluster.local).
    • نام‌های میزبان داخلی با پسوند .internal.
    • شناسه‌های Image با الگوی sha256: و دنباله ۶۴ کاراکتر هگزادسیمال.

اگر این اسکن روی یک لاگ نمونه اجرا شود و روی شبکه خصوصی یا URL پایگاه‌داده خطا دهد، شما در حال تماشای نقشه‌ی ساختمان خود هستید. درخواست از مدل برای «نادیده گرفتن اسرار» (Ignore Secrets)، اتاق‌هایی را که این اسرار نام برده‌اند، پاک نمی‌کند.

هنر افشای حداقلی

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

یک گزارش درست به این شکل است:

  • تست: مجموع مالیات خرید داخلی
  • انتظار: ۴۲۰۰ | واقعیت: ۰
  • واحد شکست: src/checkout/tax.py در نزدیکی خط ۸۸
  • منطق مرتبط: خطوط ۷۰-۹۵ (جست‌وجوی جدول نرخ) و ۱۳۰-۱۴۵ (گرد کردن)
  • محدودیت: «من نمی‌توانم محیط CI، نام‌های Runner یا شناسه‌های Image را به اشتراک بگذارم.»
  • سؤال: «کدام شاخه گرد کردن یا نرخ مفقود شده باعث مجموع صفر می‌شود؟»

دقت کنید چه چیزهایی حذف شدند: حساب‌ها، مناطق، رجیستری‌ها، نام‌های شبیه به انسان و هر URLی که نام یک میزبان را داشت. شما می‌توانید ۷۵ خط از کد tax.py را بفرستید اگر تابع مستقل باشد، اما هرگز نباید docker-compose.ci.yml را پیوست کنید، چون فایل‌های compose نقشه‌هایی هستند که پورت‌ها با جوهر روی آن‌ها رسم شده است.

تکنیک‌های استخراج محلی

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

  • استخراج Assertionها: از دستور rg -n -C 3 "AssertionError|Error:|FAIL:" sample.ci.log | head -n 40 استفاده کنید تا Assertion و فریم‌های نزدیک آن حفظ شوند.
  • فیلتر بر اساس مسیر: از rg -n "work/orders/orders/src" sample.ci.log برای یافتن فریم‌های داخل کد خودتان به‌جای Image مربوط به Runner استفاده کنید.
  • پاک‌سازی داده‌های تست: از sed برای جایگزینی ایمیل‌ها با [email protected] یا URLهای دیتابیس با postgres://redacted استفاده کنید.

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

محدودیت‌های روش‌های اکتشافی

اسکن پیش‌پرواز یک چراغ‌قوه است، نه یک قفل. نشت‌های پیچیده از این عبارات منظم عبور می‌کنند. مواردی مثل اسراری که در چندین خط پخش شده‌اند، داده‌های Base64 داخل JSON، نام‌های هدر سفارشی یا توکن‌های خاص فروشندگان خارج از الگوهای شناخته شده، احتمالاً شناسایی نمی‌شوند. همچنین اسکرین‌شات‌های لاگ یا کاراکترهای یونیکد مشابه در URLها و JWTهای ناقص نیز از این فیلترها می‌گذرند.

اگر مدل تهدید شما شامل یک فرد داخلی در شرکت ارائه‌دهنده استنتاج است، هرگز کد مخزن را به آنجا نفرستید. همچنین وقتی باگ فقط با یک Dump تولید یا خروجی مشتری بازتولید می‌شود، از این گردش‌کار استفاده نکنید. کپچرهای شبکه (Packet Captures) و استخراجات انبار داده متعلق به کانال‌های حادثه (Incident Channel) با قوانین نگهداری سخت‌گیرانه هستند، نه دستیارهای کدنویسی. در مواردی که لایسنس، قرارداد یا مقررات، کد منبع را حتی پس از پاک‌سازی «محدود» تلقی می‌کنند، از مدل‌های راه دور صرف‌نظر کنید.

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

نقش دستیارهای راه دور

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

شما می‌توانید از این مسیر برای ارسال Assertionهای پاک‌سازی‌شده و تکه‌های کد محلی استفاده کنید و لاگ‌های خام Runner را روی ماشین خود نگه دارید. رایگان بودن یک پرش راه دور، دلیلی برای پایین آوردن مرزهای امنیتی نیست. راحتی، همان مسیری است که نقشه‌های ساختمان از آن سفر می‌کنند؛ بنابراین هر بار که بایت‌ها می‌خواهند ماشین را ترک کنند، دروازه اسکن را اجرا کنید.

اگر دستیار نتوانست از روی Assertion و ۷۵ خط کد tax.py یک اصلاحیه پیشنهاد دهد، احتمالاً به یک تست نیاز دارید. یک تست واحد (Unit Test) بنویسید که هیچ نامی شبیه به مشتری در آن نباشد و آن را به‌جای فهرست موجودی زیرساختتان ارسال کنید. این تغییر، سرعت دیباگ را از مرحله آپلود به مرحله استخراج منتقل می‌کند. هدف این است که «نشانه» را پست کنید، نه «سیستم» را. برای مدیریت بهینه این فرآیند در محیط‌های توسعه، می‌توانید از پروتکل سه-مرحله‌ای MonkeyCode برای توقف باگ‌های پنهان استفاده کنید تا کیفیت کد تولید شده توسط AI تضمین شود.

گام بعدی شما

  • اسکریپت crash_preflight.py را برای شناسایی IPv4های خصوصی و توکن‌های JWT در لاگ‌های خود پیاده‌سازی کنید.
  • عادت کنید به‌جای آپلود کل فایل .log یا .txt در ChatGPT یا Claude، تنها بخش AssertionError و ۱۰ خط قبل و بعد از آن را استخراج کنید.
  • در فایل‌های docker-compose یا K8s manifest خود، متغیرهای محیطی را با مقادیر Dummy جایگزین کنید پیش از آنکه برای تحلیل به AI بفرستید.

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

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

این موضوع بر اساس تجربه عملی در امنیت زنجیره تأمین نرم‌افزار، ریسک نشت توپولوژی شبکه را به شدت افزایش می‌دهد. اعتماد به مدل‌های راه دور بدون لایه پاک‌سازی محلی، در واقع اعطای نقشه‌ی دسترسی به زیرساخت‌های حساس است.

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

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

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

بسیاری از تیم‌های مهندسی به اشتباه تصور می‌کنند که چون داده‌های CI آن‌ها «تولیدی» (Production) نیستند، ارسال آن‌ها به مدل‌های ابری بی‌خطر است. اما در واقع، ساختار زیرساخت (Infrastructure as Code) خود یک دارایی امنیتی است و افشای آن، نیمی از راه نفوذ به شبکه را برای مهاجم هموار می‌کند. تغییر پارادایم از «خلاصه‌سازی توسط AI» به «خلاصه‌سازی محلی پیش از ارسال»، تنها راه نجات در عصر مدل‌های استدلالی است که هر تکه داده را برای بازسازی گراف سیستم به کار می‌گیرند.

منابع

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

گفتگو

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

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

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

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

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

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

دات‌هوش

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

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