Ваш сервер только что “показал” сканы документации. Как обычный PDF-генератор может сдать все секреты компании

Ваш сервер только что “показал” сканы документации. Как обычный PDF-генератор может сдать все секреты компании

Исследователи нашли 13 критических багов в библиотеках для генерации PDF файлов, которыми пользуются тысячи сайтов.

image

Исследователи из команды PT Swarm обнаружили тринадцать уязвимостей в популярных библиотеках для генерации PDF-файлов. Казалось бы, что может пойти не так при простой конвертации HTML в PDF? Оказывается, очень многое.

Ежедневно тысячи веб-сервисов создают PDF-документы — счета, договоры, отчёты. Разработчики относятся к этому как к рутинной технической задаче, но на практике именно здесь пересекается граница доверия. Рендерер парсит HTML, загружает внешние ресурсы, обрабатывает шрифты, SVG и изображения, а иногда имеет доступ к сети и файловой системе сервера. При этом опасное поведение может возникать по умолчанию, без каких-либо явных настроек или предупреждений. Этого достаточно, чтобы безобидный на первый взгляд конвертер превратился в инструмент для атак на серверную инфраструктуру.

Сгенерированный нейросетью скан паспорта вымышленной страны, использованный для демонстрации утечки конфиденциальных данных

Специалисты провели детальный анализ семи популярных библиотек на PHP, JavaScript и Java: TCPDF, html2pdf, jsPDF, mPDF, snappy, dompdf и OpenPDF. Помимо тринадцати уязвимостей, команда продемонстрировала семь случаев намеренного опасного поведения библиотек и выявила шесть потенциальных ошибок конфигурации. Среди обнаруженных проблем — несанкционированный доступ к файлам на сервере, небезопасная десериализация данных, подделка серверных запросов (SSRF) и отказ в обслуживании.

Генерация PDF-документов широко используется в электронной коммерции, финтехе, логистике и SaaS-решениях. Такие сервисы часто развёрнуты внутри периметра безопасности, рядом с конфиденциальными данными, где сетевые ограничения мягче. Это означает, что даже незначительный баг в рендерере может перерасти в серьёзный инцидент: утечку документов, секретов или внутренних URL-адресов.

Особенно показательна история с библиотекой TCPDF — одной из самых популярных PHP-библиотек для создания PDF. В версии 6.8.0 исследователи нашли уязвимость, позволяющую получить доступ к произвольным изображениям на сервере через манипуляции с путями в SVG-файлах. Атакующий мог встроить в HTML специально сформированный SVG с тегом image и атрибутом xlink:href, содержащим относительный путь вроде ../../../../../../tmp/user_files/user_1/private_image.png. Библиотека не проверяла путь должным образом и послушно встраивала приватное изображение в итоговый PDF.

PDF-файл с приватными изображениями пользователя, полученными через уязвимость path traversal

Разработчик выпустил исправление в версии 6.8.1, добавив проверку на наличие последовательности ../ в пути. Однако эксперты быстро нашли обход — достаточно было закодировать символы в URL-формате (..%2f вместо ../), и защита переставала работать. Дело в том, что библиотека сначала проверяла путь, а затем декодировала его функцией urldecode. Пришлось выпускать новый патч в версии 6.9.1 с улучшенной функцией isRelativePath, которая учитывает различные варианты кодирования.

В той же библиотеке TCPDF обнаружилась ещё более серьёзная проблема — уязвимость десериализации. Класс TCPDF содержит магический метод _destruct, который при уничтожении объекта удаляет временные файлы из массива imagekeys. Если атакующий мог передать сериализованную строку в функцию unserialize, он получал возможность удалить произвольный файл с сервера — достаточно было указать нужный путь в поле imagekeys. Уязвимость исправили в версии 6.9.3, добавив проверку на принадлежность файла библиотеке по подстроке _tcpdf в имени.

Для библиотеки spipu/html2pdf, которая внутри использует TCPDF, нашли аналогичную уязвимость, но эксплуатируемую через Phar-архивы. Phar — это специальный формат упаковки PHP-приложений, и некоторые функции вроде file_exists при обработке пути phar://... автоматически десериализуют метаданные архива. Атакующий мог загрузить на сервер Phar-архив под видом изображения, а затем через тег cert с атрибутом src="phar:///path/to/archive.png" спровоцировать десериализацию и удаление файлов. Уязвимость актуальна для PHP версий ниже 8.0 и была исправлена в html2pdf версии 5.3.1.

В html2pdf также нашли целую серию SSRF-уязвимостей. Библиотека позволяла выполнять запросы к внутренним сервисам через теги link, img и CSS-свойство background: url(). Разработчик добавил интерфейс SecurityInterface с методом checkValidPath для фильтрации ресурсов, но исследователи обнаружили, что в некоторых сценариях запрос уходил до вызова проверки. Окончательно проблемы устранили только в версии 5.3.2.

Библиотека jsPDF для JavaScript оказалась уязвима к атакам типа ReDoS — отказ в обслуживании через регулярные выражения. В версии 3.0.0 специально сформированная строка с повторяющимися последовательностями charset=s заставляла приложение обрабатывать данные более 39 секунд, полностью загружая одно ядро процессора. Уязвимости присвоили идентификатор CVE-2025-29907 и исправили в версии 3.0.1.

Загрузка процессора на 100% при эксплуатации уязвимости ReDoS в библиотеке jsPDF

Однако при анализе исправления эксперты нашли ещё одну проблему: некорректное преобразование типов данных приводило к тому, что переменная позиции в цикле становилась отрицательной (-1711276032), и цикл фактически никогда не достигал условия выхода. Обработка строки data:/,aaaaaaa занимала более пяти минут. Этой уязвимости присвоили идентификатор CVE-2025-57810 и устранили в версии 3.0.2.

Некоторые библиотеки официально не считают описанное поведение уязвимостью. Разработчик TCPDF заявил, что SSRF через тег img «выходит за рамки ответственности библиотеки». Авторы mPDF и OpenPDF прямо указывают в документации, что библиотека обрабатывает входные данные как есть, без валидации, и ответственность за санитизацию лежит на программисте. На практике это означает, что при неосторожном использовании такие инструменты позволяют встраивать в PDF локальные файлы сервера или выполнять запросы к внутренним сервисам сети.

Отдельного внимания заслуживают ошибки конфигурации. В dompdf включение опции isPhpEnabled позволяет выполнять PHP-код прямо из HTML-разметки — фактически это удалённое выполнение произвольного кода. Достаточно передать в библиотеку HTML вида <script type="text/php">shell_exec("id");</script>, и команда выполнится на сервере. Опция isRemoteEnabled разрешает загрузку внешних ресурсов и открывает путь для SSRF-атак, а неправильно настроенный setChroot("/") снимает все ограничения на чтение локальных файлов.

В mPDF опция allowAnnotationFiles даёт возможность прикреплять к PDF произвольные файлы с сервера через тег annotation, включая /etc/passwd. Опция showWatermarkImage позволяет использовать любой локальный файл в качестве водяного знака. В библиотеке snappy (обёртка над wkhtmltopdf) флаг enable-local-file-access открывает доступ к локальной файловой системе.

Разработчикам рекомендуется своевременно обновлять используемые библиотеки, внимательно изучать их документацию на предмет опасных настроек и всегда санитизировать пользовательский ввод перед генерацией PDF. Все найденные уязвимости были исправлены производителями в течение 2025 года.