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.
Sekilas
Bagian berjudul “Sekilas”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.
Batas kepercayaan
Bagian berjudul “Batas kepercayaan”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 peringatanREADME.mdproyek dan.github/workflows/build.yml(rilis melakukan commit dan memberi tag pada tree yang dihasilkan sejak awal). - Cakupan token rilis sempit.
secrets.BACKPORT_TRIGGER_TOKENmemberi otorisasi untuk mengkloning repositori source pada tag rilis. Token ini hanya dirujuk dalam langkah checkout source. Diverifikasi melaluibuild.yml(penggunaanGH_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(kondisionalruns-on).
Postur rantai pasok
Bagian berjudul “Postur rantai pasok”- Toolchain dibatasi di
composer.json. Toolchain ini menggunakan Rector^2.0, PHPStan^2.1, PHPUnit^13.0, dan kumpulansymfony/polyfill-*. Builder tidak memiliki dependensi runtime NextPDF, sehingga paket runtime NextPDF yang disusupi tidak dapat menjangkau builder. Diverifikasi melaluicomposer.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.ymldan.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 melaluibuild.yml(zip ... -x '*/vendor/*' '*/.git/*'). - Analisis statis menjadi gerbang bagi kode build.
composer analysemenjalankan PHPStan pada level 10 di seluruhrector/rulesdanscriptsuntuk setiap push dan pull request ke salah satu branch permanen. Analisis ini berjalan sebelum dry-run apa pun. Diverifikasi melaluicomposer.jsondan0-ci.yml.
Gerbang validasi sintaks
Bagian berjudul “Gerbang validasi sintaks”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.
Pemisahan lisensi
Bagian berjudul “Pemisahan lisensi”Kedua paket yang dihasilkan memiliki lisensi berbeda, yang ditetapkan di scripts/adjust-composer.php:
| Paket | Field lisensi | Diatur oleh |
|---|---|---|
nextpdf/backport | Apache-2.0 | generatePublicComposer() |
nextpdf/backport-pro | proprietary | generateProComposer() |
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.
Jaminan operasional dan batasnya
Bagian berjudul “Jaminan operasional dan batasnya”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()) danbuild.ymljobneeds. - Build terserialisasi. Grup concurrency
backport-builddengancancel-in-progress: falsemencegah dua rilis source berlomba untuk tag rilis yang sama. Diverifikasi melaluibuild.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/.
Melaporkan masalah
Bagian berjudul “Melaporkan masalah”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.
Berikutnya
Bagian berjudul “Berikutnya”- /integrations/backport/overview/ — apa itu builder dan apa yang dihasilkannya.
- /integrations/backport/production-usage/ — cara mengoperasikan pipeline rilis.