پین کردن اکشنهای گیتهاب به SHA توی ۳۵۰ ریپو
خلاصهٔ کاملتر
بعد از حمله معروف به tj-actions/changed-files در اوایل ۲۰۲۵ که توش مهاجمها تگهای ریلیز این اکشن گیتهاب رو به یه کامیت مخرب تغییر دادن، خیلی از تیمها فهمیدن رفرنس دادن به اکشنها با تگ (مثل @v44.1.0) بهجای SHA کامل چقدر خطرناکه. نویسنده که مهندس امنیت سمگرپه، تصمیم گرفت تنظیم «Require actions to be pinned to a full-length commit SHA» رو برای کل سازمان، یعنی حدود ۳۵۰ ریپازیتوری، فعال کنه.
برای روشن کردن این تنظیم بدون خراب کردن CI، باید سهجور رفرنس ناپین رو حذف میکرد: تگهای مستقیم (مثل actions/cache@v4)، برنچهای مستقیم (مثل @main)، و اکشنهایی که خودشون داخلشون یه اکشن دیگه رو بدون پین صدا میزنن (transitive). به گفته نویسنده، گیتهاب این تنظیم رو فقط بهصورت همهیاهیچ برای هر ریپو یا کل سازمان ارائه میده، بدون داشبورد یا حالت آزمایشی برای دیدن اینکه چی خراب میشه.
نویسنده اول با کمک Claude Code یه اسکریپت برای شناسایی وضعیت پینشدن هر ریپو نوشت، بعد اون رو با Semgrep Agentic Workflows بهصورت موازی روی همه ریپوها اجرا کرد. برای تگهای مستقیم از ابزار pinact استفاده کرد چون برخلاف Ratchet فرمتش با Renovate سازگاره. برای برنچهای مستقیم، مثل رفرنسهای داخلی سازمان، Renovate رو راه انداختن تا هم پین کنه هم بهروز نگه داره؛ Renovate برای اکشنهای خود سمگرپ بدون تأخیر و برای اکشنهای شخصثالث با هفت روز cooldown آپدیت میزنه.
در طول کار چندتا مشکل جانبی هم پیش اومد؛ مثلاً هماهنگ کردن Renovate با تأییدیههای اجباری و CODEOWNERS نیاز به تنظیمات اضافه داشت، و یه پروژه قدیمی مثل pre-commit/action که دیگه نگهداری نمیشد رو مجبور شدن خودشون بازسازی کنن. برای جلوگیری از بدتر شدن وضعیت، یه GitHub Action زمانبندیشده ساختن که هر ۱۵ دقیقه ریپوهای جدید رو پیدا میکنه و پین اجباری رو براشون فعال میکنه، و یه اسکریپت مانیتورینگ هم اجرای اکشنها رو برای خطاهای مربوط به پیننشدن چک میکرد.
در نهایت بعد از حدود ۸۰ پولریکوئست در چند روز و چند هفته پیگیری برنچها و موارد transitive، نویسنده تنظیم پین اجباری رو برای کل سازمان فعال کرد و توی راهنمای پایانی مقاله، ده قدم پیشنهادی برای تیمهای دیگه که میخوان همین کار رو انجام بدن رو لیست کرده؛ از اطلاعرسانی به تیمها گرفته تا استفاده تدریجی از خودکارسازی.
نکات کلیدی:
- انگیزه اصلی، حمله زنجیره تأمین به tj-actions/changed-files در ۲۰۲۵ بود
- تنظیم گیتهاب برای پین اجباری SHA فقط حالت همهیاهیچه، بدون استثنا یا حالت آزمایشی
- سه نوع رفرنس ناپین وجود داره: تگ مستقیم، برنچ مستقیم، و اکشنهای transitive
- از ابزار pinact برای پین تگها و از Renovate برای بهروزرسانی خودکار SHAها استفاده شد
- حدود ۸۰ پولریکوئست در ۳۵۰ ریپازیتوری باز شد تا تنظیم برای کل سازمان فعال بشه




