セキュリティ概要
TCPDF-Nextはセキュリティファーストの設計哲学に基づいて構築されています。暗号プリミティブからHTMLパースまで、すべてのコンポーネントが、発見後にパッチするのではなく、脆弱性のカテゴリ全体を排除するよう設計されています。
セキュリティファースト設計哲学
TCPDF-Nextのセキュリティは、レガシーコードベースの上にボルトオンされた機能ではありません。初日からすべての設計決定に影響を与えたアーキテクチャ上の制約です:
- デフォルトで拒否 -- 外部リソースの読み込み、ネットワークリクエスト、ファイルアクセスは、明示的に許可されない限りブロックされます。
- クローズドで失敗 -- セキュリティチェックが実行できない場合(例:OCSPレスポンダに到達不能)、操作は安全でない状態で進行するのではなく失敗します。
- 多層防御 -- 複数の独立した保護レイヤーにより、単一のバイパスではシステムが危殆化しないことを保証します。
- 最小攻撃面 -- ランタイムComposer依存関係ゼロ。すべての暗号操作はPHP組み込みのOpenSSLおよびSodium拡張を使用します。
AES-256暗号化(レガシーアルゴリズムなし)
TCPDF-Nextは、PDF 2.0(ISO 32000-2、リビジョン6)で定義されたAES-256暗号化のみを実装しています。すべてのレガシーおよび安全でないアルゴリズムは永久に拒否されます:
| アルゴリズム | ステータス | 理由 |
|---|---|---|
| AES-256-CBC | サポート | PDF 2.0標準、既知の実用的攻撃なし |
| RC4(40ビット / 128ビット) | 禁止 | 既知のバイアスと実用的攻撃のあるストリーム暗号 |
| AES-128 | 禁止 | 長期機密性に不十分なマージン |
| DES / 3DES | 未実装 | ブロックサイズと鍵長の脆弱性 |
| MD5(鍵導出用) | 禁止 | 2004年以降の衝突攻撃 |
use YeeeFang\TcpdfNext\Encryption\EncryptionAlgorithm;
use YeeeFang\TcpdfNext\Encryption\Permissions;
$pdf->setEncryption()
->setAlgorithm(EncryptionAlgorithm::AES256)
->setUserPassword('reader-password')
->setOwnerPassword('admin-password')
->setPermissions(
Permissions::PRINT_HIGH_QUALITY
| Permissions::COPY
| Permissions::ACCESSIBILITY
)
->apply();PAdESデジタル署名(B-BからB-LTA)
TCPDF-Nextは、長期有効性の段階的なレベルを持つ、完全なPAdESベースラインプロファイル(ETSI EN 319 142-1)のデジタル署名を実装しています:
| レベル | 説明 | 検証期間 |
|---|---|---|
| PAdES B-B | 署名証明書付きの基本CMS署名 | 証明書の有効期間(約1〜3年) |
| PAdES B-T | + 信頼されたTSAからのRFC 3161タイムスタンプ | TSA証明書の有効期間(約10〜15年) |
| PAdES B-LT | + OCSP/CRLデータを含むドキュメントセキュリティストア | アルゴリズムのセキュリティ寿命(約15〜30年) |
| PAdES B-LTA | + 無期限の再検証用アーカイブタイムスタンプ | 無期限(定期的な再タイムスタンプ付き) |
実装の詳細については、PAdES B-LTA署名をご覧ください。
DNSピニングによるSSRF防御
すべての外部ネットワークリクエスト(画像取得、TSA通信、OCSP照会)は、組み込みSSRF防御を備えた強化HTTPクライアントを通過します:
- DNSピニング -- 解決されたIPアドレスは接続前に検証されます。プライベートネットワーク範囲(
10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)、ループバック(127.0.0.0/8)、リンクローカル(169.254.0.0/16)アドレスがブロックされます。 - プロトコル制限 -- デフォルトで
https://のみ許可。平文のhttp://は明示的に許可されない限り拒否されます。 - ドメイン許可リスト -- 許可された外部ドメインの設定可能な許可リスト。
- リダイレクト追跡 -- 設定可能な最大値(デフォルト:3)に制限され、各ホップで再検証されます。
パストラバーサル防止
すべてのファイルパス操作はディレクトリトラバーサル攻撃を防ぐためにサニタイズされます:
- 埋め込みファイル名からパス区切り文字と
..シーケンスが除去されます。 - フォントファイルパスは絶対正規パスに解決され、許可されたディレクトリに対して検証されます。
- HTMLで参照される画像パスは、
ResourcePolicy経由で明示的に設定されたディレクトリに制限されます。
パスワードと鍵の#[\SensitiveParameter]
パスワード、パスフレーズ、秘密鍵、PINを受け取るすべてのメソッドパラメータには、PHP 8.2の#[\SensitiveParameter]属性が付加されています。これにより、スタックトレース、エラーログ、例外メッセージから機密値が自動的に墨消しされます:
public function setUserPassword(
#[\SensitiveParameter] string $password
): self { /* ... */ }
public function setCertificate(
string $certificate,
#[\SensitiveParameter] string $privateKey,
#[\SensitiveParameter] string $passphrase = ''
): self { /* ... */ }重要な戻り値の#[\NoDiscard]
セキュリティ上重要な結果(検証結果、署名検証)を返すメソッドには、呼び出し元が戻り値を無視することを防ぐため#[\NoDiscard]が付加されています:
#[\NoDiscard]
public function validate(string $pdfPath): ValidationResult { /* ... */ }
#[\NoDiscard]
public function verify(): SignatureVerificationResult { /* ... */ }これらの戻り値を無視するとコンパイラ警告が発生し、開発時に一般的なセキュリティバグのクラスをキャッチします。
PHPStan レベル8(エラーゼロ、ベースラインなし)
コードベース全体がPHPStan静的解析の最も厳格なレベル(レベル8)をエラーゼロ、ベースラインファイルなしで通過しています。これは以下を意味します:
- コードベースのどこにも
@phpstan-ignore注釈がありません。 - 抑制されたエラーカテゴリがありません。
- ジェネリクスとテンプレート型を含むすべての型が完全に指定されています。
- すべてのデッドコードパスが排除されています。
100% declare(strict_types=1)
TCPDF-Nextのすべてのpdfファイルはdeclare(strict_types=1)で始まります。例外はありません。これにより、歴史的にPHPアプリケーションのセキュリティ脆弱性につながってきた型強制バグのクラス全体が排除されます。
OWASPコンプライアンスの考慮事項
TCPDF-NextはPDF生成ライブラリに関連する以下のOWASPカテゴリに対応しています:
| OWASPカテゴリ | 対策 |
|---|---|
| A01 -- アクセス制御の不備 | きめ細かなPDF権限、証明書ベースの暗号化 |
| A02 -- 暗号化の失敗 | AES-256のみ、弱いアルゴリズムなし、定時比較 |
| A03 -- インジェクション | HTMLサニタイゼーション、パストラバーサル防止、eval()なし |
| A05 -- セキュリティ設定ミス | セキュアなデフォルト、デフォルトで拒否のリソースポリシー |
| A06 -- 脆弱なコンポーネント | ランタイム依存関係ゼロ、OpenSSL/Sodium経由の組み込み暗号 |
| A07 -- 認証の失敗 | #[\SensitiveParameter]、sodium_memzero()によるセキュアメモリワイプ |
| A10 -- SSRF | DNSピニング、プライベートネットワークブロック、ドメイン許可リスト |
セキュリティドキュメント
完全なセキュリティドキュメントをご覧ください:
- セキュリティベストプラクティス -- 入力検証、証明書管理、デプロイメントセキュリティ
- セキュリティ概要 -- PDF署名の攻撃ベクトルと対策