Новости
pypdf 6.13.1: как один PDF зацикливал библиотеку разбора
Ещё один случай, когда «данные» кладут обработчик: специально собранный PDF заставлял библиотеку крутиться в бесконечном цикле.
Многие сайты умеют выдавать PDF «на лету» — счёт, договор, билет, отчёт. Под капотом такую страницу в PDF часто превращает библиотека Dompdf: она берёт ваш HTML с картинками и собирает из него готовый документ. Оказалось, что через безобидную на вид картинку или SVG в этот HTML можно и уронить сервер, и подсмотреть, какие файлы на нём лежат.
Коротко: в PHP-библиотеке Dompdf, которая генерирует PDF из HTML, закрыли три уязвимости. Огромное или «шумное» изображение исчерпывает память и роняет процесс (CVE-2026-59941, CVE-2026-59942), а вредоносный SVG с ссылкой file:// позволяет узнать, есть ли на сервере тот или иной файл (CVE-2026-59943). Всё исправлено в версии 3.1.6 — обновитесь.

В Dompdf — одной из самых популярных PHP-библиотек для генерации PDF из HTML — раскрыли сразу три уязвимости. Все они закрыты в релизе 3.1.6; уязвимы версии 3.1.5 и старше. Патч вышел в конце июля 2026 года, а подробные разборы разошлись по базам уязвимостей и профильным изданиям в начале августа. Записи заведены в CVE-каталог и в трекеры безопасности GitLab, Debian и NVD.
Объединяет все три бага одно: опасность приезжает не «извне», а внутри обычного контента страницы — картинки или векторного SVG, — который сайт послушно отдаёт библиотеке, чтобы сверстать PDF. То есть уязвим тот самый шаг, где HTML с изображениями становится файлом-документом.
Dompdf — это движок, который принимает HTML и CSS и на выходе отдаёт файл PDF. Его встраивают в веб-приложения, чтобы формировать документы прямо на сервере: PDF-счета и накладные, электронные билеты, справки, отчёты, сертификаты. Пользователь нажимает «Скачать PDF» — а под капотом Dompdf рендерит заранее свёрстанную HTML-страницу в документ.
Ключевой момент — что именно кладут в этот HTML. Часто туда попадают данные, которые ввёл сам пользователь: имя, адрес, комментарий, загруженная аватарка или логотип. Если приложение вставляет пользовательский ввод в шаблон без ограничений, злоумышленник может подсунуть «начинку», от которой генератор споткнётся. Формально это данные для вёрстки, а фактически — управляющий сигнал для парсера изображений.
Генерация PDF — это чтение одних файлов (картинок, SVG) и запись другого (документа). Как и при обычном разборе PDF в библиотеке pypdf или спрятанном вредоносе в SVG-картинках, проблема не в самом формате, а в том, как программа обрабатывает присланное содержимое.
Две из трёх дыр — это отказ в обслуживании (DoS): сервер не взламывают, а заставляют съесть всю память и упасть. Третья — утечка информации о файловой системе. Разберём по порядку.
| CVE | Тип | Как срабатывает |
|---|---|---|
| CVE-2026-59941 | DoS (память) | Картинка BMP: библиотека доверяет размерам из заголовка файла и не ограничивает произведение ширины на высоту до конвертации через GD. По данным разбора, запрос всего в 169 байт может раздуть рендер примерно до 412 МБ памяти — усиление около 12 раз. |
| CVE-2026-59942 | DoS (память) | Одно изображение с гигантскими размерами (например, 30 000 × 30 000 пикселей), закодированное в base64 и обёрнутое в CSS. Внутренние проверки обходятся «шумной» картинкой; при рендере выделяется около 1,2 ГБ, и процесс PHP падает по нехватке памяти (OOM). |
| CVE-2026-59943 | Утечка данных | Встроенный SVG со ссылкой file:// на локальный путь. Dompdf пытается прочитать файл: если он есть — выходит «битая» картинка, если нет — пустое место и предупреждение. По этой разнице атакующий выясняет, какие файлы и папки есть на сервере. |
У двух DoS-багов общий корень — «доверься размеру из заголовка». Формат BMP или закодированная картинка сообщают о своих размерах сами, а библиотека берёт эти цифры на веру и заранее готовит под них память. Достаточно объявить огромное полотно — и одна маленькая строчка HTML превращается в гигабайты выделенной памяти. У SVG-бага корень другой: обработчик векторной графики соглашается лезть по ссылке file:// в локальную файловую систему, а наблюдаемая разница в выводе выдаёт наличие файла. Сами данные файлов при этом не утекают — раскрывается только их присутствие, что упрощает разведку перед следующей атакой.
Под ударом — веб-приложения на PHP, которые генерируют PDF из HTML через Dompdf версии ниже 3.1.6 и вставляют в этот HTML данные или изображения от пользователя. Практически это формы «скачать документ», кабинеты, сервисы выставления счетов и любые публичные эндпоинты, отдающие PDF по запросу.
Последствия зависят от бага. DoS-уязвимости позволяют одним-двумя запросами исчерпать память и уронить обработчик — сервис перестаёт отвечать, а на shared-хостинге страдают и соседние сайты. Утечка через SVG сама по себе не крадёт данные, но помогает атакующему составить карту файловой системы и найти цели для дальнейших действий. Признаков массовой эксплуатации в дикой природе на момент публикации нет, но публичные разборы всегда снижают порог входа.
composer update dompdf/dompdf, затем проверьте установленную версию.<img> и SVG в исходный HTML документа.file:// и фильтруйте <image> с локальными путями внутри SVG.memory_limit и таймауты в PHP не устранят баг, но не дадут одному запросу утянуть за собой весь сервер.open_basedir и запуск рендера в отдельном ограниченном окружении уменьшают ущерб, если вредоносный контент всё-таки дойдёт до движка.Любой файл, который программа «разбирает» — картинку, SVG, документ, — стоит воспринимать как недоверенный ввод, а не как безобидные данные. О том, какие форматы чаще всего используют для атак, — в карте опасных расширений, а базовые правила проверки — в разделе безопасность файлов.
Нет. Уязвимости касаются серверной генерации PDF: под ударом сайты и приложения, которые используют Dompdf. Для обычного пользователя, который открывает готовый PDF, риска в этой истории нет.
Это снижает риск, но не закрывает его: вредоносное изображение или SVG можно передать и через другие поля, которые попадают в HTML документа. Надёжная мера — обновиться до Dompdf 3.1.6, а фильтрация ввода идёт дополнительной защитой.
Нет, дело не в форматах. Проблема в конкретной библиотеке и в том, как она обрабатывает размеры картинок и локальные ссылки. Те же PDF и SVG в других инструментах ведут себя нормально.