CVE-2022-22965
VMware Spring Framework
2022-04-04
Spring MVC or Spring WebFlux application running on JDK 9+ may be vulnerable to remote code execution (RCE) via data binding.
Технический анализ и план устранения
Суть уязвимости
Уязвимость (Spring4Shell) позволяет злоумышленнику выполнить произвольный код на сервере, отправив специально сформированный HTTP-запрос (например, POST) с параметрами, которые манипулируют процессом data binding в Spring MVC/WebFlux. Для эксплуатации необходимо, чтобы приложение было развернуто на Tomcat как WAR-файл и использовало JDK 9 или выше.
Как исправить
Основной метод — обновление Spring Framework до защищенной версии.
- Для Spring Framework 5.3.x — обновитесь до версии 5.3.18+.
- Для Spring Framework 5.2.x — обновитесь до версии 5.2.20+.
- Для Spring Boot 2.6.x — обновитесь до версии 2.6.6+ (которая включает Spring Framework 5.3.18).
- Для Spring Boot 2.5.x — обновитесь до версии 2.5.12+ (которая включает Spring Framework 5.3.18).
Пример для Linux (обновление через менеджер пакетов Maven/Gradle):
Обновите версию Spring в файле конфигурации вашего проекта (pom.xml для Maven или build.gradle для Gradle).
<!-- Пример для Maven (Spring Boot 2.6.x) -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version> <!-- Исправленная версия -->
</parent>
// Пример для Gradle (Spring Boot 2.6.x)
plugins {
id 'org.springframework.boot' version '2.6.6' // Исправленная версия
}
После изменения конфигурации пересоберите и переразверните приложение.
Временное решение
Если немедленное обновление невозможно, примените одно из следующих решений:
-
Добавление глобального контроллера: Создайте класс
@ControllerAdvice, который регистрирует@InitBinderдля всех контроллеров, чтобы запрещать привязку полей определенных типов (например,Class). ```java import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.InitBinder;@ControllerAdvice public class BinderControllerAdvice { @InitBinder public void setAllowedFields(WebDataBinder dataBinder) { String[] denylist = new String[]{"class.", "Class.", ".class.", ".Class."}; dataBinder.setDisallowedFields(denylist); } } ``` Пересоберите и перезапустите приложение.
-
Настройка WAF (Web Application Firewall): Добавьте правила для блокировки HTTP-запросов, содержащих в параметрах подозрительные строки, такие как
class.*,Class.*,*.class.*,*.Class.*. -
Понижение версии JDK: Если позволяет инфраструктура, временно разверните приложение на JDK 8. Это полностью блокирует данный вектор атаки.