CVE-2025-24813 - удалённое выполнение произвольного кода Apache Tomcat
Критическая уязвимость в Apache Tomcat, популярном открытом веб-сервере и контейнере сервлетов для Java-приложений, которая позволяет удалённое выполнение произвольного кода без аутентификации.
Уязвимость возникает из-за неправильной обработки частичных PUT-запросов (partial PUT requests) в default servlet Apache Tomcat. По умолчанию этот servlet настроен только на чтение (readonly=true), но если он включён в режим записи (readonly=false), сервер становится уязвимым. Ключевой проблемой является path equivalence flaw — механизм замены слешей (/) на точки (.) в именах файлов при обработке путей. Это позволяет атакующему обходить ограничения на пути и сохранять файлы в неожиданных директориях, например, вне предназначенных папок.
Технические детали
- Пораженные версии: Apache Tomcat 11.0.0-M1 до 11.0.2 (включая milestone-версии). Apache Tomcat 10.1.0-M1 до 10.1.34. Apache Tomcat 9.0.0-M1 до 9.0.98.
- Платформы: Любая платформа, где установлен Apache Tomcat с включённым default servlet в режиме записи (readonly=false) и file-based session storage (по умолчанию в некоторых конфигурациях).
- Тип уязвимости: Path Equivalence (CWE-20: Improper Input Validation). Insecure Deserialization (CWE-502). Уязвимость связана с неправильной обработкой частичных PUT-запросов и десериализацией пользовательских данных.
- CVSS v3.1: Оценка: 5.5 (средняя серьёзность). Вектор: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N.
- Точка входа: Default servlet Apache Tomcat, обрабатывающий HTTP PUT-запросы, в сочетании с механизмом хранения сессий в файлах (file-based session persistence). Уязвимость активируется при обработке специально сформированных путей в запросах, использующих замену слешей (/) на точки (.) в именах файлов.
Влияние
Эксплойт использует HTTP-запросы для загрузки и активации вредоносного payload. Вот типичный сценарий на основе PoC из репозиториев вроде brs6412/CVE-2025-24813 или аналогичных (например, Mattb709/CVE-2025-24813-PoC):
Подготовка payload: Атакующий создаёт сериализованный Java-объект с вредоносным кодом. Это можно сделать с помощью инструментов вроде ysoserial (генератор гаджетов для десериализации). Payload кодируется в base64 и может содержать команды, например, для выполнения cmd.exe /c calc.exe (открытие калькулятора на Windows) или кражи данных. В "безопасных" PoC используется dummy-payload для тестирования (без реального вреда, только для проверки десериализации).
Загрузка файла (PUT-запрос): Атакующий отправляет частичный HTTP PUT-запрос на уязвимый endpoint (обычно / или директорию сессий). Запрос содержит:
- Специально сформированный путь, где слеши заменяются на точки (например, /path/to/session.file становится path.to.session.file), чтобы обойти ограничения и сохранить файл в директории сессий Tomcat (например, SESSIONS.ser или аналогичный).
- Тело запроса — base64-кодированный payload.
Пример упрощённого PUT-запроса (из PoC):
PUT /path.to.malicious.session HTTP/1.1 Host: target-server:8080 Content-Length: [длина payload] [Base64-encoded serialized object]
Сервер сохраняет файл в неожиданном месте из-за path equivalence, если запись разрешена.
Активация десериализации (GET-запрос): Атакующий отправляет GET-запрос с cookie JSESSIONID, указывающим на загруженный файл сессии (например, JSESSIONID=malicious.session). Tomcat пытается загрузить и десериализовать сессию из файла, что приводит к выполнению кода.
GET / HTTP/1.1 Host: target-server:8080 Cookie: JSESSIONID=../path.to.malicious.session
В ответ сервер вернёт ошибку (например, HTTP 500), но payload выполнится. В логах Tomcat появятся признаки: необычные PUT/GET-запросы, доступ к сессионным файлам или base64-данные.
Результат: Если payload вредоносный, атакующий получает RCE — выполнение команд на сервере, доступ к файлам, инъекцию JSP-скриптов или коррупцию данных. В реальных атаках наблюдались попытки кражи конфиденциальной информации или установки бэкдоров.