Уязвимость сервлета DefaultServlet сервера приложений Apache Tomcat
Уязвимость сервлета DefaultServlet сервера приложений Apache Tomcat
Категория: Программы Теги: Уязвимости Опубликовано: 14 мая 2025

Уязвимость BDU:2024-11286 (CVE-2024-50379) в Apache Tomcat

Уязвимость BDU:2024-11286 (CVE-2024-50379) в Apache Tomcat, связана с конкуренцией за ресурсы (race condition) при обработке файлов JSP. Она позволяет злоумышленнику выполнить произвольный код на сервере, если выполнены определенные условия конфигурации.


Анализ уязвимости

Уровень опасности: 9.8 (Критический)
Вектор атаки: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

  1. AV:N (Вектор атаки: Сетевой) – Удалённая эксплуатация через интернет.

  2. AC:L (Сложность атаки: Низкая) – Простая реализация без сложных условий.

  3. PR:N (Привилегии: Нет) – Доступ к системе не требуется.

  4. UI:N (Взаимодействие: Нет) – Участие пользователя не нужно.

  5. S:U (Область: Неизменная) – Влияет только на уязвимый компонент.

  6. C:H (Конфиденциальность: Высокое) – Полная компрометация данных.

  7. I:H (Целостность: Высокое) – Возможность полного изменения данных.

  8. A:H (Доступность: Высокое) – Критическое нарушение работы системы.

Интерпретация: Критическая уязвимость (9.8) позволяет удалённо без прав и участия пользователя нарушить конфиденциальность, целостность и доступность системы. Максимальный риск обусловлен сетевым вектором, низкой сложностью эксплуатации и полным контролем над уязвимым компонентом.

Технические детали уязвимости

Природа проблемы

Уязвимость BDU:2024-11286 (CVE-2024-50379) относится к классу TOCTOU (Time-of-Check to Time-of-Use). Она возникает из-за разрыва между моментом проверки файла (например, его существования и прав доступа) и моментом его использования. В Apache Tomcat это происходит во время компиляции JSP-файлов:

  1. Time-of-Check (TOC): Tomcat проверяет наличие и корректность JSP-файла перед компиляцией.

  2. Time-of-Use (TOU): Файл компилируется в сервлет и выполняется.

Атакующий может подменить файл в промежуток между TOC и TOU, особенно на файловых системах, не различающих регистр (например, Windows). Например, замена file.jsp на FILE.JSP позволяет обойти проверки, если сервер настроен на запись в директорию через DefaultServlet.

Условия эксплуатации

Для успешной атаки необходимо:

  1. Конфигурация Tomcat:

    • Параметр readonly в web.xml должен быть установлен в false (нестандартная настройка).

    • Разрешен метод PUT для загрузки файлов.

  2. Файловая система: Сервер должен работать на case-insensitive FS (Windows, macOS по умолчанию).

  3. Доступ к серверу: Атакующий должен иметь возможность отправлять HTTP-запросы к Tomcat (локально или удаленно).


Анализ эксплойтов

Пример 1: Использование JSP-скриптов

Эксплойт включает два файла:

  • upload.jsp: Обрабатывает загрузку файлов на сервер.

  • hello.jsp: Содержит код для выполнения произвольных команд (например, calc.exe).

Код hello.jsp:

<%@ page import="java.io.*" %>  
<!DOCTYPE html>  
<html>  
<body>  
    <%  
        Process process = Runtime.getRuntime().exec("cmd /c start calc.exe");  
        out.println("Calculator executed.");  
    %>  
</body>  
</html>  

Этот код использует Runtime.getRuntime().exec() для выполнения системных команд. При успешной загрузке файла атакующий может обращаться к нему через URL, активируя выполнение кода[citation:Приведенный пользователем код].

Пример 2: Python-скрипт для массовой атаки

Скрипт ApachTomcat_CVE-2024-50379_ConditionalCompetitionToRce.py использует многопоточность для создания race condition:

  • PUT-запросы: Отправляются для создания файлов aa.Jsp и bb.Jsp.

  • GET-запросы: Проверяют наличие aa.jsp и bb.jsp (разный регистр).

Ключевой фрагмент:

with concurrent.futures.ThreadPoolExecutor(max_workers=10000) as executor:  
    for _ in range(10000):  
        futures.append(executor.submit(requests.put, target_url_put1, data=payload_put))  
        futures.append(executor.submit(requests.get, target_url_get1))  

Массовая отправка запросов увеличивает шансы на успешную подмену файла до момента компиляции[citation:Приведенный пользователем код].


Способы защиты

  1. Обновление версии Tomcat:

    • Установите версии 9.0.98, 10.1.34 или 11.0.2, где устранена уязвимость11012.

  2. Конфигурационные меры:

    • Установите параметр readonly в true в файле web.xml:

      <init-param>  
          <param-name>readonly</param-name>  
          <param-value>true</param-value>  
      </init-param>  
    • Отключите метод PUT в настройках сервера.

  3. Использование case-sensitive FS: Развертывание Tomcat на Linux с файловыми системами, чувствительными к регистру.

  4. Дополнительные настройки Java:

    • Для Java 8 и 11: Установите -Dsun.io.useCanonCaches=false.

    • Для Java 17: Убедитесь, что sun.io.useCanonCaches не установлен в true.

Алексей Черемных Алексей Черемных
94