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 и т.д.).

Временное решение

Если немедленное обновление невозможно, примените следующие меры:

  1. Настройка 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'"
  2. Изменение конфигурации Struts (менее надежно, но может помочь):

    • В файле struts.xml вашего приложения измените используемый парсер мультипарт-данных с jakarta на pell или cos. Добавьте или измените константу: xml <constant name="struts.multipart.parser" value="pell"/>
    • Внимание: Это может нарушить функциональность загрузки файлов. Требуется тщательное тестирование.
  3. Сетевые меры:

    • Ограничьте доступ к веб-приложению (порты 80, 443, 8080 и т.д.) только для доверенных IP-адресов с помощью правил межсетевого экрана (firewall).