
برنامج اختبار لـ CVE-2014-0094 الخاص بـ struts1
تلخيص تأثير CVE-2014-0094 على Struts1. ما لم يُذكر خلاف ذلك، تم التحقق من كل إصدار باستخدام Java 1.7.0_02, Struts 1.3.10, Apache Tomcat 6.0.39, FreeBSD 8.2.
ملاحظة: لا نضمن محتوى المصادر أو النصوص تحت أي ظرف. ولا أتحمل أي مسؤولية عن أي حوادث تحدث. خاصة إذا تم إساءة استخدام هذا المحتوى، فأنا لا أتدخل على الإطلاق. (على الرغم من أنه لا يوجد شيء جديد هنا).
هذه المرة، قدمت أمثلة محددة للحلول بالرجوع إلى مواقع ويب متنوعة. باستثناء الحقائق المعروفة، قمت بتضمين عناوين URL المرجعية في المصادر. أشكر أولئك الذين جعلوا المعلومات متاحة.
حاولت استخدام كلمات سهلة الفهم، قدر الإمكان دون استخدام المصطلحات المتخصصة، على الرغم من أنه قد يكون هناك بعض سوء الفهم.
أما بالنسبة لهذه الثغرة في Struts1، فهناك أسماء مثل CVE-2014-0094 و S2-020، لكن ليس واضحًا تمامًا. على أي حال، سأشير إليها باسم CVE-2014-0094.
ليس هناك حاجة لتوضيح ذلك مرة أخرى، لكن CVE-2014-0094 تمثل مشكلة كبيرة جدًا.
http://www.nta.go.jp/sonota/sonota/osirase/service.htm
إشعار تعطيل الخدمة (هام) 25 أبريل 2014 لـ 'برنامج e-Tax (إصدار الويب)' و 'ركن إعداد الإقرارات الضريبية' و 'NISA (النسخة اليابانية من ISA)'
وفقًا لذلك، كانت خدمة الويب الخاصة بمكتب الضرائب الوطني تستخدم Struts1، وتم إيقاف الخدمة في نفس يوم الاكتشاف.
يبدو أنهم قاموا بإيقاف الخدمة بسرعة لتقليل الضرر.
عند إجراء اختبار إثبات المفهوم هنا، تأكدنا من أنه بمجرد الوصول إلى عنوان URL، يمكن إيقاف الخدمة وتسريب أي ملف.
نظرًا لأن الأمر يتطلب فقط الوصول إلى عنوان URL، فمن الصعب تحديد الجاني بمجرد إرسال بريد إلكتروني يحتوي على عنوان URL إلى قائمة بريدية من عنوان بريد إلكتروني مجهول، مما يسهل تعطيل الخدمة.
هل هذه مشكلة يمكن الهجوم عليها بسهولة بهذا الشكل؟
هذا هو الأهم على ما أعتقد. إذا أعلنت جهة خارجية أن هناك تأثيرًا محتملاً على الأقل، فإن الطريقة الصحيحة هي إيقاف الخدمة أولاً لمنع انتشار الضرر.
حتى لو تبين لاحقًا أنه لا يوجد تأثير، فإن المعلومات المسربة لا يمكن استعادتها.
بالطبع، هذا يتطلب حكمًا سياسيًا. في حالة الشركات، يتم اختبار الأخلاقيات والوعي اليومي بالمشاكل وإدارة المخاطر.
تعود هذه المشكلة إلى إمكانية تعديل بعض قيم الإعدادات التي يحتفظ بها النظام.
يجب التحقق من أي قيم إعدادات يمكن تعديلها. بناءً على تلك القيم، يتم تحديد الهجمات المحتملة.
تختلف هذه الإعدادات حسب حاوية Servlet.
في Tomcat 6، من المحتمل أن تنفيذ الكود التعسفي غير ممكن، لكن في Tomcat 8 يمكن تنفيذ كود تعسفي.
بالإضافة إلى ذلك، بالنسبة لـ Jetty و WebSphere Application Server وغيرها، من الضروري التحقق من الإعدادات المتاحة بناءً على البيئة المستخدمة.
في Tomcat 6، يُقال إنه يمكن تعديل 23 إعدادًا. إذا تم تغيير 'class.classLoader.resources.dirContext.docBase'، يصبح تشغيل النظام الطبيعي مستحيلًا، وبدلاً من عرض JSP، يمكن تحديد ملف على الخادم للحصول على أي ملف (تسريب).
في Tomcat 8، يمكن تنفيذ كود تعسفي، وذلك لأن عدد القيم القابلة للتعديل زاد مقارنة بـ Tomcat 6. إذا لم تكن تلك القيم موجودة في حاوية الخادم المستخدمة، فمن المحتمل أن المشكلة أقل في الوقت الحالي.
يمكن إجراء تعديل الإعدادات هذه عن طريق تضمين السلسلة في عنوان URL، أو كحقل مخفي في طلب عادي، أو حتى عبر ملفات تعريف الارتباط.
من سجلات الوصول، لا يمكن معرفة ذلك إذا تم تعيينه كحقل مخفي.
غالبًا ما تتم إعادة التشغيل في وقت متأخر من ليلة الأحد. إذا تم تعديل docBase والحصول على الملفات قبل ذلك بقليل، ثم تمت إعادة تشغيل النظام، يصبح من الصعب على مسؤول النظام ملاحظة الشذوذ.
إذا حدثت حالات متكررة من حالات 404 و 500 وما إلى ذلك خلال تلك الفترة الزمنية، فمن المحتمل جدًا أن تكون بعض الملفات قد تسربت.
تم إيقاف دعم Struts1 (دعنا نترك جانبًا مسألة معنى دعم المصادر المفتوحة)، ولا توجد تصحيحات أمان. يجب حلها بنفسك.
أصل المشكلة هو BeanUtil، ومن الضروري تنفيذ تجاهل السلاسل غير المناسبة عند ورودها.
BeanUtil هي أداة لتعديل قيم إعدادات الكائنات (وهذا تبسيط كبير).
مثال التنفيذ:
com.haselab.struts.filter
web.xml
باختصار، يتم استدعاء برنامج في web.xml لتعديل سلوك BeanUtil عند بدء تشغيل النظام.
يتم استدعاء SafeResolverListener.java، وبالتالي سيستخدم BeanUtil SafeResolver.java من الآن فصاعدًا.
في SafeResolver.java، إذا كانت السلسلة التي تم تحليلها (بغض النظر عن حالة الأحرف) هي 'classLoader'، فإنها تُرجع سلسلة فارغة. أي أنه يمنع تعيين أي قيمة عشوائية لـ classLoader.
بالنسبة لهذا السلوك، تم الرجوع إلى https://gist.github.com/nakamura-to/11347570 (برنامج قصير، تم استخدامه كما هو).
إذا كان التطبيق بحاجة إلى تغيير إعداد يسمى 'classLoader'، فإن هذه الطريقة تمنع ذلك، لذا لا يمكن التعامل معها.
لكن بشكل عام، من غير المحتمل استخدام اسم 'classLoader'، لذلك لا توجد مشكلة في البداية.
إذا كنت قلقًا، يمكنك تشغيل 'grep -r -i classLoader *' على جميع مصادر التطبيق للتأكد من عدم وجوده.
لقد تحققت من تعديل docBase. بعد النشر باستخدام mvn، يرجى عرض دليل struts في المتصفح. عند الضغط على الزر، يتم تعديل docBase وعرض ملف /etc/passwd.