31 марта 2022 года были публично раскрыты уязвимости в Spring Framework для Java.
Spring Framework
Spring Framework - это наиболее широко используемый легкий фреймворк с открытым исходным кодом для Java. В Java Development Kit (JDK) версии 9.0 или более поздней, удаленный злоумышленник может получить объект AccessLogValve через функцию привязки параметров фреймворка и использовать вредоносные значения полей для запуска механизма конвейера и записи в файл по произвольному пути, если выполняются определенные условия.
Уязвимость в Spring Core - называемая в сообществе безопасности SpringShell или Spring4Shell - может быть использована, когда злоумышленник отправляет специально созданный запрос на веб-сервер, работающий на фреймворке Spring Core. Другие уязвимости, обнаруженные в том же компоненте, менее критичны и не отслеживаются в рамках данного блога.
Затронутые системы обладают следующими характеристиками:
- Запуск JDK 9.0 или более поздней версии.
- Spring Framework версий 5.3.0 - 5.3.17, 5.2.0 - 5.2.19 и более ранние версии
- Apache Tomcat в качестве контейнера сервлетов:
- Упакован как традиционный веб-архив Java (WAR) и развернут в отдельном экземпляре Tomcat; типичные развертывания Spring Boot с использованием встроенного контейнера сервлетов или реактивного веб-сервера не затрагиваются.
- Tomcat имеет зависимости spring-webmvc или spring-webflux
Любая система, использующая JDK 9.0 или более позднюю версию и использующая Spring Framework или производные фреймворки, должна считаться уязвимой. Для определения уязвимых систем можно использовать следующую не вредоносную команду:
1 | curl host:port/path?class.module.classLoader.URLs%5B0%5D=0 |
Хост, который возвращает ответ HTTP 400, следует считать уязвимым к атаке, подробно описанной в приведенном ниже доказательстве концепции (POC). Обратите внимание, что хотя этот тест является хорошим индикатором восприимчивости системы к атаке, любая система в рамках перечисленных выше систем, подверженных воздействию, все равно должна считаться уязвимой.
Описание атаки
CVE-2022-22965 затрагивает функции, использующие аннотацию отображения запросов и параметры Plain Old Java Object (POJO) в Spring Framework. Код POC создает контроллер, который, будучи загруженным в Tomcat, обрабатывает HTTP-запросы.
Единственный общедоступный рабочий POC специфичен для свойств логирования сервера Tomcat через модуль ClassLoader в кэше propertyDescriptor. Злоумышленник может обновить класс AccessLogValve с помощью модуля, чтобы создать веб-оболочку в корневом каталоге Tomcat под названием shell.jsp. Затем злоумышленник может изменить стандартные журналы доступа на файл по своему усмотрению.
Изменения в AccessValveLog могут быть достигнуты злоумышленником, который может использовать HTTP-запросы для создания .jsp-файла в корневом каталоге службы. В приведенном ниже примере каждый параметр GET задается как свойство объекта Java. Каждый GET-запрос затем выполняет Java-код, похожий на приведенный ниже пример, где конечный сегмент "setPattern" будет уникальным для каждого вызова (например, setPattern, setSuffix, setDirectory и другие).