コンテンツにスキップ

バックポートビルダーのセキュリティと運用

これはビルドツールであり、ランタイム依存関係ではありません。このページでは、ビルドパイプラインの運用と信頼について説明します。PDF エンジン自体のセキュリティ姿勢については、このページではなくエンジン側のドキュメントで説明しています。

ビルダーは、自身が作成したものではないソースを変換し、自身が開発対象としていないディストリビューションを出力します。そのセキュリティモデルは、この前提から導かれます。信頼境界は、ソースのチェックアウトとツールチェーンです。出力されるアーティファクトは読み取り専用であり、機械的に生成されます。パブリックパッケージと Pro パッケージのライセンス分割は、コード内で固定されています。

ビルダーの入力は、ソースリポジトリと固定されたツールチェーンです。その出力は派生アーティファクトです。次の 3 つの性質が成り立ちます。

  • 生成されるディストリビューションは読み取り専用であり、機械的に生成されます。 これはこのリポジトリのブランチとしてではなく、バージョンタグとして公開されます。開発、バグレポート、機能要望は、生成されたツリーではなく、元の nextpdf/* ソースリポジトリに提出してください。プロジェクトの README.md の注意ブロックと .github/workflows/build.yml に対して検証済み(リリースは生成されたツリーを一から再生成してコミットおよびタグ付けします)。
  • リリーストークンのスコープは狭く設定されています。 secrets.BACKPORT_TRIGGER_TOKEN は、リリースタグの時点でソースリポジトリをクローンする操作を認可します。これはソースチェックアウトのステップでのみ参照されます。build.yml に対して検証済み(GH_TOKEN の使用箇所)。
  • CI ランナーの分離は意図的です。 信頼されたイベントはセルフホストの PHP ランナーで実行され、フォークからのプルリクエストと Dependabot の実行は GitHub ホストのランナーに強制的に割り当てられます。信頼されていないコードが、信頼されたランナープールで実行されることはありません。.github/workflows/0-ci.yml に対して検証済み(runs-on の条件分岐)。
  • ツールチェーンは composer.json で制約されています。 Rector ^2.0、PHPStan ^2.1、PHPUnit ^13.0、および symfony/polyfill-* 一式です。ビルダーは NextPDF のランタイム依存関係を持たないため、NextPDF ランタイムパッケージが侵害されてもビルダーには到達できません。composer.json に対して検証済み。
  • 依存関係の更新はボット駆動でゲート制御されています。 Dependabot の設定と自動マージワークフローが存在します。Dependabot の実行は GitHub ホストのランナーに固定され、マージ前に完全な CI ゲート(PHPStan、テスト、ドライラン)を通過します。.github/dependabot.yml および .github/workflows/0-ci.yml9-dependabot-auto-merge.yml に対して検証済み。
  • 出力はビルド状態を除外します。 リリースアーカイブは vendor/.git/ を除外して圧縮されるため、公開されるアーティファクトにはビルダー自身の依存関係ツリーではなく、ソースと生成されたマニフェストが含まれます。build.yml に対して検証済み(zip ... -x '*/vendor/*' '*/.git/*')。
  • 静的解析がビルドコードをゲート制御します。 composer analyse は、いずれかの永続ブランチへのプッシュおよびプルリクエストのたびに、rector/rulesscripts に対してレベル 10 で PHPStan を実行します。これはいかなるドライランよりも前に実行されます。composer.json および 0-ci.yml に対して検証済み。

ビルドスクリプトは、出力の構文チェックをローカルでは行いません。その理由は、ビルドホストがターゲットよりも新しい PHP を実行しているためです。権威あるゲートはリリースワークフロー内にあります。ビルド後、ランナーはターゲットの PHP に切り替えて output/src 全体に対して php -l を実行し、パースエラーまたは致命的なエラーが 1 つでもあればリリースを失敗させます。その後、アーティファクトはインストールされ、検証マトリクス全体で実行されます。PHP 8.1 レーンでは PHP 8.1 から 8.4 まで、PHP 7.4 レーンでは PHP 7.4 と 8.0 です。ターゲットランタイムが拒否するようなディストリビューションは、リリースには到達しません。scripts/build.phpvalidateOutput())および .github/workflows/build.yml(構文チェックと validate-* ジョブ)に対して検証済み。

これは、パイプラインで実行されるランタイムに限定した、観測済みの動作に基づく保証です。適合性認証ではありません。構文の受理とプロジェクト自身のテストスイートを超えて、変換されたプログラムの正しさを主張するものではありません。

生成される 2 つのパッケージには異なるライセンスが適用され、scripts/adjust-composer.php で固定されています。

パッケージライセンスフィールド設定箇所
nextpdf/backportApache-2.0generatePublicComposer()
nextpdf/backport-proproprietarygenerateProComposer()

ビルダーリポジトリ自体は Apache-2.0 です(composer.jsonlicense)。その CHANGELOG.md には、LGPL-3.0-or-later から Apache-2.0 への過去の再ライセンスが記録されています。その変更より前に公開されたバージョンは引き続き旧ライセンスの下にあり、取得可能なまま維持されます。一方で、新しいバージョンはすべて Apache-2.0 です。Pro ディストリビューションはプロプライエタリであり、PHP 8.1 ターゲット向けにのみ生成され、phpseclib/phpseclib ^3.0 を必要とします。CHANGELOG.mdcomposer.json、および scripts/adjust-composer.php に対して検証済み。

コードで強制される範囲に限り、パイプラインが保証する内容は次のとおりです。

  • 最初の失敗で停止します。 ビルドは、最初に失敗したステージで名前付きのエラーとともに中止されます。リリースジョブはビルドと検証の成功に依存しているため、不完全なディストリビューションがリリースされることはありません。scripts/build.phpstep())および build.yml ジョブの needs に対して検証済み。
  • ビルドは直列化されます。 cancel-in-progress: false を指定した backport-build 並行実行グループにより、2 つのソースリリースが同じリリースタグを巡って競合することを防ぎます。build.yml に対して検証済み。
  • 入力は再現可能です。 パイプラインは、ビルド前にすべてのソースリポジトリを正確なリリースタグの時点でクローンします。build.yml に対して検証済み(--branch "${TAG}")。

主張していない内容は次のとおりです。

  • 構文の受理とテストスイートを超えて、標準への準拠、完全な PHP バージョン互換性、変換されたプログラムの正しさを認証するものではありません。
  • ダウングレードは、ランタイムによって強制される不変性を取り除きます(readonly の除去)。readonly プロパティへの書き込みをランタイムが拒否することに依存していたコードは、ダウングレードされた出力ではその防御を失います。これは clone-with の安全性のための、文書化された意図的なトレードオフです。/integrations/backport/troubleshooting/. を参照してください。

ビルダーのセキュリティ問題は、リポジトリの SECURITY.md に従います。公開 Issue ではなく、GitHub Security Advisory またはセキュリティ連絡先を通じて報告してください。生成された コードの問題は、元のソースリポジトリに報告してください。生成されたツリーは機械的に生成されたものであり、開発対象ではないためです。SECURITY.md およびプロジェクトの README.md に対して検証済み。

  • /integrations/backport/overview/ — ビルダーとは何か、何を生成するか。
  • /integrations/backport/production-usage/ — リリースパイプラインの運用。