حادثة · اختراق إجراء GitHub

اختراق tj-actions/changed-files: ما فعله ولماذا دور Kilobat محدود

في 14 و15 مارس 2025، أخرج إجراء GitHub مستخدم في أكثر من 23,000 مستودع أسرار كل سير عمل شغّله إلى سجل سير العمل نفسه. حدث ذلك كله على مشغّلات CI، لا أجهزة Mac للمطورين؛ لذا تتناول هذه الصفحة في معظمها ما يجب فحصه في مستودعاتك، وتوضح بصراحة مدى محدودية ما كان Kilobat سيراه.

التاريخ: 14–15 مارس 2025تاريخ التحقق من المصادر: 1 نوفمبر 2026

باختصار

  • الحماية: لم يكن ليساعد

    وقع الهجوم على مشغّلات GitHub. وجاء تنزيله الوحيد من gist.githubusercontent.com، ولم يُرسل شيء إلى خادم خارجي أصلًا.

  • حارس الوكلاء: لم يكن ليساعد

    لم يشارك أي وكيل، وخرجت الأسرار عبر مخرجات السجل، لا عبر اتصال.

  • سجل شبكة الوكلاء: لم يكن ليساعد

    تعمل مهام سير العمل المشغّلة بواسطة act داخل Docker، الذي لا يستطيع Kilobat نسبة حركة بياناته إلى وكيل.

  • حركة بيانات التطبيقات: محدودة

    فقط على Mac يشغّل سير العمل بنفسه كمشغّل ذاتي الاستضافة: كانت قائمة التطبيقات ستعرض اتصالات المشغّل، بما فيها تنزيل gist. ولم يكن شيء سيُحظر.

ما حدث

يقول تنبيه GitHub بشأن CVE-2025-30066 إن المهاجم غيّر معظم وسوم الإصدارات الحالية للإجراء، بدءًا من v1.0.0، لتشير إلى إيداع خبيث واحد، 0e58ed8. حصل كل سير عمل يستخدم الإجراء بواسطة وسم على تلك الشفرة عند تشغيله التالي. نزّل برنامج Python من GitHub gist وشغّله باستخدام sudo؛ فعثر البرنامج على عملية Runner.Worker الخاصة بـ GitHub، وقرأ ذاكرتها، واستخرج القيم المعلّمة كأسرار وطبعها في السجل بعد ترميزها بـ base64 مرتين. لم تتأثر مهام سير العمل المثبتة على بصمة إيداع كاملة.

في المستودع العام، تكون سجلات سير العمل عامة، لذا استطاع أي شخص قراءة الأسرار. عثرت Wiz على عشرات المستودعات ذات الأسرار المكشوفة؛ وكان الخطر على المستودعات الخاصة أقل بكثير. رصدت StepSecurity الأمر لأن مراقبة المشغّل نبّهت إلى استدعاء غير متوقع لـ gist.githubusercontent.com.

قال القائمون على tj-actions إن رمز وصول شخصيًا لحساب الروبوت الخاص بهم قد اختُرق. تتبعت Unit 42 السلسلة إلى ما قبل ذلك: سرّب سير عمل دُفع إلى مستودع SpotBugs رمز أحد القائمين عليه، وكان لديه حق الكتابة إلى reviewdog/action-setup؛ فاختُرق ذلك الإجراء بدوره (CVE-2025-30154)، وسرّب سير عمل لـ tj-actions يستخدمه رمز الروبوت. ووجدت Unit 42 أن الهدف الأول كان مشروعًا مفتوح المصدر لـ Coinbase، لم ينجح المهاجم في استخدام أسراره.

التسلسل الزمني

  1. نوفمبر 2024

    تؤرخ Unit 42 أولى خطوات المهاجم إلى هذا الشهر.

  2. 11 مارس 2025

    سرّب سير عمل دُفع إلى SpotBugs رمز أحد القائمين عليه؛ واختُرق reviewdog/action-setup@v1 بين 18:42 و20:31 بالتوقيت العالمي UTC (Unit 42 وCISA).

  3. 14 مارس، نحو 16:00 UTC

    أشارت وسوم الإجراء إلى الإيداع الخبيث؛ واكتشفت StepSecurity الأمر وأكدت تأثر معظم الإصدارات خلال ساعة.

  4. 15 مارس 2025

    حُذف gist؛ وأزالت GitHub الإجراء ثم أعادته بعد تنظيفه (14:00 و22:00 UTC وفق التسلسل الزمني لـ StepSecurity). الإصدار 46.0.1 هو الإصلاح.

  5. 18 مارس 2025

    وجدت StepSecurity أن عدة إجراءات reviewdog أخرى مخترقة أيضًا؛ ونشرت CISA تنبيهها.

  6. 26 مارس 2025

    أدرج تنبيه CISA ثغرتَي CVE في كتالوج الثغرات المعروفة الاستغلال.

  7. 2 أبريل 2025

    نشرت Unit 42 تفاصيل خطوتَي SpotBugs وCoinbase اللتين أدتا إلى الاختراق.

كيف بدا على الشبكة

حدث كل شيء على مشغّلات CI. أرسلت الخطوة الخبيثة طلبًا صادرًا واحدًا إلى gist.githubusercontent.com للحصول على memdump.py؛ وكان الباقي محليًا على المشغّل. لم تذهب الأسرار قط إلى خادم المهاجم: بل كُتبت في السجل، وقدّمت GitHub ذلك السجل لمن اطلع عليه.

يعثر البرنامج المنشور على عملية المشغّل عبر نظام ملفات /proc في Linux، وتصف المصادر تأثيره على مشغّلات Linux. وبعد ذلك أمكن استخدام الرموز المسروقة من أي مكان ضد GitHub والخدمات الأخرى المرتبطة بها.

المؤشرات

كما توثقها المصادر. النطاقات نصوص وليست روابط، وقد عُطلت صيغتها ([.]) حيث فعل المصدر ذلك. معظم هذه البنية اختفى منذ زمن: تساعد المؤشرات في فحص السجلات والملفات والحسابات القديمة، لا حظر حملات اليوم.

المؤشرالنوعأين يظهرملاحظة
0e58ed8671d6b60d0890c21b07f8835ace038e67الإيداعtj-actions/changed-filesالإيداع الذي أشارت إليه الوسوم المُعدّلة.
gist.githubusercontent.com/nikitastupin/30e525b776c409e03c2d6f328f254965/raw/memdump.pyعنوان URLمشغّل CIبرنامج استخراج الذاكرة. حُذف في 15 مارس 2025.
A double-base64 string in the changed-files step’s logمخرجات السجلسجلات سير العملتظهر إذا شُغّلت الحمولة. وبعد فك ترميزها تحتوي على أسرار التشغيل.
reviewdog/action-setup@v1, 11 March 2025, 18:42–20:31 UTCالإجراء والفترة الزمنيةمهام سير العملCVE-2025-30154؛ أثّر أيضًا في إجراءات reviewdog أخرى تستخدمه.
tj-actions/changed-files, 12 March 00:00 to 15 March 12:00 UTCالإجراء والفترة الزمنيةمهام سير العملالفترة التي تطلب CISA تدقيقها.

ما كان Kilobat سيعرضه أو يحظره

  • حركة التطبيقات. إذا كان Mac مشغّلًا ذاتي الاستضافة وشغّل الإجراء، لعرضت قائمة تطبيقات Kilobat عمليات المشغّل وهي تتصل بـ gist.githubusercontent.com. لا يظهر هذا المضيف في أي قائمة تهديدات، ولا ينبغي أن يظهر: فملفات gist تُستخدم لأغراض مشروعة باستمرار.
  • سجل شبكة الوكيل. تشغيل سير عمل على Mac باستخدام act، حتى من وكيل ذكاء اصطناعي، يضع الخطوات داخل حاويات Docker. وتخرج اتصالاتها عبر عملية Docker نفسها، التي لا يستطيع Kilobat نسبتها إلى الوكيل، لذا لم يكن سجل شبكة الوكيل ليعرضها.
  • الحماية. لم يكن لدى الحماية ما تتعامل معه. وإذا استُخدم رمز من سجل مسرّب ضدك لاحقًا، فقد حدث ذلك من أجهزة المهاجم ضد GitHub.

أين لم يكن Kilobat ليساعد

  • حدث الاختراق واستخراج الأسرار وتسريبها كلها في GitHub Actions. لا تستطيع أداة على Mac رؤية مشغّل شخص آخر.
  • خرجت الأسرار عبر مخرجات السجل التي قدّمتها GitHub بصورة طبيعية، لا عبر اتصال يمكن حظره.
  • جُلب البرنامج النصي من gist تستضيفه GitHub، وهو مضيف يتعين على أي مرشح شبكة السماح به.
  • لا يستطيع عرض العمليات في Kilobat رؤية ما داخل حاويات Docker والأجهزة الافتراضية على Mac.

تحقق من Mac الآن

  1. اعرض مهام سير العمل في مستودع تستخدم الإجراءات المتأثرة.

    grep -rnE "tj-actions/changed-files|tj-actions/eslint-changed-files|reviewdog/action-" .github/workflows
  2. أو ابحث في جميع مستودعاتك على GitHub دفعة واحدة.

    gh search code "tj-actions/changed-files" --owner YOUR-ACCOUNT-OR-ORG
  3. بالنسبة للتشغيلات بين 12 و15 مارس 2025، افتح سجل خطوة changed-files وابحث عن سلسلة طويلة تُفك مرتين. إن وجدتها، فكل سر استطاع سير العمل قراءته مكشوف.

    echo 'PASTE-THE-STRING' | base64 -d | base64 -d
  4. غيّر تلك الأسرار، ثم نزّل السجلات المتأثرة للاحتفاظ بها واحذف التشغيلات حتى تتوقف إمكانية قراءة الأسرار.

  5. ابحث عن الإجراءات المثبتة بوسم بدلًا من إيداع. ثبّتها على بصمة إيداع كاملة كما توصي GitHub.

    grep -rnE "uses: *[^ ]+@(v[0-9][^ ]*|main|master) *$" .github/workflows
  6. إذا كان رمز تستخدمه على Mac مخزنًا كسر للمستودع، فألغِه من Settings ‹ Developer settings ‹ Personal access tokens، وتحقق من الحساب المسجّل في GitHub CLI.

    gh auth status

المصادر

تم التحقق في 1 نوفمبر 2026.

اعرف ما تتصل به وكلاؤك وتطبيقاتك

Kilobat تطبيق لشريط قوائم Mac يحدد التطبيق والعملية والوكيل وراء كل اتصال، ويبعدها عن المضيفين المعروفين بسوئهم، ويسجل الوجهات التي بلغتها كل جلسة وكيل.

تنزيل لـ Mac ↓
brew install seifip/kilobat/kilobat