
إعادة تطبيق الإصلاح الأمني لثغرة CVE-2020-6950 على إصدار Mojarra 2.2.13، مع توفير ملف jsf-impl JAR مُصحَّح بتغييرات بسيطة وقابلة للمراجعة للتطبيقات القديمة.
يحتوي هذا المستودع على backport قابل لإعادة الإنتاج لإصلاح CVE-2020-6950 إلى Mojarra 2.2.13.
وهو موجود أساسًا لأغراض التتبع ولصيانة التطبيقات القديمة التي، لأسباب تتعلق بالتوافق، لا يمكن ببساطة ترقيتها إلى إصدار أحدث من JSF/Mojarra.
Mojarra هي التنفيذ المرجعي لـ JavaServer Faces (JSF)، التي طُوّرت في الأصل كجزء من نظام GlassFish/Java EE البيئي وتُدار الآن كمشروع Eclipse Mojarra.
كود مصدر Mojarra الموجود في هذا المستودع ليس من عملي. كل الفضل وحقوق النشر تبقى للمؤلفين والمساهمين الأصليين في Mojarra.
المشروع الأولي الحالي:
القطع الأثرية غير المعدّلة من Mojarra 2.2.13 المستخدمة كأساس لهذا العمل تم الحصول عليها من Maven Central.
الإصلاح الأمني المستخدم هنا لم يُطوَّر بواسطتي.
تم الحصول على backport لـ Mojarra 2.2.13 من حزمة openEuler الخاصة بـ Mojarra، حيث يتم تطبيق CVE-2020-6950.patch على Mojarra 2.2.13.
مصدر حزمة openEuler:
تم الاحتفاظ بالتصحيح الأصلي بحيث يبقى أصل وطبيعة التعديل الأمني الدقيقة قابلين للتتبع.
شكري لمطوّري Mojarra الأوليين ولمشرفي ومساهمي openEuler الذين وفّروا ونشروا تصحيح الأمن المُعاد بناؤه (backport).
واجهت تطبيقًا قديمًا لا يزال يعتمد على Mojarra 2.2.13 وكان متأثرًا بـ CVE-2020-6950.
لم تكن ترقية تنفيذ JSF بالكامل خيارًا عمليًا على المدى القصير لأن التطبيق والإطار المحيط به هما برمجيات قديمة ذات قيود توافق كبيرة.
في الوقت نفسه، أردت أن يكون التعديل الأمني:
لهذا السبب أعدت بناء الفئات المتأثرة بنفسي بدلًا من توزيع ثنائي معدّل غير موضّح.
لذلك لا يمثل هذا المستودع تنفيذًا مستقلًا للإصلاح الأمني. إنه يوثّق ويحزم إصلاحًا منشورًا قائمًا لاستخدامه مع Mojarra 2.2.13.
يعدّل تصحيح openEuler لـ CVE-2020-6950 ثلاث فئات من Mojarra:
com/sun/faces/application/resource/ClasspathResourceHelper.java
com/sun/faces/application/resource/ResourceManager.java
com/sun/faces/application/resource/WebappResourceHelper.java
يضيف التصحيح التحقق من اسم عقد المورد (resource contract name) باستخدام:
ResourceManager.nameContainsForbiddenSequence(...)
فقط هذه الفئات الثلاث هي التي تُستبدل في ملف JAR المُصحَّح jsf-impl-2.2.13.
تم إجراء مقارنة بين ملف JAR الأصلي والمُصحَّح بعد فك ضغطهما للتحقق من عدم وجود أي ملفات أخرى مختلفة.
تم استخدام مصادر Mojarra 2.2.13 الأصلية مع تصحيح CVE المنشور من openEuler.
نظرًا لأن إعادة بناء بيئة بناء Mojarra 2.2.13 التاريخية الكاملة وتبعيات البناء القديمة الخاصة بها ستضيف تعقيدًا غير ضروري وتجعل النتيجة أصعب في التدقيق، تمت إعادة ترجمة الفئات الثلاث المتأثرة فقط.
تمت ترجمتها باستخدام OpenJDK 8 مع:
-source 1.5 -target 1.5
تم التحقق من أن ملفات الفئات الناتجة تحتوي على:
major version: 49
وهو ما يطابق إصدار البايت كود لفئات Mojarra 2.2.13 الأصلية.
تم بعد ذلك إدراج ملفات الفئات الثلاثة الناتجة في نسخة غير معدّلة بخلاف ذلك من jsf-impl-2.2.13.jar الأصلي.
تم فك ضغط ملف JAR الناتج ومقارنته بالأصلي.
فقط هذه الملفات تختلف:
ClasspathResourceHelper.class
ResourceManager.class
WebappResourceHelper.class
تم أيضًا فحص البايت كود الناتج باستخدام javap للتحقق من أن كلا فئتي مساعد الموارد تحتويان على الاستدعاء المقصود إلى:
ResourceManager.nameContainsForbiddenSequence(...)
تم أيضًا التحقق من أن جميع فئات الاستبدال الثلاث تحتفظ بالإصدار الرئيسي 49 لملفات فئات Java.
للتطبيقات التي تستخدم حاليًا مكتبات Mojarra المقسمة:
jsf-api-2.2.13.jar
jsf-impl-2.2.13.jar
البديل ذو الصلة الذي ينتجه هذا المشروع هو:
jsf-impl-2.2.13-patched.jar
اسم ملف JAR نفسه ليس مهمًا لمحمّل فئات Java. يتم الاحتفاظ باللاحقة -patched عمدًا حتى يتمكن المسؤولون من تمييز التنفيذ المعدّل عن الأصلي فورًا.
لا تنشر ملفي JAR الأصلي والمُصحَّح لـ jsf-impl في نفس الوقت.
إجراء النشر الآمن هو عمل نسخة احتياطية من التطبيق الحالي أولًا، وإزالة jsf-impl-2.2.13.jar الأصلي، ونشر jsf-impl-2.2.13-patched.jar، وإعادة تشغيل التطبيق/الحاوية، والتحقق من كل من التشغيل الطبيعي للتطبيق والمشكلة الأمنية التي يعالجها CVE-2020-6950.
هذا المستودع مخصص كـ backport توافق/أمن ضيق النطاق لتركيبات Mojarra 2.2.13 القديمة.
إنه ليس fork من Mojarra، وليس إصدارًا جديدًا من Mojarra، وليس تابعًا أو معتمدًا من Eclipse Foundation أو Oracle أو GlassFish أو openEuler.
حيثما أمكن، فإن الترقية إلى تنفيذ JSF/Jakarta Faces مُصان حاليًا هي الأفضل من صيانة إصدار Mojarra قديم بتصحيحات أمنية فردية.
يعالج هذا المستودع CVE المحدد الموصوف أعلاه. يجب ألا يُفسَّر على أنه يجعل Mojarra 2.2.13 آمنًا بشكل عام، أو حاليًا، أو مُصانًا، أو مدعومًا.
يبقى المستخدمون مسؤولين عن اختبار القطعة الأثرية المُصحَّحة في بيئتهم الخاصة قبل نشرها في أنظمة الإنتاج.
يبقى كود مصدر Mojarra الأصلي والثنائيات خاضعين لتراخيص الأولية وإشعارات حقوق النشر الخاصة بها.
تم توزيع Mojarra 2.2.13 بموجب شروط الترخيص المزدوج GPL v2 / CDDL المطبقة على ذلك الإصدار، بما في ذلك استثناء Classpath الخاص بـ GPL حيثما ورد في ترويسات المصدر الأصلية.
يتم تضمين ملف ترخيص Mojarra الأصلي دون تغيير في:
packager/legal/LICENSE.txt
تم الاحتفاظ بترويسات حقوق النشر والترخيص الأصلية في ملفات مصدر Mojarra.
يبقى التصحيح المقدَّم من openEuler منسوبًا إلى مؤلفيه ومشروع المصدر الخاص به.
لا يدّعي هذا المستودع أي ملكية لكود Mojarra الأصلي أو لإصلاح CVE.