CVE-2017-5638
Apache Struts
2021-11-03
Apache Struts Jakarta Multipart parser allows for malicious file upload using the Content-Type value, leading to remote code execution.
Технический анализ и план устранения
Суть уязвимости
Уязвимость в парсере Jakarta Multipart (Content-Type) фреймворка Apache Struts 2. Злоумышленник может отправить на сервер специально сформированный HTTP-запрос с вредоносным значением в заголовке Content-Type. При обработке такого запроса парсер некорректно интерпретирует его, что позволяет выполнить произвольный код на сервере (RCE) с правами пользователя, под которым работает приложение.
Как исправить
Необходимо обновить Apache Struts 2 до исправленной версии. Выбор версии зависит от используемой ветки.
- Для Struts 2.3.x: обновитесь до версии 2.3.32 или выше.
- Для Struts 2.5.x: обновитесь до версии 2.5.10.1 или выше.
Пример для Linux (обновление через менеджер пакетов, если Struts установлен из репозитория):
# Для систем на базе Debian/Ubuntu (если пакет доступен)
sudo apt update
sudo apt install libstruts2-java
# Для систем на базе RHEL/CentOS (если пакет доступен)
sudo yum update struts2
Важно: Чаще всего Struts используется как библиотека внутри веб-приложения (WAR-файл). В этом случае:
1. Определите точную версию Struts в вашем приложении (проверьте файлы *.jar в /WEB-INF/lib/, например, struts2-core-2.3.24.jar).
2. Скачайте исправленные версии библиотек (JAR-файлы) с официального сайта Apache Struts.
3. Замените уязвимые JAR-файлы (например, struts2-core-*.jar) в вашем приложении на исправленные.
4. Пересоберите и переразверните приложение на сервере приложений (Tomcat, JBoss и т.д.).
Временное решение
Если немедленное обновление невозможно, примените следующие меры:
-
Настройка WAF (Web Application Firewall):
- Добавьте правило для блокировки HTTP-запросов, содержащих в заголовке
Content-Typeстроки#илиmultipart/form-dataс последующими выражениями, похожими на OGNL (например, содержащими${,%{). - Пример правила для ModSecurity (CRS):
SecRule REQUEST_HEADERS:Content-Type "@rx (\#|\$\{|\%\{)" \ "id:1000001,phase:1,deny,status:403,msg:'CVE-2017-5638 Exploit Attempt'"
- Добавьте правило для блокировки HTTP-запросов, содержащих в заголовке
-
Изменение конфигурации Struts (менее надежно, но может помочь):
- В файле
struts.xmlвашего приложения измените используемый парсер мультипарт-данных сjakartaнаpellилиcos. Добавьте или измените константу:xml <constant name="struts.multipart.parser" value="pell"/> - Внимание: Это может нарушить функциональность загрузки файлов. Требуется тщательное тестирование.
- В файле
-
Сетевые меры:
- Ограничьте доступ к веб-приложению (порты 80, 443, 8080 и т.д.) только для доверенных IP-адресов с помощью правил межсетевого экрана (firewall).