CVE-2021-39144
XStream XStream
2023-03-10
XStream contains a remote code execution vulnerability that allows an attacker to manipulate the processed input stream and replace or inject objects that result in the execution of a local command on the server. This vulnerability can affect multiple products, including but not limited to VMware Cloud Foundation.
Технический анализ и план устранения
Суть уязвимости
CVE-2021-39144 — это критическая уязвимость (CVSS 9.8), связанная с небезопасной десериализацией в библиотеке XStream. Проблема заключается в том, что XStream по умолчанию позволяет десериализовать произвольные типы объектов из XML-входных данных.
Злоумышленник может сформировать специально подготовленный XML-запрос, содержащий манипулируемые объекты (в частности, связанные с динамическими прокси и java.beans.EventHandler). При обработке такого потока данных XStream создает объекты, которые в процессе своей инициализации или финализации выполняют произвольные команды в операционной системе сервера с правами запущенного Java-приложения.
Как исправить
Основным способом устранения уязвимости является обновление библиотеки XStream до версии, в которой введены более строгие политики безопасности по умолчанию.
- Обновите XStream до версии 1.4.18 или выше. Если вы используете Maven, измените версию в
pom.xml:
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.18</version>
</dependency>
-
Если вы используете продукты, в состав которых входит XStream (например, VMware Cloud Foundation), необходимо применить официальные патчи от производителя. Для VMware Cloud Foundation (NSX-V) следуйте инструкциям из соответствующего бюллетеня безопасности (VMSA-2021-0025).
-
После обновления убедитесь, что в коде инициализации XStream настроен белый список разрешенных типов (AllowList). Начиная с версии 1.4.18, XStream блокирует опасные типы по умолчанию, но явная настройка является лучшей практикой:
XStream xstream = new XStream();
XStream.setupDefaultSecurity(xstream);
xstream.allowTypes(new Class[] { MySafeClass.class });
Временные меры
Если немедленное обновление библиотеки невозможно, необходимо ограничить возможности десериализации программным путем или на уровне сетевой защиты.
- Настройте фильтрацию типов в объекте XStream, чтобы запретить обработку потенциально опасных классов (черный список). Добавьте следующий код перед обработкой входных данных:
xstream.denyTypesByRegExp(new String[] { ".*\\.EventHandler" });
xstream.denyTypes(new Class[] { java.lang.ProcessBuilder.class });
-
Если XStream используется в веб-сервисах, настройте правила на Web Application Firewall (WAF) для блокировки XML-запросов, содержащих теги
<dynamic-proxy>и обращения к классуjava.beans.EventHandler. -
Ограничьте права доступа учетной записи, от которой запускается Java-приложение, чтобы минимизировать ущерб в случае успешной эксплуатации (принцип наименьших привилегий).
-
Изолируйте уязвимые компоненты в сети, ограничив исходящий трафик с серверов приложений, чтобы предотвратить загрузку полезной нагрузки или установку reverse shell.