Модель угроз для движка
Эта страница задаёт модель угроз для ядра NextPDF. Здесь перечислены классы атак, которые движок считает входящими в область рассмотрения при обработке ввода, контролируемого злоумышленником: Hypertext Markup Language (HTML), Cascading Style Sheets (CSS), Scalable Vector Graphics (SVG), шрифты, изображения и существующие файлы Portable Document Format (PDF). Здесь также указана позиция по умолчанию для каждой возможности доступа к внешним ресурсам и приведены ссылки на встроенные защиты, снижающие риск для каждого класса.
Границы. Модель угроз фиксирует рассмотренные угрозы и применённые к ним меры защиты. Она не утверждает, что уязвимости отсутствуют. Отсутствие класса в списке не доказывает, что его нет; он может находиться за пределами текущей области рассмотрения модели. Прежде чем нереализованные возможности попадут в выпуск, они проходят формальную проверку угроз. Воспринимайте эту страницу как запись осознанного проектирования, а не как доказательство безопасности.
Установка
Заголовок раздела «Установка»composer require nextpdf/core:^3Защиты, описанные здесь, входят в пакет core. Дополнительная зависимость для них не нужна: они включены по умолчанию.
Концептуальный обзор
Заголовок раздела «Концептуальный обзор»Модель следует процессу моделирования угроз Open Worldwide Application Security Project (OWASP) (owasp_threat_modeling#x1.x11.p6): декомпозировать систему по точкам, где недоверенный ввод пересекает границу доверия, перечислить угрозы на каждой границе и зафиксировать меры защиты.
Основная граница доверия движка — приём документов: любое место, где содержимое из внешнего источника — удалённая таблица стилей, источник @font-face, <image href>, встроенный счёт в формате Extensible Markup Language (XML) или PDF для проверки — может заставить движок загрузить, разобрать или распаковать данные. Основной принцип — запрет по умолчанию: каждая возможность доступа к внешним ресурсам отключена, пока вы явно не включите её через объект политики. Так базовый принцип минимальной функциональности из National Institute of Standards and Technology (NIST) SP 800-53 Rev. 5 CM-7 (nist_sp_800_53r5#x4.x182.p14) применяется к движку отрисовки: значение по умолчанию в конструкторе — самая строгая позиция. Включение возможности — ваше явное решение.
Поверхность API
Заголовок раздела «Поверхность API»Модель угроз не является API. Объекты политики, которые её выражают, описаны на страницах модулей. К значимым для доверия точкам входа относятся контракт политики внешних ресурсов (ExternalResourcePolicyInterface, где DefaultExternalResourcePolicy — это политика “запретить всё” по умолчанию), а также защиты Uniform Resource Locator (URL) и XML (UrlValidator, XmlGuard). Эта страница ссылается на их поведение и не дублирует их сигнатуры.
Пример кода — быстрый старт
Заголовок раздела «Пример кода — быстрый старт»Безопасная позиция применяется по умолчанию. Чтобы её получить, код не нужен:
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Html\DefaultExternalResourcePolicy;
// Out of the box: @font-face blocked, @import blocked, background-image// blocked, SVG external refs blocked. A document that tries to fetch a// remote resource gets a system-font fallback or an ignored rule — not an// outbound request.$policy = new DefaultExternalResourcePolicy();Пример кода — рабочая среда
Заголовок раздела «Пример кода — рабочая среда»Включение возможности — осознанное и узко ограниченное действие. Если в рабочей среде необходимо разрешить веб-шрифт, размещённый в сети доставки контента (CDN), по протоколу Hypertext Transfer Protocol Secure (HTTPS), включите его явно и сузьте область действия:
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Html\DefaultExternalResourcePolicy;
// Explicit, scoped opt-in. The HTTPS scheme is required; size and glyph// caps still apply; the URL still passes the SSRF guard before any fetch.$policy = (new DefaultExternalResourcePolicy()) ->withFontFaceAllowed(['https']);Граничные случаи и подводные камни
Заголовок раздела «Граничные случаи и подводные камни»- Нереализованное — это не то же самое, что случайно безопасное. Такие возможности, как CSS
background-image url(), не реализованы, поэтому сейчас у них нет поверхности атаки. При этом они всё равно задокументированы как требующие формальной проверки угроз перед любой будущей реализацией. Отсутствие кода — текущая мера защиты, а не постоянная гарантия. - Перепривязка Domain Name System (DNS) — это подвижная цель.
UrlValidatorразрешает имя узла и возвращает разрешённый адрес Internet Protocol (IP), чтобы вызывающая сторона могла закрепить соединение (CURLOPT_RESOLVE), закрывая окно между проверкой и использованием (TOCTOU) при схеме “сначала проверить, потом загрузить”. Это защита по принципу максимальных усилий, а не абсолютная. Оператор, работающий через разрешающий исходящий прокси, по-прежнему может получить доступ к внутренним узлам, которых библиотека не видит. - Биты разрешений — это не контроль доступа. Документ, который “блокирует копирование”, полагается на то, что программа просмотра будет это соблюдать, а не на принудительное исполнение. Это рассматривается в разделе модель безопасности. Это отмечено здесь, поскольку является распространённым заблуждением о модели угроз.
Производительность
Заголовок раздела «Производительность»Защиты срабатывают на раннем этапе и ограничивают объём работы: защита XML отклоняет объявление типа документа (DOCTYPE) до разбора и ограничивает размер ввода; путь обработки изображений накладывает потолок по мегапикселям и байтам до распаковки; защита URL отклоняет по схеме и узлу до открытия любого сокета. Безопасное значение по умолчанию приводит к отклонённому запросу, а не к медленному.
Примечания по безопасности
Заголовок раздела «Примечания по безопасности»Рассмотренные классы атак и их встроенные меры защиты со ссылками на Common Weakness Enumeration (CWE) и OWASP там, где они применимы:
| Класс угрозы (CWE / OWASP) | Вектор в движке PDF | Встроенная защита |
|---|---|---|
Подделка серверных запросов (SSRF) (OWASP Top 10 2025; owasp_top10_2025#x3.x1.p26) | @font-face/@import/url(), указывающие на 169.254.169.254 или внутренний узел; механизмы загрузки для центра меток времени (TSA), Online Certificate Status Protocol (OCSP) и списка отзыва сертификатов (CRL) | UrlValidator::validateExternalUrl() блокирует частные, зарезервированные диапазоны, диапазоны обратной петли и канально-локальные диапазоны, а также конечные точки облачных метаданных; отклоняет опасные схемы; выполняет DNS-разрешение; и возвращает IP для закрепления соединения |
Внешние сущности XML (XXE) (cwe_top25_2025#x28.x2.p42) | Внешние сущности или DOCTYPE во встроенном XML-счёте или пакете Extensible Metadata Platform (XMP) | XmlGuard::loadXml() применяет LIBXML_NONET, безоговорочно отклоняет любое объявление DOCTYPE, отклоняет запрещённые управляющие символы XML 1.0 и накладывает ограничение на размер ввода |
| Бомба распаковки | Изображение 1×1, скрывающее полезную нагрузку в 100 MP; шрифт Web Open Font Format 2 (WOFF2) чрезмерного размера | Путь обработки изображений накладывает потолок по мегапикселям и ограничение по байтам до распаковки; путь обработки шрифтов ограничивает размер файла и число глифов |
| Обход каталогов | file:///etc/passwd через шрифт или SVG src | Внешние ресурсы запрещены по умолчанию; локальные пути к файлам разрешаются через realpath() по списку разрешённых каталогов, если это явно включено |
| Внедрение содержимого | Сформированная строка, которая выходит за пределы оператора PDF; data:/javascript: в href | Экранирование строк PDF при выводе; список разрешённых схем и очистка href в аннотациях |
В совокупности значения по умолчанию формируют позицию “запретить все внешние ресурсы”: шрифты, @import, background-image и внешние ссылки SVG остаются отключёнными, пока вы не включите их для каждой схемы, как описано в разделе матрица покрытия свойств безопасности, который поддерживается вместе с кодом.
Эта страница документирует рассмотренные угрозы. Она не является отчётом о тестировании на проникновение и не утверждает, что перечисленные меры защиты полны или что никакой другой класс уязвимостей не применим.
Соответствие
Заголовок раздела «Соответствие»Это не профиль соответствия. Модель угроз опирается на процесс моделирования угроз OWASP и таксономию уязвимостей CWE Top 25 (cwe_top25_2025#x28.x2.p42); она не заявляет соответствие какой-либо схеме сертификации безопасности. Независимая оценка относится к аудиту, а не к этому документу.