コンテンツにスキップ

エンジンの脅威モデル

このページは NextPDF コアエンジンの脅威モデルです。エンジンが攻撃者の影響下にある入力(HTML、CSS、SVG、フォント、画像、既存の PDF)を処理する際に、スコープ内とみなす攻撃クラスを列挙します。各外部リソース機能のデフォルト方針を明示し、各クラスを緩和するコード内ガードを示します。

境界。 脅威モデルは、想定された脅威と、それらに適用された緩和策を記述するものです。脆弱性が存在しないことを主張するものではありません。ここに記載されていないクラスは、それによって存在しないと証明されるわけではなく、 モデルの現在のスコープ外である可能性があります。未実装の機能は、 出荷前に正式な脅威レビューを通すことが必須です。このページは、 セキュリティの証明ではなく、意図的な設計の記録として扱ってください。

Terminal window
composer require nextpdf/core:^3

ここで説明するガードはコアパッケージの一部であり、有効化のための追加依存関係は不要です。これらはデフォルトで有効です。

このモデルは、OWASP 脅威モデリングプロセス(owasp_threat_modeling#x1.x11.p6)が推奨する構造に従います。つまり、信頼できない入力が信頼境界を越える地点でシステムを分解し、各境界の脅威を列挙して、緩和策を記録します。

エンジンの主要な信頼境界は ドキュメントの取り込み です。別の場所で作成されたコンテンツ(リモートのスタイルシート、@font-face のソース、<image href>、埋め込まれた XML インボイス、検査対象の PDF)が存在する場合、それらはいずれも、エンジンに何かを取得、解析、または解凍させる起点になり得ます。基本となる原則は デフォルト拒否 です。すべての外部リソース機能は、呼び出し側がポリシーオブジェクトを通じて明示的に有効化するまでは OFF です。これは、NIST SP 800-53 Rev. 5 CM-7(nist_sp_800_53r5#x4.x182.p14)の最小機能のベースラインをレンダリングエンジンに適用したものです。最も厳格な設定がコンストラクターのデフォルトとなります。機能を開放することは、呼び出し側による明示的な決定です。

脅威モデルそのものは API ではありません。それを表現するポリシーオブジェクトはモジュールのページに記載されています。信頼に関わるエントリーポイントは、外部リソースポリシーのコントラクト(ExternalResourcePolicyInterface。全拒否のデフォルトとして DefaultExternalResourcePolicy を備える)と、URL および XML のガード(UrlValidatorXmlGuard)です。このページはそれらの動作を参照するものであり、シグネチャを改めて記述するものではありません。

安全な方針がデフォルトです。これを得るためにコードを書く必要はありません。

<?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();

機能の開放は意図的かつ限定的に行います。HTTPS 経由で CDN ホストの Web フォントを許可する必要がある本番環境の呼び出し側は、明示的にオプトインし、対象範囲を限定します。

<?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() のような機能は実装されていません。そのため、現時点では攻撃対象領域はゼロです。ただし、将来実装する場合は、その前に正式な脅威ゲートを通す必要があると文書化されています。コードが存在しないことは現時点での緩和策であり、恒久的な保証ではありません。
  • DNS リバインディングは変化し続ける対象です。 UrlValidator はホスト名を resolve(解決)し、解決された IP を返すため、呼び出し側は接続をピン留め(CURLOPT_RESOLVE)でき、検証から取得までの TOCTOU ウィンドウを閉じられます。これはベストエフォートの防御であり、絶対的なものではありません。制限の緩い送信プロキシの背後にいる運用者は、ライブラリからは見えない内部ホストへ依然として到達できます。
  • 権限ビットはアクセス制御ではありません。 「コピーをブロックする」ドキュメントは、強制ではなくリーダーの協力に依存しています。これについては セキュリティモデルで説明しています。これは脅威モデルでよくある誤解であるため、ここで明示的に取り上げています。

ガードは、早期に失敗させ、処理量を制限するように設計されています。XML ガードは解析の前に DOCTYPE を拒否し、入力サイズを制限します。画像のパスは解凍の前にメガピクセルとバイトの上限を強制します。URL ガードはソケットを開く前に scheme/host で拒否します。安全なデフォルトのコストは、遅いリクエストではなく、拒否されたリクエストです。

想定済みの攻撃クラスと、そのコード内緩和策は次のとおりです。

脅威クラス(CWE / OWASP)PDF エンジンにおけるベクトルコード内ガード
SSRF(サーバーサイドリクエストフォージェリ。OWASP Top 10 2025、owasp_top10_2025#x3.x1.p26@font-face/@import/url() による 169.254.169.254 または内部ホストの参照。TSA/OCSP/CRL のフェッチャーUrlValidator::validateExternalUrl() による private/reserved/loopback/link-local の範囲とクラウドメタデータのエンドポイントのブロック、危険なスキームの拒否、DNS 解決済みの接続ピン留め用 IP の返却
XXE(cwe_top25_2025#x28.x2.p42埋め込まれた XML インボイスまたは XMP パケット内の外部エンティティ / DOCTYPEXmlGuard::loadXml() による LIBXML_NONET の強制と、あらゆる DOCTYPE 宣言の完全拒否。さらに、XML 1.0 で禁止された制御文字と入力サイズ上限の適用
解凍爆弾100 MP のペイロードを隠す 1×1 の画像、サイズ超過の WOFF2画像のパスによる解凍前のメガピクセル上限とバイト上限の強制。フォントのパスによるファイルサイズとグリフ数の制限
パストラバーサルfile:///etc/passwd を指すフォントまたは SVG の src外部リソースのデフォルト全拒否。ローカルのファイルパスが明示的に有効化された場合の、realpath() によるディレクトリ許可リストに対する解決
コンテンツインジェクションPDF オペレーターの文脈から抜け出す細工された文字列、data:/javascript: の href出力時の PDF 文字列エスケープ。注釈に対するスキーム許可リストと href のサニタイズ

デフォルトは、外部リソースを全拒否する方針に集約されます。フォント、@import、background-image、および SVG の外部参照は、コードと併せて保守されている セキュリティプロパティのカバレッジマトリックスに従って、呼び出し側がスキームごとにオプトインするまでは OFF です。

このページは 想定済みの 脅威を記述しています。これはペネトレーションテストのレポートではなく、列挙された緩和策が完全であることや、他の脆弱性クラスが当てはまらないことを主張するものではありません。

準拠プロファイルではありません。この脅威モデルは、OWASP 脅威モデリングプロセスと CWE Top 25 の脆弱性分類(cwe_top25_2025#x28.x2.p42)を踏まえています。いかなるセキュリティ認証スキームへの準拠も主張しません。独立した評価は監査の対象であり、このドキュメントの対象ではありません。