CVE-2018-11776
Apache Struts
2021-11-03
Apache Struts contains a vulnerability that allows for remote code execution under two circumstances. One, where the alwaysSelectFullNamespace option is true and the value isn't set for a result defined in underlying configurations and in same time, its upper package configuration have no or wildcard namespace. Or, using URL tag which doesn't have value and action set and in same time, its upper package configuration have no or wildcard namespace.
Технический анализ и план устранения
Суть уязвимости
Уязвимость в Apache Struts 2 позволяет злоумышленнику выполнить произвольный код на сервере, если сконфигурировано одно из двух условий:
1. Когда опция alwaysSelectFullNamespace включена (true), а для результата (result) в конфигурации не задано значение namespace, и при этом родительский пакет (package) имеет пустой ("") или wildcard (/*) неймспейс.
2. При использовании тега <s:url>, у которого не заданы атрибуты value и action, и при этом родительский пакет имеет пустой или wildcard неймспейс.
Атакующий может отправить специально сформированный HTTP-запрос, который приведет к обработке некорректного неймспейса и выполнению OGNL-выражения, содержащего вредоносный код.
Как исправить
Основной метод — обновление Apache Struts 2 до исправленной версии.
- Для Struts 2.3.x: Обновитесь до версии 2.3.37 или новее.
- Для Struts 2.5.x: Обновитесь до версии 2.5.17.1 или новее.
Пример для Linux (если Struts установлен из репозитория или архива):
# 1. Остановите ваше приложение/сервер (например, Tomcat)
sudo systemctl stop tomcat9
# 2. Скачайте и распакуйте исправленную версию библиотек Struts
# Например, для Struts 2.5.26 (актуальной на момент написания):
wget https://archive.apache.org/dist/struts/2.5.26/struts-2.5.26-all.zip
unzip struts-2.5.26-all.zip
# 3. Замените файлы .jar в вашем приложении (например, в WEB-INF/lib/)
# на новые из папки lib/ распакованного архива.
cp struts-2.5.26/lib/*.jar /path/to/your/webapp/WEB-INF/lib/
# 4. Запустите приложение/сервер заново
sudo systemctl start tomcat9
Важно: Пути и команды остановки/запуска зависят от вашего окружения. Всегда проверяйте актуальные версии на официальном сайте Apache Struts.
Временное решение
Если немедленное обновление невозможно, примените следующие меры:
-
Настройте WAF (Web Application Firewall): Добавьте правила для блокировки запросов, содержащих подозрительные OGNL-выражения или паттерны, характерные для эксплуатации этой уязвимости (например,
%{,#_memberAccess).- Пример правила для ModSecurity:
SecRule ARGS_NAMES|ARGS "@rx (\$|#|%\{).*" \ "id:1000,phase:2,deny,status:403,msg:'Potential Struts RCE Attack'"
- Пример правила для ModSecurity:
-
Ограничьте доступ: Настройте сетевые ACL или файрвол так, чтобы доступ к приложению на базе Struts был только с доверенных IP-адресов (например, из внутренней сети).
bash # Пример: разрешить доступ только из сети 192.168.1.0/24 (iptables) sudo iptables -A INPUT -p tcp --dport 8080 -s 192.168.1.0/24 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 8080 -j DROP -
Проверьте конфигурацию: Убедитесь, что в конфигурационных файлах
struts.xmlиstruts.propertiesотключена опцияalwaysSelectFullNamespace(по умолчанию онаfalse). Явно установите неймспейсы для всех пакетов и действий, избегая пустых ("") или wildcard (/*) значений.xml <!-- В struts.xml --> <struts> <constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/> <package name="secure-app" namespace="/secure" extends="struts-default"> <!-- Ваши действия --> </package> </struts>