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

Уязвимость pypdf: как один PDF может «подвесить» обработку файлов

pypdf — одна из самых распространённых библиотек для работы с PDF в языке Python: на ней держатся десятки онлайн-конвертеров, генераторов отчётов и сервисов, которые объединяют и режут документы на сервере. 9 июля 2026 в ней раскрыли очередную уязвимость: специально собранный PDF при обработке заставляет библиотеку зациклиться — процесс зависает, а процессор уходит в полку.

Коротко: CVE-2026-54651 в pypdf (до версии 6.13.1) — «бесконечный цикл». PDF, в котором нити-статьи ссылаются друг на друга по кругу, при слиянии файлов заставляет библиотеку крутить один и тот же обход без выхода: процесс зависает, процессор грузится на 100%. Это отказ в обслуживании, а не кража данных. Лечится обновлением до 6.13.1 или новее.

11 июля 2026 Редакция LoadFile Чтение 5 мин
Иконка PDF в кольце зацикленных стрелок и застывшая шестерёнка — бесконечный цикл обработки файла
Содержание
  1. Что произошло
  2. Почему «бесконечный цикл» опасен
  3. Не одна брешь, а серия
  4. Кого это касается
  5. Что делать
  6. Источники

Что произошло

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

9 июля 2026 для pypdf опубликовали уязвимость CVE-2026-54651. Проблема относится к классу CWE-835 — «цикл с недостижимым условием выхода», то есть к бесконечному циклу. По данным базы NVD, брешь получила рейтинг CVSS 5.5 — средний уровень: она не даёт выполнить чужой код и не раскрывает данные, но приводит к отказу в обслуживании.

Механизм такой. В PDF есть служебная конструкция «нити-статьи» (article threads) — она связывает блоки текста в единый поток чтения. Если во вредоносном файле такие нити ссылаются друг на друга по кругу, функция _add_articles_thread в модуле pypdf/_writer.py при слиянии документов начинает обходить эту цепочку и не может из неё выйти. Обход повторяется бесконечно: поток исполнения зависает, а нагрузка на процессор поднимается до 100%.

!
Опасность — в зависании, а не во взломе

Уязвимость не позволяет прочитать чужие файлы или запустить произвольный код. Её итог — denial of service: сервис, который принимает и обрабатывает чужие PDF, перестаёт отвечать, пока процесс не будет принудительно снят.

Почему «бесконечный цикл» опасен

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

Для веб-сервиса это выглядит буднично и оттого коварно. Пользователь загружает PDF «на объединение» или «на извлечение текста», рабочий процесс берёт файл в обработку — и больше не возвращается. Один такой запрос занимает ядро процессора целиком; несколько запросов подряд способны исчерпать пул обработчиков и уложить сервис для всех остальных. Классический сценарий отказа в обслуживании через безобидный на вид документ.

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

Не одна брешь, а серия

CVE-2026-54651 — не единичный случай, а часть целой волны похожих исправлений, которую pypdf выпускал в течение июня 2026 года. Все они об одном: недоверенный PDF не должен приводить к зависанию.

  • CVE-2026-54531 (исправлено в версии 6.13.0) — бесконечный цикл при обработке оглавления и закладок в записывающем модуле.
  • CVE-2026-54530 — зацикливание при извлечении текста в режиме сохранения разметки, когда библиотека собирает данные о шрифтах.
  • Версии 6.14.0–6.14.2 (22–23 июня 2026) добавили ещё несколько защит: общий лимит на запрашиваемый размер изображения и обрыв бесконечных циклов при разборе неполных встроенных картинок в кодировках ASCII85 и ASCIIHex.

Картина типична для форматов-контейнеров вроде PDF: они допускают перекрёстные ссылки между объектами, а значит — и «петли». Устойчивый разбор такого формата требует, чтобы каждая рекурсия и каждый обход имели жёсткий предохранитель. Ту же природу имеют недавние проблемы в других инструментах работы с файлами — от парсеров ClamAV до библиотеки node-tar.

i
Файловый контекст

PDF — формат с богатой внутренней структурой: страницы, шрифты, изображения и служебные объекты ссылаются друг на друга. Что это за формат и чем его открыть на разных системах, разбираем в гайде чем открыть PDF.

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

Обычному пользователю, который открывает PDF в Acrobat, Foxit или браузере, эта конкретная уязвимость напрямую не грозит — pypdf не десктопная «читалка», а инструмент для разработчиков. Риск сосредоточен на стороне серверов и сервисов.

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

Что делать

  1. Обновите pypdf до версии 6.13.1 или новее — она закрывает CVE-2026-54651. Ещё лучше перейти на актуальную ветку 6.14.x, где закрыта вся серия смежных «зацикливаний». Установленную версию покажет команда pip show pypdf.
  2. Проверьте зависимости проекта: pypdf часто «подтягивается» транзитивно через другие пакеты. Прогоните pip list или pip-audit, чтобы не осталось старой версии в дереве.
  3. Если обновиться прямо сейчас нельзя, ограничьте обработку недоверенных PDF: ставьте тайм-аут на операцию и запускайте разбор в отдельном процессе, который можно принудительно снять по превышению времени.
  4. Не смешивайте в одном рабочем процессе доверенные и пользовательские файлы без изоляции и лимитов на ресурсы.

Тема безопасного приёма и разбора чужих файлов на сервере шире одной библиотеки. Общие принципы — тайм-ауты, лимиты, изоляция и недоверие к структуре входных данных — собраны в разделе безопасность файлов. Близкие сюжеты этих недель: Foxit устранил около 20 уязвимостей в PDF Reader и Editor — там речь уже о выполнении кода через вредоносный PDF на стороне пользователя.

Источники

Данные приведены на 11 июля 2026 по материалам базы NVD и GitHub Security Advisory. Рейтинг CVSS, номера CVE и версий указаны по первоисточникам; ряд агрегаторов приводит для CVE-2026-54651 близкую оценку 6.2.

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