Struts 2 S2-016 Снижение уязвимости до обновления

Недавно Struts исправил уязвимость, позволяющую злоумышленникам выполнять удаленный код. Очевидно, не исправление это похоже на приветствие черных шляп красной ковровой дорожке с побеждающей стороной на выборах: - /

http://struts.apache.org/release/2.3.x/docs/s2-016.html

В основном это позволяет выполнять команды атаки следующим образом:

Законное действие: http://host/struts2-showcase/employee/save.action?redirect:%25{3*4}Эксплуатируемое действие: http://host/struts2-showcase/employee/save.action?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}

Хотя я знаю, что обновление должно быть выполнено как можно скорее, как можно скорее это будет означать некоторое время, так как наша кодовая база использует старые версии Struts и плагины.

Что потребует некоторого рефакторинга для обновления библиотек Struts 2, затем они должны быть протестированы и т. Д.

В связи с этим у меня возникает вопрос: есть ли у кого-нибудь идея остановить выполнение этой уязвимости? Это будет только до тех пор, пока мы не сможем обновить.

Мне было интересно, возможно ли написание перехватчика для очистки URL-адреса перед его сравнением с OGNL, и если это так, это уменьшит эту проблему?

Другая идея, которая у меня была, заключалась в том, чтобы каким-то образом использовать диспетчер безопасности Java, чтобы остановить произвольные вызовы процессов. Возможно ли это? Это исправит дыру временно?

Используемый сервер - jBoss, если кто-то считает, что это актуально.

3 ответа

Решение

Проблема связана с DefaultActionMapper и как он обрабатывает специальные параметры. Этот класс может быть расширен для переопределения handleSpecialParameters метод. Однако, если вы отключите DMI, эти специальные параметры больше не будут работать. Используйте постоянную конфигурацию

<constant name="struts.enable.DynamicMethodInvocation" value="false"/>

Если у вас есть веб-сервер перед вашим сервером приложений, вы можете ограничить доступ по URL. В апаче есть mod_rewrite модуль, который вы можете использовать. Задавать RewriteCond директива QUERY_STRING переменная для некоторого шаблона запроса и перенаправление на dev/null.

Согласно другому комментарию, если вы используете Apache перед Tomcat, вы можете использовать этот фрагмент конфигурации Apache, чтобы запросы не достигали Tomcat:

RewriteEngine On
RewriteCond %{QUERY_STRING} java.lang.ProcessBuilder
RewriteRule (.*) - [F]
Другие вопросы по тегам