Новости
pypdf 6.16.0: аннотации PDF поворачиваются на произвольный угол
13 августа вышел pypdf 6.16.0: аннотации PDF поворачиваются на произвольный угол, добавлена защита от зависания при циклических деревьях объектов PDF.
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.

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 в конце сентября — это раскрытие уже исправленных уязвимостей задним числом, а не новая атака «в моменте».
Общий сценарий атаки одинаков для всех пяти: приложение получает PDF от ненадёжного источника (загрузка пользователем, вложение письма, документ из внешней системы) и обрабатывает его через pypdf. Файл специально сконструирован так, чтобы один из внутренних парсеров библиотеки делал на порядки больше работы, чем обычный документ того же размера.
parse_bfchar в _cmap.py декодирует и хранит эти значения целиком при извлечении текста — память растёт неконтролируемо./Widths. Метод Font._collect_tt_t1_character_widths обрабатывает записи far за пределами 256 кодов символов, значимых для простого шрифта./FlateDecode заставляет декомпрессию работать побайтово вместо блочной — на крупном потоке это многократно увеличивает время обработки._doc_common.py заново парсит весь список вложений при каждом обращении к карте «имя файла → объект» — для документа с тысячами вложений это квадратичный рост времени.Ни одна уязвимость не даёт выполнение произвольного кода или доступ к данным — это исключительно отказ в обслуживании (DoS). Эффект на практике: процесс, который обрабатывает такой PDF, занимает CPU или память на неопределённо долгое время, не завершаясь ошибкой. В однопоточном сервисе без тайм-аутов это может остановить обработку остальных документов в очереди.
Формат PDF допускает множество необязательных и редко используемых конструкций: нестандартные шрифтовые кодировки, вложенные потоки сжатия, произвольное число вложений, альтернативные схемы нумерации страниц. Спецификация не ограничивает жёстко размеры этих структур — ограничения оставлены на усмотрение реализации. Если библиотека пишет код «для обычного документа» и не проверяет верхние границы, специально собранный файл с экстремальными значениями полей превращает линейную операцию в квадратичную или вовсе неограниченную по времени.
pypdf в 2026 году системно закрывал именно такие баги: ранее уже выходили патчи против зацикливания при обработке циклических нитей-статей и некорректного обхода дерева объектов в версии 6.16.0. Нынешние пять CVE продолжают тот же паттерн, но на других участках кода — шрифты, FlateDecode, AcroForm, вложения. Разработчики описывают исправления как «дальнейшее ограничение восстановления FlateDecode», «лимит числа записей для /Widths» и «ограничение длины токенов в parse_bfchar» — то есть именно добавление верхних границ там, где их не хватало.
В зоне риска — любое серверное приложение, которое принимает PDF-файлы от третьих лиц и обрабатывает их через pypdf без версии 6.19.0 или новее: онлайн-конвертеры и инструменты для слияния/разбора PDF, системы документооборота и ERP с приёмом вложений, RAG-пайплайны и AI-агенты, которые индексируют присланные пользователями документы, почтовые шлюзы с автоматическим извлечением текста из вложений.
Десктопные сценарии, где пользователь сам открывает собственные файлы, затронуты меньше — злоумышленнику нужно, чтобы жертва (человек или автоматический процесс) обработала именно его файл. Больше о том, какие форматы требуют повышенной осторожности при автоматической обработке — в разделе безопасность файлов.
pip install --upgrade pypdf. Проверить установленную версию — pip show pypdf.pip list | grep pypdf покажет версию в окружении, pip-audit — сверит её с базой известных уязвимостей.Данные приведены на 1 октября 2026 по материалам официального репозитория pypdf на GitHub и независимых баз уязвимостей. Версии 6.18.1 и 6.19.0 опубликованы 11 и 16 сентября 2026 соответственно, записи CVE — 30 сентября — 1 октября 2026.