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]