ممیزی CI/CD گیتلب: زنجیرهی حمله به پایپلاینها
خلاصهٔ کاملتر
نویسنده تو این مقاله که قسمت دوم یه سریـه، میگه تو قسمت اول سراغ رازهای لو رفته (مثل کلیدهای API و رمزهای هاردکدشده) تو سورسکد گیتلب رفته بود، ولی این بار تمرکز روی خود فایل .gitlab-ci.ymlـه. به گفتهی نویسنده این فایل نقشهی کل فرایند build، تست و دیپلویه و اگه بد پیکربندی شده باشه، مهاجم اصلاً به رازهای داخل کد هم نیاز نداره؛ میتونه دستور تزریق کنه، runnerها رو هایجک کنه، دسترسی موندگار بسازه و متغیرهای CI رو بیرون بکشه.
ابزاری که برای این کار ساخته GoGatoZ نام داره؛ یه پورت Go از ابزار Gato-X (که سراغ GitHub Actions میره) که برای CI/CD گیتلب تطبیق داده شده. این ابزار پنج حالت کاری داره: جستوجوی پروژهها از طریق API، Enumerate برای اسکن کانفیگها با باز کردن بازگشتی includeها، Parse برای پردازش محلی خروجی، Attack برای بهرهبرداری از misconfigها، و Pivot که همهچیزو تو یه حلقهی جستوجوی سطحاول (BFS) به هم زنجیر میکنه. نویسنده میگه برای این ممیزی فقط از حالتهای بیخطر استفاده کرده و حالت Attack رو تو غلاف نگه داشته.
یه نکتهی جالب اینه که GoGatoZ یه سرور Model Context Protocol (MCP) هم داره، یعنی میشه مستقیم وصلش کرد به دستیار هوش مصنوعی کدنویسی تا جستوجو، Enumerate آسیبپذیریها و ذخیرهی نتیجه تو یه دیتابیس SQLite رو با زبون طبیعی انجام بده. نویسنده میگه تو این تحقیق حسابی از همین سرور MCP استفاده کرده و کل فرایند بیشتر شبیه گفتوگو با اسکنر بوده تا اجرای دستیش. (بهطور طنزآمیز هم اشاره میکنه که از حدود مارس ۲۰۲۶ مدل Claude Opus 4.8 دیگه زیاد با این پروژه راه نمیاد و ممکنه از هدایت سرور MCP خودداری کنه.)
اسکن تو سه فاز انجام شده: اول یه جاروی فراگیر با ۲۰ کلیدواژهی عمومی دواپس، بعد یه اسکن هدفمند روی پروژههای مرتبط با شرکتهای Fortune 500، و آخر یه اسکن صنعتمحور روی شرکتهای حقوقی، مالی و لجستیک. روی هم ۳٬۷۵۷ پروژهی عمومی بررسی شدن و ۷٬۳۳۱ یافتهی امنیتی پیدا شده که ۱٬۵۸۰ تاش شدت HIGH داشتن. نکتهی تکرارشونده این بود که نزدیک دو سوم پروژههایی که پایپلاین CI/CD داشتن، حداقل یه ایراد داشتن.
بخش مهمی از کار، تحلیل false positive بوده. نویسنده میگه اگه آدم نتایج خام یه اسکن بزرگ رو همینجوری گزارش کنه، حسابی به دردسر میافته چون بخش زیادیش نویزه. تو فاز سوم با یه تحلیل سیستماتیک معلوم شد ۴۱٪ پروژههای دارای یافته، کلاً نویز بودن: ریپوهای اسپم سئو، خوشههای فورک با یافتههای تکراری، ریپوهای دمو و تمرین دانشجویی، و تشخیصهای اشتباه اسکنر. مثلاً متغیر SECRET_DETECTION_ENABLED=true که در واقع یه پرچم فعالسازی اسکن رازه نه یه راز واقعی، اشتباهی بهعنوان راز فلگ میشد.
جالب اینجاست که نویسنده این تحلیل false positive رو هم به یه Claude Code skill قابلاستفادهی مجدد تبدیل کرده؛ یه دستورالعمل ساختاریافته که به دستیار هوش مصنوعی یاد میده نتایج Enumerate رو با یه پایپلاین پنجمرحلهای فیلتر کنه و فیلترهای jq آماده هم همراهش داره. این skill تو فایل پروژهای ذخیره میشه و بین جلسهها باقی میمونه، پس هر اسکن بعدی از چیزی که قبلی یاد گرفته باهوشتر شروع میشه.
مهمترین یافتهها هم اینان: پایپلاینهای merge request از فورکها بدون محافظت (بزرگترین دسته با ۱٬۹۷۱ یافته) که اجازه میدن مهاجم با فورککردن یه پروژه و تغییر کانفیگ، کد خودشو تو پایپلاین هدف اجرا کنه؛ runnerهای داکر با حالت privileged (۲۵۹ پروژه) که میتونن از کانتینر به هاست فرار کنن؛ اجرای اسکریپتهای راه دور مستقیم تو پایپلاین که اگه آدرسشون دستکاری بشه کنترل پایپلاینو میده دست مهاجم؛ و تزریق متغیر، جایی که مقادیری مثل اسم برنچ بدون پاکسازی مستقیم تو اسکریپت شل قرار میگیرن و اجازه میدن کسی که اسم برنچ رو کنترل میکنه دستور دلخواه اجرا کنه. برای رفع، نویسنده پیشنهاد میده includeها و ایمیجها به SHA مشخص pin بشن، رازهای هاردکد حذف بشن، حالت privileged خاموش بمونه، و پایپلاینهای فورک محدود یا نیازمند تأیید بشن.
نکات کلیدی:
- نویسنده با ابزار Go خودش (GoGatoZ) سه اسکن بزرگ روی gitlab.com زده و ۳٬۷۵۷ پروژهی عمومی رو بررسی کرده
- نزدیک دو سوم پروژههایی که پایپلاین CI/CD داشتن حداقل یه misconfiguration امنیتی داشتن
- بزرگترین دسته، پایپلاینهای merge request از فورکهای بدون محافظت بود که میتونن متغیرهای محرمانه رو لو بدن
- runnerهای privileged، اجرای اسکریپت راه دور و تزریق متغیر از طریق ورودیهای کنترلپذیر، بقیهی ریسکهای بزرگن
- حدود ۴۱٪ یافتههای اسکن کلیدواژهای نویز بودن (اسپم سئو، فورک، دمو)، پس تحلیل false positive برای رسیدن به نتیجهی واقعی حیاتیه
- راهحلها: pin کردن includeها و ایمیجها به SHA، حذف رازهای هاردکد، خاموشکردن حالت privileged و محدودکردن پایپلاین فورکها




