
POC для CVE-2026-24688
Этот репозиторий содержит код proof-of-concept для воспроизведения CVE-2026-24688.
Критическая уязвимость типа «отказ в обслуживании» (Denial of Service) в логике pypdf, отвечающей за разбор оглавления (закладок). При обработке PDF-файла с циклическими ссылками в оглавлении парсер входит в бесконечный цикл, который непрерывно выделяет память, потребляя сотни МБ памяти в секунду на моей машине (TM), и приводит к полному краху системы.
Это системный уровень DoS, а не просто зависание приложения.
malicious_circular_outline.pdf - эксплуатирующий PDF с циклическим оглавлением (754 байта)create_malicious_pdf.py - скрипт для генерации эксплуатирующего PDFsimple_read_pdf.py - простой тестовый скрипт для воспроизведения уязвимостиtest_pypdf.sh - автоматический тестовый скрипт (устанавливает pypdf и запускает тест)README.md - этот файлПРЕДУПРЕЖДЕНИЕ: Эти тесты могут обрушить вашу систему, если вы не следите за потреблением памяти и не отмените их вовремя.
# Run the automated test script (with timeout protection)
chmod +x test_pypdf.sh
./test_pypdf.sh
# This will:
# 1. Install the vulnerable version of pypdf
# 2. Run test with 15-second timeout
# 3. Show memory consumption behavior
# Install pypdf (vulnerable version 6.6.0)
pip install "pypdf==6.6.0"
# Run with timeout
timeout 10s python3 simple_read_pdf.py malicious_circular_outline.pdf
# Install pypdf (vulnerable version 6.6.0)
pip install "pypdf==6.6.0"
# Run without timeout
python3 simple_read_pdf.py malicious_circular_outline.pdf
def _get_outline(self, node, outline=None):
while True: # ❌ NO cycle detection!
outline_obj = self._build_outline_item(node)
if outline_obj:
outline.append(outline_obj) # ❌ Heap allocation in loop!
if "/Next" not in node:
break
node = node["/Next"] # ❌ Follows circular references
Корневая причина: нет множества посещённых узлов, нет ограничения итераций, непрерывное выделение памяти
Реальный тест:
Характеристики атаки:
Исправлено в версии 6.6.2