
Доказательство концепции эксплуатации для CVE-2026-24688, уязвимости типа «отказ в обслуживании» в разборе структуры документа в pypdf. Включает генератор вредоносных PDF-файлов и скрипты воспроизведения, демонстрирующие исчерпание памяти и сбой системы.
Этот репозиторий содержит код proof of concept для эксплуатации CVE-2026-24688.
Критическая уязвимость отказа в обслуживании в логике парсинга структуры документа (закладок) в pypdf. При обработке PDF-файла с циклическими ссылками в структуре документа парсер входит в бесконечный цикл, который непрерывно выделяет память, потребляя сотни МБ памяти в секунду на моей машине (TM), что приводит к полному краху системы.
Это DoS на уровне системы, а не просто зависание приложения.
malicious_circular_outline.pdf - Эксплуатирующий PDF-файл с циклической структурой документа (754 байта)create_malicious_pdf.py - Скрипт для генерации эксплуатирующего PDF-файлаsimple_read_pdf.py - Простой тестовый скрипт для воспроизведения уязвимостиtest_pypdf.sh - Автоматизированный тестовый скрипт (устанавливает pypdf и запускает тест)README.md - Этот файлПРЕДУПРЕЖДЕНИЕ: Эти тесты могут привести к краху вашей системы, если вы не будете следить за потреблением памяти и не остановите их вовремя.
# Запуск автоматизированного тестового скрипта (с защитой по таймауту)
chmod +x test_pypdf.sh
./test_pypdf.sh
# Это приведет к:
# 1. Установке уязвимой версии pypdf
# 2. Запуску теста с 15-секундным таймаутом
# 3. Отображению поведения потребления памяти
# Установка pypdf (уязвимая версия 6.6.0)
pip install "pypdf==6.6.0"
# Запуск с таймаутом
timeout 10s python3 simple_read_pdf.py malicious_circular_outline.pdf
# Установка pypdf (уязвимая версия 6.6.0)
pip install "pypdf==6.6.0"
# Запуск без таймаута
python3 simple_read_pdf.py malicious_circular_outline.pdf
def _get_outline(self, node, outline=None):
while True: # ❌ Нет обнаружения циклов!
outline_obj = self._build_outline_item(node)
if outline_obj:
outline.append(outline_obj) # ❌ Выделение памяти в цикле!
if "/Next" not in node:
break
node = node["/Next"] # ❌ Следует по циклическим ссылкам
Основная причина: Нет набора посещенных узлов, нет ограничения итераций, непрерывное выделение памяти
Реальный тест:
Характеристики атаки:
Исправлено в версии 6.6.2