
تم الكشف مؤخرًا عن ثغرة أمنية خطيرة في Git تتيح شن هجمات RCE (تنفيذ التعليمات البرمجية عن بُعد)، وتؤثر على إصدارات متعددة من Git وMicrosoft Visual Studio 2017. تتيح هذه الثغرة للمهاجمين التلاعب بمستودعات Git باستخدام الوحدات الفرعية، مستغلين خطأً في Git يسمح بكتابة الملفات خارج شجرة عمل الوحدة الفرعية وإدخالها في الدليل .git/. ويتيح هذا الخطأ تنفيذ ربط خبيث أثناء استمرار عملية استنساخ المستودع [1].
تؤثر الثغرة الأمنية CVE-2024-32002 على الإصدار 15.9 من Microsoft Visual Studio 2017 وإصدارات Git الأقدم من 2.45.1 و2.44.1 و2.43.4 و2.42.2 و2.41.1 و2.40.2 و2.39.4. يمكن استغلالها في البيئات التي يتم فيها تمكين دعم الروابط الرمزية في أنظمة التشغيل غير الحساسة لحالة الأحرف.

فهم Git
Git هو نظام مجاني ومفتوح المصدر للتحكم في الإصدار الموزع، مصمم لمساعدة مطوري البرمجيات على إدارة قواعد التعليمات البرمجية بسرعة وكفاءة. وهو يعزز التعاون بين أعضاء فريق التطوير من خلال تنظيم وتتبع التغييرات التي تطرأ على الملفات والدلائل بطريقة موحدة ومنظمة.
يُستخدم Git على نطاق واسع في تطوير البرمجيات. منصات مثل GitHub و GitLab و Bitbucket مبنية على Git لتعزيز التعاون بين المطورين بسبب ميزاته القوية:
- تسجيل التغييرات التي يمكن تتبعها على ملفات التعليمات البرمجية، والمعروفة باسم الالتزامات.
- استرجاع تعديلات التعليمات البرمجية إلى الإصدارات السابقة عند الضرورة.
- الجمع بكفاءة بين التغييرات من فروع أو مساهمين مختلفين.
- الاحتفاظ بسجل لتاريخ من قام بالتغييرات وتواريخها.

خطافات Git Hooks
عند إنشاء مستودع Git أو نسخه، باستخدام الأمرين git init أو git clone، يتم إنشاء دليل .git في جذر شجرة العمل. وتبدو بنية دليل .git في البداية كما يلي:
خطافات Git هي عبارة عن نصوص برمجية قابلة للتنفيذ، موجودة إما في دليل .git/hooks أو دليل .git/modules/module_type/module_name/hooks. يتم تشغيل الخطافات تلقائيًا عند وقوع أحداث محددة داخل مستودع Git.
عندما لا يحتوي الملف الموجود في دليل الخطافات على لاحقة .sample، سيتم تنفيذ الأوامر الموجودة في هذا الملف قبل أو بعد إجراء Git معين مضمن في اسم الملف، مثل ما قبل الالتزام وما بعد الالتزام وما بعد الخروج.
وحدات Git الفرعية
وحدة Git الفرعية هي سجل داخل مستودع Git يشير إلى التزام معين في مستودع خارجي. عندما تتم إضافة وحدة فرعية إلى مستودع، يتم إنشاء ملف جديد في دليل .gitmodules مع بيانات تعريفية للتعيين بين عنوان URL الخاص بالوحدة الفرعية ودليلها المحلي. عندما يحتوي المستودع على وحدات فرعية متعددة، سيتضمن ملف .gitmodules إدخالًا لكل منها. [3]


الروابط الرمزية (الروابط الرمزية)
الارتباط الرمزي، الذي يشار إليه أيضًا باسم الارتباط الرمزي أو الارتباط المرن، هو ملف يشير إلى ملف أو دليل آخر (يشار إليه باسم "الهدف") من خلال تحديد مساره. إذا تم حذف الارتباط الرمزي يبقى هدفه غير متأثر. [4]
يتم إنشاء رابط Symlink في Git كملف مع بيانات وصفية لجعله يعمل كمرجع أو اختصار لملف آخر. يمكن استخدام الروابط الرمزية لإنشاء مراجع متعددة لملف ما دون تكرار محتواه.


تحليل الثغرات الأمنية في GIT
تحليل الرقعة
من أجل التوصل إلى فهم أعمق للثغرات الأمنية، غالبًا ما يقوم المتخصصون في مجال الأمن بتحليل التصحيحات. وهي تقنية تساعد في تحديد الوظائف المعرضة للخطر ومسارات الهجوم المحتملة. قام أعضاء فريق « OPSWAT » بفحص التغييرات التي أُجريت في الإصدار المُصَحَّح لمعالجة الثغرة الأمنية CVE-2024-32002، ووجدوا أنه تم تحديث ملفين لمعالجة هذه الثغرة.
أحد الملفات التي تم تحديثها هو ملف subodule--helper.c، والذي يتضمن الشيفرة التي تتعامل مع استنساخ وحدة Git الفرعية. تضمن الالتزام الجديد في النسخة المصححة الملفين التاليين:
- إضافة الدالة dir_contains_only_only_dotgit للتأكد من أن دليل الوحدات الفرعية لا يحتوي على أي ملفات أو أدلة .git.

- تم إجراء تغييرات على دالة clone_submodule() لتضمين شرط للتحقق مما إذا كان دليل الوحدة الفرعية موجودًا وفارغًا. إذا لم يكن الدليل فارغًا، فسيتم إجهاض عملية الاستنساخ.

أما التحديث الثاني في الالتزام الجديد فكان في ملف t/t7406-submodule-update.sh، حيث تم إضافة برنامج نصي اختباري للتحقق من حل الثغرة الأمنية.

من التحليل إلى الاستغلال
تحليل سير العمل للارتباطات Symlinks والوحدات الفرعية في Git
بالإضافة إلى الرؤى التي تم جمعها من تحليل الرقعة ووصف الثغرة الأمنية CVE-2024-32002، عمل زملاء OPSWAT على التحقيق في سير عمل الروابط الرمزية والوحدات الفرعية في Git. وقاموا بتحليل تسلسل الأحداث التي تحدث عندما يقوم المستخدم باستنساخ مستودع:
- يبدأ Git بتنزيل الملفات والدلائل من المستودع الأساسي.
- ويستخدم التعريفات المحددة في ملفات الروابط الرمزية لإعادة إنشاء ارتباطات رمزية مطابقة في نظام الملفات المحلي.
- إذا كان الارتباط الرمزي يشير إلى ملف موجود، فسيعمل الارتباط الرمزي؛ وإلا فسيظل الارتباط الرمزي معطلاً حتى تتم استعادة الهدف.
- إذا تم استنساخ المستودع باستخدام الخيار -- التكراري، يستنسخ Git الوحدات الفرعية (المستودعات الخارجية) ويضعها في مسارات الدليل كما هو موضح في ملف .gitmodules.
- إذا كان الارتباط الرمزي جزءًا من مسار الوحدة الفرعية (على سبيل المثال، util/module/test، حيث يكون symlink رابطًا رمزيًا يشير إلى دليل آخر، مثل symlink_folder)، فإن Git سيخزن محتوى الوحدة الفرعية في الدليل الفعلي المشار إليه بواسطة الرابط الرمزي (على سبيل المثال، symlink_folder/module/test)، مع السماح بالوصول من خلال مسار الرابط الرمزي الأصلي.

فهم الثغرة الأمنية في CVE-2024-32002 Git
إنشاء المستودعات الخبيثة
قام زملاء OPSWAT بمزيد من الفحص لإنشاء مستودعات خبيثة استنادًا إلى التحديثات التي تم إجراؤها لملفt/t7406-submodule-update.sh وقسموا هذه العملية إلى الخطوات التالية:
- إنشاء مستودع يحتوي على خطاف ما بعد الخروج

- إنشاء مستودع آخر يتضمن وحدة فرعية موجودة في المسار A/modules/x. تشير الوحدة الفرعية الجديدة إلى المستودع الذي تم إنشاؤه مسبقًا.

- إنشاء رابط رمزي باسم a، يشير إلى مجلد .git في فهرس Git.


فهم الخلل الأمني
عندما يستنسخ المستخدم مستودعًا خبيثًا، تم إنشاؤه في الخطوة السابقة، باستخدام الخيار -- التكراري، سيتم تشغيل البرنامج النصي الخبيث من خطاف ما بعد الخروج، مما يسمح للمهاجم باختراق جهاز المستخدم.
يحدث تنفيذ التعليمات البرمجية عن بعد لأن المستودع الرئيسي يكتشف ارتباطًا رمزيًا باسم a يشير إلى دليل .git عند استنساخه. مع تمكين الوضع العودي، يتم أيضًا سحب الوحدات الفرعية إلى المستودع المستنسخ. يحتوي هذا المستودع على مجلد الخطافات، والذي يحتوي على البرنامج النصي لخطاف ما بعد الخروج، ودليله المحلي في A/modules/x.
نظرًا لأن الحرف «a» يشير إلى الدليل.git ونظام الملفات لا يميز بين الأحرف الكبيرة والصغيرة، يُفسَّر الحرف «A» على أنه مكافئ للحرف «a». مما يؤدي إلى تضليل Git ليقوم بكتابة البرنامج النصي لخطاف ما بعد السحب (post-checkout hook) في الدليل .git/modules/query/fast/hooks/. إذا تم العثور على برنامج نصي لخطاف ما بعد السحب (post-checkout hook) في المجلد .git/modules/{module_type}/{module_name}/hooks، فسيتم تشغيله عند استنساخ المستودع الرئيسي باستخدام الخيار --recursive. ونتيجة لذلك، يمكن للمهاجمين اختراق جهاز المستخدم بنجاح عن طريق تنفيذ تعليمات برمجية عن بُعد.

محاكاة استغلال ثغرة أمنية في Git
بناءً على النتائج السابقة، قام زملاء OPSWAT بإنشاء مستودع رئيسي وخطاف لمحاكاة إنشاء مستودع خبيث:
- في البداية، يُوصى بتهيئة Git بحيث يسمح دائمًا بـ protocol.file، وتمكين core.symlinks، وتعيين اسم الفرع الافتراضي إلى main (لتجنب ظهور رسالة تحذير).

- تتم إضافة نص برمجي خطاف ما بعد الخروج الخبيث إلى دليل الخطافات. للتأكد من إمكانية تنفيذ البرنامج النصي لما بعد الخروج على جهاز المستخدم، يتضمن البرنامج النصي للباش الذي ينشئ هذا الخطاف الأمر chmod +x fast/hooks/post-checkout.

- يتم إنشاء رابط رمزي في المستودع الرئيسي يشير إلى دليل .git.




الاصلاح
لتحييد هذا التهديد، يمكن للمستخدمين إلغاء تثبيت Git أو تثبيت أحدث تصحيح أمني. وبدلاً من ذلك، يمكن لحل مثل MetaDefender Endpoint إخطار المستخدم على الفور وعرض جميع الثغرات الأمنية المعروفة (CVE) داخل البيئة من خلال واجهته سهلة الاستخدام. كما يمكن لـ MetaDefender Endpoint اكتشاف أحدث الثغرات الأمنية (CVE) والتخفيف من آثارها من خلال الاستفادة من قدراته التي تشمل أكثر من 3 ملايين نقطة بيانات وأكثر من 30,000 ثغرة أمنية مرتبطة بها مع معلومات حول درجة خطورتها. ومن خلال تنفيذ أي من هذين الإجراءين، سيتم احتواء الثغرة الأمنية (CVE) بشكل كامل، مما يقضي على خطر وقوع هجوم إلكتروني مدمر.
هل أنت مستعد لوضع MetaDefender Endpoint في الخطوط الأمامية لاستراتيجية الأمن السيبراني لديك؟
مراجع
(1) https://nvd.nist.gov/vuln/detail/CVE-2024-32002
(3) https://www.atlassian.com/git/
(5) https://www.vicarius.io/vsociety/posts/exploiting-git-rce-cve-2024-32002
