Новости · Безопасность

pypdf: пять уязвимостей DoS с CVSS 8.7, патчи уже в 6.18.1 и 6.19.0

30 сентября — 1 октября 2026 в базах CVE опубликовали сразу пять уязвимостей отказа в обслуживании в pypdf — популярной «чистой» Python-библиотеке для работы с PDF. Все пять получили оценку CVSS 8.7: специально собранный PDF-файл заставляет библиотеку потреблять аномально много памяти или процессорного времени при обработке шрифтов, потоков сжатия FlateDecode, вложений или меток страниц. Уязвимости уже закрыты — в версиях 6.18.1 (11 сентября) и 6.19.0 (16 сентября).

Коротко: в pypdf нашли 5 DoS-уязвимостей (CVE-2026-102995 — CVE-2026-102999, CVSS 8.7): крафтованный PDF с «кривыми» шрифтами, /FlateDecode-потоком, множеством вложений или нестандартными буквенными метками страниц заставляет библиотеку обрабатывать его аномально долго или сжирать память. Патчи вышли ДО публикации CVE — обновитесь до pypdf 6.19.0 командой pip install --upgrade pypdf.

1 октября 2026 Редакция Loadfile Чтение 6 мин
Красный щит с восклицательным знаком поверх стопки документов PDF — уязвимости отказа в обслуживании в pypdf
Содержание
  1. Что случилось
  2. Пять CVE по пунктам
  3. Почему PDF-парсеры так часто ловят DoS
  4. Кого это касается
  5. Что делать
  6. Источники

Что случилось

pypdf — одна из самых используемых Python-библиотек для работы с PDF: объединение и разрезание файлов, извлечение текста, работа с аннотациями, формами и вложениями, без внешних зависимостей вроде Poppler или MuPDF. Именно поэтому она массово встроена в серверные пайплайны: онлайн-конвертеры, системы документооборота, RAG-системы и агенты, которые читают присланные пользователями документы.

30 сентября — 1 октября 2026 в публичных базах (NVD, GitHub Security Advisories) появились пять новых записей: CVE-2026-102995, CVE-2026-102996, CVE-2026-102997, CVE-2026-102998 и CVE-2026-102999. Все относятся к классу CWE-400 (неконтролируемое потребление ресурсов) и CWE-407 (неэффективная алгоритмическая сложность), и всем присвоена одинаковая оценка CVSS 8.7 (High). Разработчики pypdf закрыли проблемы заранее: часть — в версии 6.18.1 от 11 сентября, остальные — в 6.19.0 от 16 сентября. Публикация CVE в конце сентября — это раскрытие уже исправленных уязвимостей задним числом, а не новая атака «в моменте».

Пять CVE по пунктам

Общий сценарий атаки одинаков для всех пяти: приложение получает PDF от ненадёжного источника (загрузка пользователем, вложение письма, документ из внешней системы) и обрабатывает его через pypdf. Файл специально сконструирован так, чтобы один из внутренних парсеров библиотеки делал на порядки больше работы, чем обычный документ того же размера.

  • CVE-2026-102995 — в /ToUnicode-отображении шрифта размещены аномально большие токены исходного или целевого кода. Функция parse_bfchar в _cmap.py декодирует и хранит эти значения целиком при извлечении текста — память растёт неконтролируемо.
  • CVE-2026-102996 — простой TrueType- или Type1-шрифт с чрезмерно большим массивом /Widths. Метод Font._collect_tt_t1_character_widths обрабатывает записи far за пределами 256 кодов символов, значимых для простого шрифта.
  • CVE-2026-102997 — частично повреждённый поток /FlateDecode заставляет декомпрессию работать побайтово вместо блочной — на крупном потоке это многократно увеличивает время обработки.
  • CVE-2026-102998 — отказ в обслуживании через обработку полей форм (AcroForm) с избыточной вложенностью или количеством объектов.
  • CVE-2026-102999 — PDF с большим числом вложённых файлов. Словарный API для работы с вложениями в _doc_common.py заново парсит весь список вложений при каждом обращении к карте «имя файла → объект» — для документа с тысячами вложений это квадратичный рост времени.
i
Что объединяет все пять

Ни одна уязвимость не даёт выполнение произвольного кода или доступ к данным — это исключительно отказ в обслуживании (DoS). Эффект на практике: процесс, который обрабатывает такой PDF, занимает CPU или память на неопределённо долгое время, не завершаясь ошибкой. В однопоточном сервисе без тайм-аутов это может остановить обработку остальных документов в очереди.

Почему PDF-парсеры так часто ловят DoS

Формат PDF допускает множество необязательных и редко используемых конструкций: нестандартные шрифтовые кодировки, вложенные потоки сжатия, произвольное число вложений, альтернативные схемы нумерации страниц. Спецификация не ограничивает жёстко размеры этих структур — ограничения оставлены на усмотрение реализации. Если библиотека пишет код «для обычного документа» и не проверяет верхние границы, специально собранный файл с экстремальными значениями полей превращает линейную операцию в квадратичную или вовсе неограниченную по времени.

pypdf в 2026 году системно закрывал именно такие баги: ранее уже выходили патчи против зацикливания при обработке циклических нитей-статей и некорректного обхода дерева объектов в версии 6.16.0. Нынешние пять CVE продолжают тот же паттерн, но на других участках кода — шрифты, FlateDecode, AcroForm, вложения. Разработчики описывают исправления как «дальнейшее ограничение восстановления FlateDecode», «лимит числа записей для /Widths» и «ограничение длины токенов в parse_bfchar» — то есть именно добавление верхних границ там, где их не хватало.

Кого это касается

В зоне риска — любое серверное приложение, которое принимает PDF-файлы от третьих лиц и обрабатывает их через pypdf без версии 6.19.0 или новее: онлайн-конвертеры и инструменты для слияния/разбора PDF, системы документооборота и ERP с приёмом вложений, RAG-пайплайны и AI-агенты, которые индексируют присланные пользователями документы, почтовые шлюзы с автоматическим извлечением текста из вложений.

Десктопные сценарии, где пользователь сам открывает собственные файлы, затронуты меньше — злоумышленнику нужно, чтобы жертва (человек или автоматический процесс) обработала именно его файл. Больше о том, какие форматы требуют повышенной осторожности при автоматической обработке — в разделе безопасность файлов.

Что делать

  1. Обновите pypdf до версии 6.19.0 или новее: pip install --upgrade pypdf. Проверить установленную версию — pip show pypdf.
  2. Если обновить немедленно нельзя — хотя бы до 6.18.1, которая закрывает три из пяти CVE (шрифты и FlateDecode); CVE-2026-102998 и CVE-2026-102999 остаются непатченными до 6.19.0.
  3. Для сервисов, принимающих PDF от пользователей: независимо от версии библиотеки держите тайм-аут на операцию обработки и выполняйте её в изолированном процессе с лимитом памяти — это защищает и от будущих, пока неизвестных вариантов той же проблемы.
  4. Проверьте транзитивные зависимости: pypdf часто подтягивается другими пакетами. pip list | grep pypdf покажет версию в окружении, pip-audit — сверит её с базой известных уязвимостей.

Источники

  • GitHub Security Advisory по CVE-2026-102999 (официальный репозиторий pypdf) — github.com/py-pdf/pypdf
  • Список релизов pypdf с описанием изменений 6.18.1 и 6.19.0 — github.com/py-pdf/pypdf/releases
  • Карточки уязвимостей CVE-2026-102995 — CVE-2026-102999 — strix.ai

Данные приведены на 1 октября 2026 по материалам официального репозитория pypdf на GitHub и независимых баз уязвимостей. Версии 6.18.1 и 6.19.0 опубликованы 11 и 16 сентября 2026 соответственно, записи CVE — 30 сентября — 1 октября 2026.

Читайте также