
CVE-2025-53652: تحليل Git Parameter في Jenkins
تنشأ هذه الثغرة لأن المدخلات التي يتحكم بها المستخدم من معاملات بناء Jenkins تُحقن بطريقة غير آمنة في أمر Git checkout.
يُقدَّم إدخال المستخدم كمعامل بناء (مثل gitParameters)، ويمكن أن يحتوي على أوامر شل خبيثة.
يُغلَّف هذا المعامل في GitParameterValue (يمتد من StringParameterValue)، وتقوم طريقته buildEnvironment() بكشفه كمتغير بيئة في سياق البناء دون تعقيم.
أثناء عملية SCM checkout، يقوم Jenkins بتحميل متغيرات بيئة البناء عبر build.getEnvironment().
يتم الحصول على اسم الفرع المستخدم في checkout (localBranchName) من متغيرات البيئة هذه.
ثم يُمرَّر اسم الفرع مباشرةً إلى طريقة CheckoutCommand.branch().
أخيرًا، تستدعي CheckoutCommand.execute() أمر Git CLI الأساسي، الذي يدمج اسم الفرع دون تحقق أو تهريب.
يتيح ذلك حقن الأوامر، مما يسمح للمهاجم بتنفيذ أوامر شل عشوائية على مضيف بناء Jenkins.
الطريقة createValue التي تتعامل مع إدخال المستخدم (مثل الحمولة JSON من HTTP POST)، وهنا يقبل Jenkins قيم المعاملات المقدمة من المستخدم عبر الطلب (على سبيل المثال، "selected": "master; rm -rf /").
يُغلَّف الإدخال في GitParameterValue، الذي يمتد من StringParameterValue، دون تعقيم أو تحقق من الإدخال.
هذا يعني أن بيانات المستخدم الخام تُقبل كمعامل بناء وتُخزَّن كمثيل ParameterValue.

فئة GitParameterValue الممتدة من StringParameterValue، ترث GitParameterValue من StringParameterValue لكنها لا تضيف أي تعقيم.
تعني سلسلة المنشئات أن إدخال المستخدم يُخزَّن الآن في كائن سيستخدمه Jenkins لاحقًا لبناء متغيرات البيئة.
هذا ينشر المدخلات الخبيثة في متغيرات بيئة بناء Jenkins.
"
فئة StringParameterValue وطريقتها buildEnvironment، هذه الطريقة حاسمة — فهي تكشف المعامل كمتغيرات بيئة في سياق البناء عبر القيام بـ
"
env.put(name, value);
env.put(name.toUpperCase(Locale.ENGLISH), value);
نظرًا لأن القيمة إدخال مستخدم غير معقّم، فإنها تسمح للمدخلات الخبيثة بالدخول إلى متغيرات بيئة Jenkins، مما يجعلها في متناول العمليات اللاحقة مثل أوامر Git.
طريقة _checkout في مكوّن GitSCM، تستدعي هذه الطريقة build.getEnvironment(listener)، التي تجمع متغيرات البيئة بما فيها المتغير الخبيث الذي تم ضبطه مسبقًا.
تستخدم هذه المتغيرات للحصول على اسم الفرع (عبر localBranchName)، الذي يُمرَّر بعد ذلك إلى CheckoutCommand.
يتدفق متغير البيئة من المعامل الخبيث مباشرةً إلى عملية checkout.

إنشاء CheckoutCommand وتعيين الفرع/المرجع بإدخال المستخدم، تستخدم CheckoutCommand.branch(localBranchName) متغير البيئة غير المعقّم.
نظرًا لأن localBranchName جاء من متغيرات بيئة يتحكم بها المستخدم، فإنه يحقن أوامر عشوائية في عملية checkout، وهذا يمهّد لحقن الأوامر عند استدعاء execute().

الطريقة CheckoutCommand.execute() التي تشغّل أمر Git CLI، هذه هي الخطوة الأخيرة حيث يُمرَّر سلسلة الفرع المحقونة مباشرةً إلى Git CLI الخاص بالنظام دون تهريب أو تعقيم، ونتيجة لذلك، تُنفَّذ الحمولة الخبيثة كأوامر شل، مما يتيح تنفيذ التعليمات البرمجية عن بُعد على مضيف Jenkins.
يكشف هذا التحليل كيف يمكن لمكوّن Jenkins Git Parameter Plugin، بالاقتران مع مكوّن Git SCM، أن يؤدي إلى ثغرة حرجة في حقن الأوامر. فمن خلال كشف قيم المعاملات التي يتحكم بها المستخدم كمتغيرات بيئة بطريقة غير آمنة، ثم تمريرها مباشرةً إلى أوامر Git CLI دون تعقيم مناسب، يمكن للمهاجمين تنفيذ أوامر عشوائية على خادم بناء Jenkins.
تسلّط سلسلة انهيار الثقة هذه — من الحمولة JSON الخبيثة الأولية إلى التنفيذ النهائي في الشل — الضوء على أهمية التحقق الصارم من المدخلات والتعامل الآمن مع معاملات البناء في أنظمة التكامل المستمر.
يجب على المستخدمين والمسؤولين التأكد من تشغيل إصدارات محدّثة من Jenkins وجميع المكوّنات الإضافية، ومراجعة أي معاملات تؤثر على أوامر الشل بعناية. يمكن أن تقلل الإجراءات التخفيفية مثل تعقيم المدخلات، أو القوائم البيضاء للفروع المسموح بها، أو عزل بيئات البناء من المخاطر.
إن فهم هذا التدفق يزوّد متخصصي الأمن والمطورين بالرؤية اللازمة لاكتشاف ومنع ومعالجة ثغرات الحقن المماثلة في Jenkins أو منصات CI/CD المماثلة.
