كل المقالات والفيديوهات

كيف تعرف إن كان سارق wfx قد اشتغل في مستودعك على GitHub

حسابات مسروقة دفعت سارق أسرار إلى آلاف المستودعات ثم حذفت السجلات. كيف تفحص مستودعك، وما تدوّره، وما تحصّنه.

Adil Ben Moussa
12 نوفمبر 2026· 4 دقائق
كيف تعرف إن كان سارق wfx قد اشتغل في مستودعك على GitHub

ربما دفع حساب GitHub لأحد زملائك سارق أسرار إلى مستودعك هذا الأسبوع، وشغّله مرة واحدة، ثم أزاله بعد دقائق. إذا اشتغل، فكل سر وكل دور سحابي يصل إليه سير العمل (workflows) عندك صار في يد شخص آخر، وسجل التشغيل الذي كان سيخبرك بذلك قد اختفى.

تحصي Security، التي كانت أول من أبلغ عن الحملة، 4,837 حساباً مخترقاً فتحت طلبات سحب () اختبارية في 61,764 مستودعاً، بدءاً من 10 نوفمبر. واشتغلت الحمولة () في 1,806 مستودعات منها على الأقل، بحسب إحصائها. ووجدت 8,093 مستودعاً تلقّت إيداعات () خبيثة بين 10 نوفمبر الساعة 12:46 بتوقيت و 12 نوفمبر الساعة 04:36 بتوقيت UTC، وكانت الحملة لا تزال نشطة حين أُجري ذلك البحث.

لماذا لم ترَ دفاعاتك المعتادة ذلك

هذا ليس طلب سحب من نسخة () يملكها غريب. الإيداعات منسوبة إلى مستخدمين حقيقيين في المستودع، ببريدهم ومن دون توقيع، وهذا يشير إلى مسروقة. في 1,343 مستودعاً لم يكن المؤلف هو المالك بل متعاوناً أو روبوتاً (). لذلك لا يكون للإعدادات التي تحمي من النسخ، مثل الموافقة على تشغيل سير العمل الآتي من مساهمين خارجيين، أي دور هنا. المهاجم يملك صلاحية الكتابة، مثل فريقك تماماً.

النمط قصير. أولاً طلب سحب بعنوان docs: dependency audit notes من فرع wfx-docs، لاختبار صلاحية الكتابة. ثم الحمولة، في واحد من ثلاثة أشكال: نحو 1,500 سطر تُضاف إلى سير عمل موجود (ci: refresh build cache)، أو سكربت مع خطاف (hook) postinstall في (chore: add ci helper)، أو ملف سير عمل جديد (chore: add dependency audit workflow). ثم تراجع ()، ويُحذف تشغيل سير العمل مع سجلاته. وأحصت SafeDep 7,309 مستودعات فيها سير العمل المحقون و 771 مستودعاً فيها خطاف npm، الذي يشتغل أيضاً على حاسوب المطور عند npm install.

نطاق ما يأخذه واسع: أسرار ومتغيراتها، و GITHUB_TOKEN، ورموز ، وملفات بيانات الدخول لـ و و و npm و و ، ومفاتيح أدوات الذكاء الاصطناعي. ثم يستعمل OIDC لطلب جلسات في AWS و GCP و Azure. واثنتان من حركاته مصمّمتان للبقاء بعد تدوير الأسرار. على AWS يمكنه إنشاء مفاتيح وصول جديدة وإعادة كتابة سياسة الثقة لدور ما إلى "Principal": {"AWS": "*"}. وعلى Azure يضيف بيانات اعتماد موحّدة () باسم wfx-ci-… إلى تسجيلات التطبيقات، بحيث يبقى المستودع قادراً على تسجيل الدخول بعد تغيير كل سر.

تدوير أسرارك ليس نهاية الأمر. افحص الأبواب التي تركها السارق مفتوحة في سحابتك.

ما تفعله في أول يوم عمل

ابدأ بالعلامات. يذكر التقريران كلاهما العلامات نفسها: فرع wfx-docs، وعنوان طلب السحب الاستكشافي، ورسائل الإيداع أعلاه، إضافة إلى ci: restore و ci: cleanup. التراجع لا يحذف الإيداعات من تاريخ المستودع، لذلك يظل البحث يعثر عليها:

gh search prs --owner your-org "docs: dependency audit notes" in:title
git log --all --since=2026-11-10 --oneline \
  --grep="ci: refresh build cache" --grep="chore: add ci helper" \
  --grep="chore: add dependency audit workflow" --grep="ci: cleanup"

ثم افتح تاريخ Actions لكل سير عمل لمسه المهاجم. غياب مُخرَج () باسم wfx-loot أو ملخص WFX-BEGIN لا يعني أنك في أمان. غياب رقم التشغيل على إيداع المهاجم هو العلامة الأوثق على أن الحمولة اشتغلت.

إذا وجدت أي شيء، فقائمة SafeDep هي التي سأتبعها. طلب سحب استكشافي وحده يعني أن الحساب مخترق. ألغِ رموز ذلك الحساب، وأذونات ، ومفاتيح SSH، وجلساته، وفعّل المصادقة الثنائية (). دوّر كل سر يستطيع المستودع قراءته، بما في ذلك أسرار البيئة () والمنظمة. وتعامل مع أي جهاز شغّل npm install على إيداع متأثر كجهاز مخترق.

ثم السحابة. في ، ابحث عن بيانات اعتماد موحّدة باسم wfx-ci-* لم تنشئها أنت. وفي ، ابحث عن جلسات باسم wfx-* يتبعها CreateAccessKey أو UpdateAssumeRolePolicy. وفي GCP، ابحث عن استدعاءات GenerateAccessToken و SignJwt من مجمّع هويات أعباء العمل () الخاص بـ GitHub عندك.

ما يساعد بعد ذلك

حين يجد فريقك وقتاً لذلك، سأقلّص ما تمنحه عبارة «أي شخص يملك صلاحية الكتابة» من حقوق. ضع أسرار النشر في بيئة (environment) على GitHub بدل المستودع. لا تستطيع المهمة () قراءة أسرار البيئة حتى يوافق عليها مراجع مطلوب، ويمكن حصر البيئة في فروع معينة. تحقق من خطة اشتراكك أولاً: في خطط و Pro و Team، لا يعمل المراجعون المطلوبون إلا في المستودعات العامة.

افعل الشيء نفسه في السحابة. يقارن المزوّد موضوع () رمز OIDC بالشروط المحددة على الدور، ويمكن أن يسمّي الموضوع بيئة المهمة، مثل repo:octo-org/octo-repo:environment:prod. والدور الذي لا يثق إلا بذلك الموضوع لا تصل إليه إلا المهام التي تجتاز قواعد تلك البيئة، لا سير عمل يُدفع إلى أي فرع.

وأخيراً، الفحوصات المطلوبة. تصف Aikido كوداً ينشر حالات نجاح مزيفة لتجاوز قواعد الدمج؛ ووجدته SafeDep معطّلاً في العينات التي قرأتها. في الحالتين، يستطيع أي شخص أو تكامل () يملك صلاحية الكتابة تعيين حالة. ويمكن لمجموعة قواعد () ألا تقبل الفحص المطلوب إلا من تطبيق محدد.

الحساب المسروق يبدو تماماً مثل زميلك. على نظام CI عندك أن يطلب أكثر من صلاحية الكتابة.

المصادر

  1. Aikido Security, 2026. wfx-loot campaign pushes CI secret stealer to tens of thousands of repositories (بالإنجليزية)
  2. SafeDep, 2026. wfx: GitHub Actions Credential Stealer Hits 8,000 Repos (بالإنجليزية)
  3. GitHub Docs. Deployments and environments (بالإنجليزية)
  4. GitHub Docs. OpenID Connect (بالإنجليزية)
  5. GitHub Docs. Available rules for rulesets (بالإنجليزية)
شارك هذا المقال