
اكتشاف وإصلاح Apache Commons Text المعرّضة للخطر في ملفات Java بصيغة JAR/WAR؛ اعمل بصمة للفئات وافحص البايت كود بحثًا عن مواقع استدعاء CVE-2022-42889 (Text4Shell).
انقر للانتقال إلى:
قد يشكل CVE-2022-42889 تهديدًا خطيرًا لمجموعة واسعة من التطبيقات المبنية على Java. الأسئلة المهمة التي قد يطرحها المطوّر في هذا السياق هي:
commons-text؟ وما هي الإصدارات؟هل يتضمّن الكود المُصدَر commons-text؟ وما هو إصدار المكتبة المضمّنة فيه؟ قد لا تكون الإجابة على هذه الأسئلة مباشرة بسبب عاملين:
التبعيات غير المباشرة (Transitive dependencies): في حين أن commons-text قد لا يكون في قائمة التبعيات المباشرة للمشروع، إلا أنه قد يُستخدم بشكل غير مباشر عبر تبعية أخرى.
قد لا يظهر كود هذه المكتبة مباشرةً كملف منفصل، بل قد يكون مضمّنًا داخل ملف jar آخر خاص بكود التطبيق.
تُصدر JFrog أداة للمساعدة في حل هذه المشكلة: scan_commons_text_versions. تبحث الأداة عن كود الفئة StringLookupFactory (بغضّ النظر عن أسماء ملفات .jar المحتوية عليها ومحتوى ملفات pom.xml)، وتحاول تحديد بصمة إصدارات الكائنات لتُبلغ ما إذا كان إصدار commons-text المضمّن ضعيفًا.
commons-text الضعيفة؟هذا السؤال مهم في الحالات التي يرغب فيها المطوّر بالتحقق مما إذا كانت استدعاءات commons-text في قاعدة الكود قد تمرّر بيانات يحتمل أن يتحكم بها المهاجم. في حين أن الطريقة الأأمن لإصلاح الثغرة، كما ورد في النشرات الأمنية، هي تطبيق التصحيحات المناسبة، فإن ضبط والتحقق من الأثر المحتمل بافتراض عدم تصحيح commons-text قد يكون ذا قيمة في العديد من الحالات.
scan_commons_text_calls_jar.py، التي تحدّد مواقع استدعاءات الدوال الضعيفة في ملفات .jar المترجمة، وتبلغ عن النتائج كأسماء الفئات وأسماء الدوال التي يظهر فيها كل استدعاء.
commons-text بصيغة jar ضعيفة على نظامي، كيف يمكنني تعطيل السلوك الخطير بسرعة؟يبقى التحديث هو الحل الأفضل - هذا الحل مخصّص للتصحيح الفوري السريع (hot patching).
في سياق ثغرة CVE-2022-42889، تتيح الفئة org/apache/commons/text/lookup/ScriptStringLookup في commons-text تنفيذ نصوص برمجية قد تكون مضمّنة في سلسلة نصية واردة من مصدر يتحكم به المهاجم عبر ${script}. لذلك، فإن استدعاءات الدالة ScriptStringLookup.lookup تدل على تفعيل هذه الوظيفة.
نوفر أداة، Text4ShellPatch، تسمح بتصحيح هذا الاستدعاء المحدد بحيث لا يمكن استخدام وظيفة تنفيذ النصوص البرمجية. بعد تطبيق التصحيح، ستنفّذ المكتبة دائمًا نصًا برمجيًا يعيد رسالة تحذير (بدلاً من الكود الذي يحتمل أن يتحكم به المهاجم).
وبالمثل، يمكن لعمليات البحث DNS وURL تحميل محتوى غير موثوق إذا تحكم بها المهاجم عبر ${dns} و ${url}؛ لذا يمكن تعطيل عملية البحث الخاصة بكل منهما، DnsStringLookup و UrlStringLookup على التوالي، من خلال تصحيح يُرجع رسالة تحذير.
يمكن تطبيق التصحيح على ملف jar محدد، لبحث script فقط أو لـ script و و معًا لحماية أفضل في حال لم يكن من المقرر استخدامها في التطبيق.
commons-text بصيغة jar الضعيفة؟توفر أداتان من أدواتنا معًا القدرة على فحص وتصحيح ملفات commons-text بصيغة jar الضعيفة.
يوجد مثال على سكربت bash في هذا المستودع على Github باسم scan_and_patch.sh. يستخدم بشكل أساسي سكربت scan_commons_text_versions.py للعثور، داخل root-folder محدد، على ملفات commons-text بصيغة jar ذات إصدار ضعيف، ثم تشغيل أداة Text4ShellPatch عليها كما يلي.

scan_commons_text_versions.pypython scan_commons_text_versions.py root-folder [-quiet] [-exclude folder1 folder2 ..]
ستقوم الأداة بفحص root_folder بشكل متكرر بحثًا عن ملفات .jar و .war؛ وفي كل ملف يتم العثور عليه، تبحث الأداة عن StringLookupFactory.class (بشكل متكرر داخل كل ملف .jar). إذا تم العثور على فئة واحدة على الأقل، تحاول الأداة تحديد بصمة إصدارها (بما في ذلك بعض الاختلافات الموجودة في التصحيحات والتصحيحات المُرحّلة backport) لتُبلغ ما إذا كان الكود ضعيفًا.
مع العلمة -quiet، تتم طباعة استنتاجات الإصدار فقط، ويتم كتم الرسائل الأخرى (ملفات غير موجودة / أرشيفات فشل فتحها / أرشيفات محمية بكلمة مرور).
يتم تخطي المجلدات التي تظهر بعد -exclude (اختياري).
scan_commons_text_calls_jar.pyتتطلب الأداة بايثون 3 والمكتبات الخارجية التالية: jawa، tqdm، easyargs، colorama
pip install -r requirements.txt
حالة الاستخدام الافتراضية:
python scan_commons_text_calls_jar.py root-folder
ستقوم بفحص جميع ملفات .jar في root-folder بشكل متكرر، وستطبع لكل ملف مواقع (اسم الفئة واسم الدالة) الاستدعاءات لدوال lookup/replace/replaceIn الخاصة بـ StringSubstitutor/StringLookup.
يمكن تهيئة الأداة لحالات استخدام إضافية باستخدام علامات سطر الأوامر التالية.
text_4_shell_patchjava -jar Text4ShellPatch.jar TARGET_JAR [PATCHING_MODE]
Where TARGET_JAR is the application to patch and PATCHING_MODE is
0 (default): Patch Script lookup
1: Patch Script + DNS + URL lookups
[Note: The original Jar will be kept in the same folder with the .orig.jar extension]
ستبحث الأداة عن الفئة org/apache/commons/text/lookup/ScriptStringLookup في ملف commons-text jar المعطى، وتستبدل محتوى الدالة lookup() برسالة تحذير وتعود من الدالة. وبالتالي، لن يكون eval موجودًا في فئة ScriptStringLookup الجديدة.
يمكنها أيضًا تصحيح الفئتين DnsStringLookup و URLStringLookup وتعطيل الدالة lookup() عند ضبط خيار PATCHING_MODE على 1.
يتم إنشاء ملف نسخة احتياطية أثناء العملية في نفس المسار بامتداد .orig.jar.
يمكن تعديل Text4ShellPatch وترجمته باستخدام Maven بالأمر البسيط:
mvn clean assembly:single. سينشئ ملف Text4ShellPatch.jar في مجلد target/.
dnsurlيتم إنشاء نسخة احتياطية في نفس موقع ملف jar الأصلي قبل استبداله بالملف المصحح. يتبع اسم النسخة الاحتياطية النمط التالي: <original_jar_name>_YYYY.MM.DD_HH.mm.ss.orig.jar حيث YYYY و MM و DD هي السنة والشهر واليوم على التوالي، وHH و mm و ss هي الساعة والدقائق والثانية على التوالي.
من الممكن أيضًا تحديد الإصدارات الضعيفة من commons-text وتصحيحها تلقائيًا كما يجيب على ذلك السؤال التالي.
| Flag | Default value | Use |
|---|
--class_regex | (.*StringSubstitutor|.*StringLookup) | تعبير نمطي (Regex) لاسم الفئة المطلوبة |
--method_regex | (lookup|replace|replaceIn) | تعبير نمطي (Regex) لاسم الدالة المطلوبة |
--quickmatch_string | (StringLookup|StringSubstitutor) | شرط مسبق لتحليل الملف: سيتم تجاهل ملفات .jar التي لا تحتوي على التعبير النمطي المحدد |
--class_existence | غير معيّن | عند عدم تعيينها، تبحث عن استدعاءات class::method كما هو محدد بواسطة التعبيرات النمطية. عند تعيينها، يتم تجاهل --method_regex، وستبحث الأداة عن وجود الفئات المحددة بواسطة --class_regex في ملف jar. |
--no_quickmatch | غير معيّن | عند تعيينها، يتم تجاهل قيمة --quickmatch_string ويتم تحليل جميع ملفات jar |
--caller_block | .*org/apache/commons/text | إذا تطابق اسم الفئة المستدعية مع هذا التعبير النمطي، فلن يتم عرضها |