CVE-2020-17530

Apache Struts

ВЫСОКАЯ ВЕРОЯТНОСТЬ

Дата обнаружения

2021-11-03

Официальное описание

Forced Object-Graph Navigation Language (OGNL) evaluation in Apache Struts, when evaluated on raw user input in tag attributes, can lead to remote code execution.

🛡️
Технический анализ и план устранения

Суть уязвимости

Уязвимость (CVE-2020-17530) в Apache Struts 2 позволяет злоумышленнику выполнить произвольный код на сервере. Это происходит из-за некорректной обработки пользовательского ввода в атрибутах некоторых тегов (например, id). Атакующий может передать специально сформированное выражение на языке OGNL, которое будет выполнено на сервере с привилегиями приложения, что приведет к полному компрометированию системы.

Как исправить

Необходимо обновить Apache Struts 2 до исправленной версии.

  • Для Struts 2.5.0 — Struts 2.5.25: Обновитесь до версии Struts 2.5.26 или выше.
  • Для Struts 2.0.0 — Struts 2.4.15: Обновитесь до версии Struts 2.3.37 или Struts 2.4.30 (рекомендуется перейти на ветку 2.5.x).

Пример для Linux (обновление через менеджер пакетов, если Struts установлен из репозитория):

# Для систем на основе Debian/Ubuntu (если пакет доступен)
sudo apt update
sudo apt install libstruts2-java

# Для систем на основе RHEL/CentOS (если пакет доступен)
sudo yum update struts

Важно: Чаще всего Struts поставляется как библиотека внутри веб-приложения (WAR-файл). В этом случае: 1. Скачайте исправленные JAR-файлы (например, struts2-core-2.5.26.jar) с официального сайта Apache. 2. Замените уязвимые библиотеки в директории WEB-INF/lib вашего приложения. 3. Перезапустите сервер приложений (Tomcat, JBoss и т.д.).

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

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

  1. Настройка WAF (Web Application Firewall):

    • Добавьте правило для блокировки запросов, содержащих в параметрах или заголовках строки, характерные для OGNL-инъекций (например, %{, #_memberAccess, #context, #parameters).
    • Пример правила для ModSecurity (CRS): SecRule ARGS_NAMES|ARGS|REQUEST_HEADERS "@rx (?i)(\%\{|#context|#_memberAccess|#parameters)" \ "id:10001,phase:2,deny,status:403,msg:'Potential Struts OGNL Injection'"
  2. Ограничение доступа:

    • Настройте сетевые ACL (брандмауэр) так, чтобы доступ к веб-приложению на основе Struts был только из доверенных сетей (например, внутренней корпоративной сети).
  3. Валидация входных данных (на уровне приложения):

    • Если у вас есть доступ к исходному коду, убедитесь, что все пользовательские данные, используемые в атрибутах тегов (например, <s:textfield id="%{userInput}">), проходят строгую валидацию или экранирование. Однако этот метод ненадежен и должен рассматриваться только как крайняя временная мера в сочетании с другими.