Lewati ke konten

Keamanan dan operasi builder backport

Perkakas build — BUKAN dependensi runtime. Halaman ini menjelaskan cara mengoperasikan pipeline build dan alasan pipeline tersebut dapat dipercaya. Postur keamanan engine Portable Document Format (PDF) sendiri didokumentasikan bersama engine, bukan di sini.

Builder mentransformasikan source yang bukan ditulisnya sendiri dan menghasilkan distribusi yang bukan dikembangkannya. Model keamanannya mengikuti batas tersebut. Batas kepercayaannya adalah checkout source dan toolchain. Artefak yang dihasilkan bersifat hanya-baca dan diproduksi oleh mesin. Pemisahan lisensi antara paket publik dan Pro ditetapkan dalam kode.

Builder mengambil repositori source dan toolchain yang dipatok sebagai input. Builder menghasilkan artefak turunan. Tiga properti berlaku:

  • Distribusi yang dihasilkan bersifat hanya-baca dan diproduksi oleh mesin. Distribusi ini dipublikasikan sebagai tag versi, bukan sebagai branch dari repositori ini. Pengembangan, laporan bug, dan permintaan fitur ditujukan ke repositori source nextpdf/* yang asli, tidak pernah ke tree yang dihasilkan. Diverifikasi melalui blok peringatan README.md proyek dan .github/workflows/build.yml (rilis melakukan commit dan memberi tag pada tree yang dihasilkan sejak awal).
  • Cakupan token rilis sempit. secrets.BACKPORT_TRIGGER_TOKEN memberi otorisasi untuk mengkloning repositori source pada tag rilis. Token ini hanya dirujuk dalam langkah checkout source. Diverifikasi melalui build.yml (penggunaan GH_TOKEN).
  • Pemisahan runner continuous integration (CI) bersifat disengaja. Peristiwa tepercaya berjalan pada runner PHP yang di-host sendiri; pull request fork dan eksekusi Dependabot dipaksa ke runner yang di-host GitHub. Kode yang tidak tepercaya tidak pernah dieksekusi pada pool runner tepercaya. Diverifikasi melalui .github/workflows/0-ci.yml (kondisional runs-on).
  • Toolchain dibatasi di composer.json. Toolchain ini menggunakan Rector ^2.0, PHPStan ^2.1, PHPUnit ^13.0, dan kumpulan symfony/polyfill-*. Builder tidak memiliki dependensi runtime NextPDF, sehingga paket runtime NextPDF yang disusupi tidak dapat menjangkau builder. Diverifikasi melalui composer.json.
  • Pembaruan dependensi digerakkan oleh bot dan dilindungi gerbang. Konfigurasi Dependabot dan workflow auto-merge tersedia. Eksekusi Dependabot dikunci ke runner yang di-host GitHub dan tetap melewati gerbang CI penuh (PHPStan, tes, dry-run) sebelum merge. Diverifikasi melalui .github/dependabot.yml dan .github/workflows/0-ci.yml, 9-dependabot-auto-merge.yml.
  • Keluaran tidak menyertakan state build. Arsip rilis dibuat sebagai zip dengan vendor/ dan .git/ dikecualikan. Artefak yang dipublikasikan berisi source dan manifest yang dihasilkan, bukan tree dependensi milik builder itu sendiri. Diverifikasi melalui build.yml (zip ... -x '*/vendor/*' '*/.git/*').
  • Analisis statis menjadi gerbang bagi kode build. composer analyse menjalankan PHPStan pada level 10 di seluruh rector/rules dan scripts untuk setiap push dan pull request ke salah satu branch permanen. Analisis ini berjalan sebelum dry-run apa pun. Diverifikasi melalui composer.json dan 0-ci.yml.

Skrip build tidak memeriksa sintaks keluaran secara lokal karena host build menjalankan PHP yang lebih baru daripada target. Gerbang otoritatif berada di workflow rilis. Setelah build, runner beralih ke PHP target dan menjalankan php -l di seluruh output/src, sehingga rilis gagal jika ada kesalahan parse atau fatal. Artefak kemudian diinstal dan diuji di seluruh matriks validasi — PHP 8.1 hingga 8.4 untuk jalur PHP 8.1, serta PHP 7.4 dan 8.0 untuk jalur PHP 7.4. Distribusi yang akan ditolak oleh runtime target tidak akan mencapai rilis. Diverifikasi melalui scripts/build.php (validateOutput()) dan .github/workflows/build.yml (pemeriksaan sintaks dan job validate-*).

Ini adalah jaminan atas perilaku yang teramati, dengan cakupan terbatas pada runtime yang diuji oleh pipeline. Ini bukan sertifikasi kesesuaian. Ini tidak menjamin kebenaran program yang ditransformasikan di luar penerimaan sintaks dan test suite milik proyek itu sendiri.

Kedua paket yang dihasilkan memiliki lisensi berbeda, yang ditetapkan di scripts/adjust-composer.php:

PaketField lisensiDiatur oleh
nextpdf/backportApache-2.0generatePublicComposer()
nextpdf/backport-proproprietarygenerateProComposer()

Repositori builder itu sendiri berlisensi Apache-2.0 (composer.jsonlicense). File CHANGELOG.md mencatat perubahan lisensi sebelumnya dari LGPL-3.0-or-later ke Apache-2.0. Versi yang dipublikasikan sebelum perubahan tersebut tetap berada di bawah lisensi lama dan tetap dapat diakses, sementara setiap versi baru berlisensi Apache-2.0. Distribusi Pro bersifat proprietary, hanya diproduksi untuk target PHP 8.1, dan membutuhkan phpseclib/phpseclib ^3.0. Diverifikasi melalui CHANGELOG.md, composer.json, dan scripts/adjust-composer.php.

Hal yang dijamin pipeline, dengan cakupan terbatas pada apa yang dipaksakan oleh kode:

  • Berhenti pada kegagalan pertama. Build dibatalkan pada tahap pertama yang gagal, disertai kesalahan yang diberi nama. Distribusi parsial tidak pernah dirilis karena job rilis bergantung pada keberhasilan build dan validasi. Diverifikasi melalui scripts/build.php (step()) dan build.yml job needs.
  • Build terserialisasi. Grup concurrency backport-build dengan cancel-in-progress: false mencegah dua rilis source berlomba untuk tag rilis yang sama. Diverifikasi melalui build.yml.
  • Input yang dapat direproduksi. Pipeline mengkloning setiap repositori source tepat pada tag rilis sebelum membangun. Diverifikasi melalui build.yml (--branch "${TAG}").

Hal yang tidak diklaim:

  • Pipeline ini tidak mensertifikasi kepatuhan standar, kompatibilitas versi PHP penuh, ataupun kebenaran program yang ditransformasikan di luar penerimaan sintaks dan test suite.
  • Penurunan versi menghapus imutabilitas yang dipaksakan oleh runtime (penghilangan readonly). Kode yang mengandalkan runtime untuk menolak penulisan ke properti readonly kehilangan perlindungan tersebut pada keluaran yang diturunkan versinya. Ini adalah pertukaran yang terdokumentasi dan disengaja demi keamanan clone-with — lihat /integrations/backport/troubleshooting/.

Untuk masalah keamanan pada builder, ikuti SECURITY.md repositori: laporkan melalui GitHub Security Advisory atau kontak keamanan, bukan issue publik. Ajukan issue terkait kode yang dihasilkan ke repositori source yang asli, karena tree yang dihasilkan diproduksi oleh mesin dan bukan tempat pengembangan berlangsung. Diverifikasi melalui SECURITY.md dan README.md proyek.

  • /integrations/backport/overview/ — apa itu builder dan apa yang dihasilkannya.
  • /integrations/backport/production-usage/ — cara mengoperasikan pipeline rilis.