コンテンツにスキップ
getnextpdf.com

Enterprise エディション

フォレンジック

NextPDF Enterprise Forensics は、PDF のインクリメンタル更新履歴を読み取り、リビジョン、分類されたイベント、およびオブジェクトごとの変更について、構造化された読み取り専用のレポートを生成します。フォレンジック分析のワークフローをサポートします。改ざん防止シールではなく、ドキュメントが真正である、または変更されていないと主張するものでもありません。

この機能は NextPDF Enterprisenextpdf/enterprise)で提供され、Enterprise ティアのライセンスエンベロープで有効化されます。その権限のないデプロイメントは、この機能のクラスを読み込みません。エディションを比較してライセンスを取得

Terminal window
composer require nextpdf/enterprise:^3

PDF は、書き換えるのではなく、ファイルの末尾に変更を追記することで更新できます。各更新は、新しい cross-reference セクションと新しいトレーラーを追加し、元のバイト列はそのまま残されます — ISO 32000-2:2020 §7.5.6。オブジェクトが変更されると、更新は新しいコピーを追記し、その更新の cross-reference セクションが、古いオフセットを上書きするバイトオフセットを記録します。リーダーは最新のコピーを解決します — ISO 32000-2:2020 §7.5.6。初期のファイル構造は、後続の更新によって変更される場合があります — ISO 32000-2:2020 §7.5.4。更新の cross-reference セクションは、その更新で追加、変更、または削除されたオブジェクトのみを列挙します — ISO 32000-2:2020 §7.5.5。

アナライザーは、この階層化された構造を読み取ります。各リビジョンの cross-reference テーブルを解析し、リビジョンのバイト境界を導出し、各リビジョンのエントリを 1 つ古いリビジョンと比較して、すべてのオブジェクトを追加、変更、または削除として分類します。次に、オブジェクトの変更をより高レベルのイベントにグループ化します。署名が追加された、ドキュメントカタログが更新された、暗号化ディクショナリが現れた、またはオブジェクトのセットが追加・変更・削除された、などです。出力は、リビジョン数、合計サイズ、リビジョンごとのサマリーリスト、分類されたイベントのタイムライン、およびオブジェクトごとの変更リストを保持する 1 つのレポートオブジェクトです。

アナライザーは読み取り専用です。構造的なマーカーから署名リビジョンの存在を検出します。いかなる署名も検証せず、いかなるダイジェストも再計算せず、いかなる証明書もチェックしません。署名検証は別個の Core 機能です。生成されるレポートは、解析されたとおりの更新履歴の構造的な記述です。ドキュメントが真正である、変更が不正であった、またはすべての変更が検出された、という判定ではありません。レポートは、フォレンジックの保証や法廷で許容される証明としてではなく、パーサーから見たリビジョンチェーンに対してテストされた改ざん検知性の検出として扱ってください。

アナライザーは意図的に構造で止まります。リビジョンチェーンが含むものを報告し、変更が承認されていたとも署名が有効であるとも決して主張しません。構造的な存在と暗号的な有効性は別々の主張であり、それらを混同すると、呼び出し側が改ざん検知性を保証と取り違えかねません。したがって署名の有効性は単一の Core 署名サーフェスに留まり、Forensics はそれを複製するのではなく組み合わせます。レポートは JSON シリアライズ可能な構造的メタデータであるため、SIEM はドキュメントコンテンツに触れることなく編集履歴を取り込めます。 設計の背景: インクリメンタル更新とそれが重要な理由

種別役割安定性導入バージョン
ForensicAnalyzerclassPDF を解析しフォレンジックレポートを返す(static analyzestable1.10.0
ForensicReportclass分析結果。SIEM エクスポート向けに JsonSerializablestable1.10.0
RevisionSummaryclassリビジョンごとの事実: オブジェクト数、サイズ、バイト境界、存在フラグstable1.10.0
ForensicEventclass影響を受けるオブジェクトリストを伴う 1 つの分類されたイベントstable1.10.0
ForensicEventTypeenumイベントカテゴリ(署名追加、カタログ更新、オブジェクト追加など)stable1.10.0
ObjectChangeclass2 つのリビジョンにまたがる 1 つのオブジェクトの変更レコードstable1.10.0
ObjectChangeTypeenumAdded、Modified、または Deletedstable1.10.0

ForensicReport は、hasIncrementalUpdates()hasAnySignature()getEventsByType()getChangesForRevision()jsonSerialize() を公開します。リビジョンサマリーの hasSignature フラグは、有効性の結果ではなく、構造的な存在シグナルです。

Analyze the revision history of a PDF
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Enterprise\Forensics\ForensicAnalyzer;
/**
* Produce a forensic report from PDF bytes.
*
* @param string $pdfData Raw PDF file bytes.
*
* @return array{revisions: int, incremental: bool, signedRevisionPresent: bool}
*/
function inspect(string $pdfData): array
{
$report = ForensicAnalyzer::analyze($pdfData);
return [
'revisions' => $report->revisionCount,
'incremental' => $report->hasIncrementalUpdates(),
'signedRevisionPresent' => $report->hasAnySignature(),
];
}

hasAnySignature() は、署名リビジョンが構造内に存在することを報告します。署名が有効であると述べるものではありません。

Forensic analysis with SIEM export and fail-closed handling
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Enterprise\Forensics\ForensicAnalyzer;
use NextPDF\Enterprise\Forensics\ForensicEventType;
use Psr\Log\LoggerInterface;
final readonly class RevisionAuditor
{
public function __construct(private LoggerInterface $logger) {}
/**
* Analyze a document and emit a structural JSON record for the SIEM.
*
* @param string $pdfData The PDF bytes to inspect.
*
* @return string A JSON forensic report (no document content).
*/
public function audit(string $pdfData): string
{
try {
$report = ForensicAnalyzer::analyze($pdfData);
$this->logger->info('Forensic analysis complete', [
'revisions' => $report->revisionCount,
'sizeBytes' => $report->totalSizeBytes,
'signatureAddedEvents' => count(
$report->getEventsByType(ForensicEventType::SignatureAdded),
),
]);
return json_encode($report, JSON_THROW_ON_ERROR);
} catch (\Throwable $e) {
$this->logger->error('Forensic analysis failed', ['error' => $e->getMessage()]);
throw $e;
}
}
}

ログレコードはカウントとサイズのみを保持します。ドキュメントテキストは保持しません。catch ブロックは再スローします。解析失敗を握りつぶすことはありません。

  • 単一リビジョンのドキュメントにはインクリメンタル履歴がありません。変更リストは空です。これは真正性の証拠ではありません。
  • SignatureAdded イベントは、署名リビジョンが構造的に存在することを意味します。署名の有効性の結果ではありません。Core の署名サーフェスで署名を検証してください。
  • オブジェクトの再利用は通常のことです。更新されたオブジェクトは自身のオブジェクト番号を保持し、新しいコピーが追記されます。アナライザーはこれを、削除と再作成ではなく Modified として報告します。
  • Deleted の分類は、cross-reference チェーンにおける free エントリへの遷移です。リーダーは依然としてそのオブジェクトの古いコピーを解決する場合があります。構造レベルでの削除は、回復不能性を保証するものではありません。
  • アナライザーは、パーサーが観測したものを報告します。パーサーを混乱させるように作られたドキュメントは、別のツールから見た内容と一致しないレポートを生成する場合があります。レポートは、すべての変更が検出されたという主張ではありません。
  • 入力は境界づけられています。サイズ超過または過度に多リビジョンのドキュメントは、無制限のメモリを消費するのではなく、型付きの解析例外とともにフェイルクローズします。

分析コストは、レンダリングされたページの複雑さではなく、リビジョン数とオブジェクト数に応じてスケールします。1500 ms のウォール予算は、典型的な多リビジョンのビジネスドキュメントをカバーします。再現性プロファイルは structural です。レポートは所定の入力に対して決定論的ですが、絶対的なバイトオフセットは正確な入力ファイルを反映し、再保存されたコピー間で移植可能ではありません。

アナライザーは読み取り専用であり、入力に書き込むことは決してありません。分析的なサーフェスであり、変換的なものではありません。署名と暗号化のマーカーの存在を検出しますが、暗号操作は実行しないため、FIPS の主張は行いません。レポートは解析された更新履歴を記述します。真正性の主張ではなく、改ざん防止、フォレンジックの保証、または法廷で許容されるものとして提示してはなりません。結論を導くのはオペレーターです。ライブラリは構造を報告します。

分析は、PDF を保持するホスト上でインプロセスで実行されます。ドキュメントコンテンツがホストの外に出ることはありません。レポートは、オブジェクト番号、リビジョンインデックス、サイズ、バイト境界、およびイベントカテゴリ — 構造的なメタデータであり、ドキュメントテキストや検出された個人データではありません — を保持します。入力 PDF やレポート自体が個人データを含むかどうか、およびそれぞれがどこに保存されるかは、ライブラリの境界の外にあるデプロイメントの責任です。

ライブラリは、構造的なメッセージを伴う型付き例外を発生させ、ドキュメントバイトを例外テキストに入れることはありません。分析の周囲でログを記録するデプロイメントは、本番サンプルに示すように、レポートのカウントとカテゴリをログに記録すべきであり、生の PDF ペイロードをログや APM バックエンドに記録してはなりません。JSON レポートが、SIEM へ転送する安全なアーティファクトです。

このモジュールでは暗号操作が発生しないため、FIPS モード固有の挙動はありません。暗号的である署名検証は別個の Core 機能であり、そこで文書化されています。

主張標準条項
後続の更新は、ファイルの末尾に追加の要素を追記します。元の構造は後続の更新によって変更されます。ISO 32000-2:2020§7.5.6
更新されたオブジェクトは新しいコピーとして追記され、更新の cross-reference エントリが以前のバイトオフセットを上書きします。リーダーは最新のコピーを解決します。ISO 32000-2:2020§7.5.6
初期のファイル構造は、後続の更新によって変更される場合があります。ISO 32000-2:2020§7.5.4
更新の cross-reference セクションは、追加、変更、または削除されたオブジェクトのエントリのみを含みます。ISO 32000-2:2020§7.5.5
署名ディクショナリは、何が署名されているかを記録します。ISO 32000-2:2020§12.8.1
ByteRange は、署名がカバーするバイト範囲を定義します(署名検証は別個の Core 機能です)。ISO 32000-2:2020§12.8.1
Document Security Store は、後続のリビジョンに長期検証マテリアルを保持します。ISO 32000-2:2020§12.8.4

すべての条項はパラフレーズです。NextPDF は規範的なテキストを複製しません。正規の文言については、公開された標準を参照してください。NextPDF はフォレンジック認証の主張を行いません。レポートは、解析された更新構造を記述するものであり、ドキュメント完全性の認証された判定ではありません。

  • アナライザーは読み取り専用です。入力ドキュメントに書き込むことは決してなく、暗号操作も実行しません。
  • 各リビジョンの cross-reference テーブルを解析し、リビジョンのバイト境界を導出し、すべてのオブジェクトを追加、変更、または削除として分類し、次に変更を分類されたイベントのタイムラインにグループ化します。
  • SignatureAdded イベントは、署名リビジョンが構造的に存在することを意味します。署名の有効性の結果ではありません — 検証は別個の Core 機能です。
  • 単一リビジョンのドキュメントは空の変更リストを持ちます(真正性の証拠ではありません)。Deleted の分類は free エントリへの遷移であり、回復不能性を保証するものではありません。
  • 入力は境界づけられています。サイズ超過または過度に多リビジョンのドキュメントは、型付きの解析例外とともにフェイルクローズします。レポートはテストされたとおりの改ざん検知性の検出であり、フォレンジックの保証や法廷で許容される証明ではありません。

このページは、外部から観測できる挙動とサポートされる公開 API サーフェスのみを文書化します。内部の名前空間パス、ヘルパークラス、メカニズムの表、ランブックのファイル名、およびチケットプレフィックスは範囲外です。

NextPDF Core(Apache-2.0)には、リビジョン履歴のフォレンジックアナライザーがありません — 一切ありません。この機能には Core ティアの同等品はありません。Core は正規の署名検証サーフェスを提供し、アナライザーはそれと組み合わさりますが、置き換えることはありません。

NextPDF Pro には、リビジョン履歴のフォレンジックアナライザーがありません — 一切ありません。この機能には Pro ティアの同等品はありません。読み取り専用のリビジョンおよびオブジェクトごとの変更報告と、JSON シリアライズ可能な SIEM レポートは、nextpdf/enterprise パッケージにのみ同梱されています。

リビジョンパーサー、変更の分類、およびイベントのタイムラインは、挙動レベルで記述しています。パーサーの内部仕様と内部の分類の詳細は、公開サーフェスの範囲外です。署名の有効性は、ここでは意図的に対象外としています — それは Core の署名サーフェスの責任です。

分析は、PDF を保持するホスト上でインプロセスで実行されます。ドキュメントコンテンツがホストの外に出ることはありません。入力 PDF やレポートが個人データを含むかどうか、およびそれぞれがどこに保存されるかは、ライブラリの境界の外にあるデプロイメントの責任です。レポートから結論を導くのはオペレーターです。ライブラリは構造を報告し、ドキュメントの真正性を主張しません。

Forensics サーフェスには輸出管理の制限は適用されません。レポートは、改ざん防止、フォレンジックの保証、または法廷で許容されるものとして提示してはなりません。このドキュメントは法的見解ではありません。ご自身のコンプライアンスおよび法務の助言者にご相談ください。