İçeriğe geç

Backport oluşturucusunun güvenliği ve işletimi

Derleme araçları — çalışma zamanı bağımlılığı DEĞİLDİR. Bu sayfa, derleme ardışık düzeninin nasıl işletildiğini ve neden güvenilir olduğunu açıklar. Taşınabilir Belge Biçimi (PDF) motorunun kendi güvenlik duruşu burada değil, motorun belgelerinde ele alınır.

Oluşturucu, kendisinin yazmadığı kaynak kodu dönüştürür ve üzerinde geliştirme yapmadığı bir dağıtım üretir. Güvenlik modeli bu sınırdan doğar. Güven sınırı, kaynak kodun çekildiği nokta ve araç zinciridir. Üretilen yapıt salt okunurdur ve makine tarafından üretilir. Genel ve Pro paketleri arasındaki lisanslama ayrımı kodda sabitlenmiştir.

Oluşturucu, kaynak depolarını ve sürümü sabitlenmiş araç zincirini girdi olarak alır. Sonuçta türetilmiş bir yapıt üretir. Üç özellik geçerlidir:

  • Üretilen dağıtım salt okunurdur ve makine tarafından üretilir. Bu deponun dalları olarak değil, sürüm etiketleri olarak yayımlanır. Geliştirme, hata bildirimleri ve özellik istekleri, üretilen ağaca değil, her zaman özgün nextpdf/* kaynak depolarına yönlendirilir. Projenin README.md dosyasındaki dikkat bloğu ve .github/workflows/build.yml dosyası üzerinden doğrulanmıştır (sürüm işi, üretilen ağacı sıfırdan işler ve etiketler).
  • Sürüm belirtecinin kapsamı dardır. secrets.BACKPORT_TRIGGER_TOKEN, kaynak depolarının sürüm etiketinden klonlanmasına yetki verir. Yalnızca kaynakları çekme adımlarında kullanılır. build.yml dosyası üzerinden doğrulanmıştır (GH_TOKEN kullanımı).
  • Sürekli tümleştirme (CI) çalıştırıcılarının ayrılması kasıtlıdır. Güvenilen olaylar kendi barındırılan PHP çalıştırıcılarında yürütülür; çatallardan gelen çekme istekleri ve Dependabot çalıştırmaları ise GitHub tarafından barındırılan çalıştırıcılara yönlendirilir. Güvenilmeyen kod, güvenilen çalıştırıcı havuzunda asla yürütülmez. .github/workflows/0-ci.yml dosyası üzerinden doğrulanmıştır (runs-on koşulu).
  • Araç zinciri composer.json içinde kısıtlanmıştır. Rector ^2.0, PHPStan ^2.1, PHPUnit ^13.0 ve symfony/polyfill-* kümesini kullanır. Oluşturucunun hiçbir NextPDF çalışma zamanı bağımlılığı yoktur; bu nedenle güvenliği ihlal edilmiş bir NextPDF çalışma zamanı paketi oluşturucuya erişemez. composer.json dosyası üzerinden doğrulanmıştır.
  • Bağımlılık güncellemeleri botlarla yürütülür ve denetimden geçer. Dependabot yapılandırması ve otomatik birleştirme iş akışı mevcuttur. Dependabot çalıştırmaları GitHub tarafından barındırılan çalıştırıcılara sabitlenmiştir ve birleştirmeden önce yine de eksiksiz CI denetiminden (PHPStan, testler, deneme çalıştırması) geçer. .github/dependabot.yml ve .github/workflows/0-ci.yml, 9-dependabot-auto-merge.yml dosyaları üzerinden doğrulanmıştır.
  • Çıktı, derleme durumunu içermez. Sürüm arşivi, vendor/ ve .git/ dışarıda bırakılarak paketlenir. Yayımlanan yapıt, oluşturucunun kendi bağımlılık ağacını değil, kaynağı ve üretilen bildirimi taşır. build.yml dosyası üzerinden doğrulanmıştır (zip ... -x '*/vendor/*' '*/.git/*').
  • Statik çözümleme, derleme kodunu denetler. composer analyse, her iki kalıcı dala yapılan her gönderimde ve çekme isteğinde PHPStan’i rector/rules ve scripts üzerinde 10. düzeyde çalıştırır. Herhangi bir deneme çalıştırmasından önce yürütülür. composer.json ve 0-ci.yml dosyaları üzerinden doğrulanmıştır.

Derleme ana makinesi, hedeften daha yeni bir PHP sürümü çalıştırdığı için derleme betiği çıktının sözdizimini yerel olarak denetlemez. Belirleyici denetim, sürüm iş akışında yer alır. Derlemeden sonra çalıştırıcı hedef PHP’ye geçer ve php -l komutunu output/src genelinde çalıştırarak herhangi bir ayrıştırma ya da ölümcül hatada sürümü başarısız sayar. Yapıt daha sonra kurulur ve doğrulama dizisi boyunca sınanır: PHP 8.1 hattı için PHP 8.1’den 8.4’e kadar ve PHP 7.4 hattı için PHP 7.4 ve 8.0. Bir hedef çalışma zamanının reddedeceği dağıtım, sürüm aşamasına ulaşmaz. scripts/build.php (validateOutput()) ve .github/workflows/build.yml (sözdizimi denetimi ve validate-* işleri) dosyaları üzerinden doğrulanmıştır.

Bu, ardışık düzenin sınadığı çalışma zamanlarıyla sınırlı, gözlemlenen davranışa dayalı bir güvencedir. Bir uygunluk sertifikası değildir. Dönüştürülen programın doğruluğunu, sözdizimi kabulü ve projenin kendi test takımının ötesinde garanti etmez.

Üretilen iki paket farklı lisanslar taşır; bunlar scripts/adjust-composer.php içinde sabittir:

PaketLisans alanıBelirleyen
nextpdf/backportApache-2.0generatePublicComposer()
nextpdf/backport-proproprietarygenerateProComposer()

Oluşturucu deposunun kendisi Apache-2.0 lisanslıdır (composer.jsonlicense). Deponun CHANGELOG.md dosyası, LGPL-3.0-or-later lisansından Apache-2.0 lisansına geçişi kayıt altına alır. Bu değişiklikten önce yayımlanan sürümler eski lisans kapsamında kalır ve erişilebilir olmayı sürdürür; her yeni sürüm ise Apache-2.0 kapsamındadır. Pro dağıtımı tescillidir, yalnızca PHP 8.1 hedefi için üretilir ve phpseclib/phpseclib ^3.0 gerektirir. CHANGELOG.md, composer.json ve scripts/adjust-composer.php dosyaları üzerinden doğrulanmıştır.

Ardışık düzenin sunduğu güvenceler, kodun zorunlu kıldığı kapsamla sınırlıdır:

  • İlk hatada durma. Derleme, başarısız olan ilk aşamada adı belirtilen bir hatayla iptal edilir. Sürüm işleri başarılı bir derlemeye ve doğrulamaya bağlı olduğu için kısmi bir dağıtım asla yayımlanmaz. scripts/build.php (step()) ve build.yml işinin needs alanı üzerinden doğrulanmıştır.
  • Sıralı derlemeler. backport-build eşzamanlılık grubu, cancel-in-progress: false ayarıyla iki kaynak sürümünün aynı sürüm etiketi için yarışmasını önler. build.yml dosyası üzerinden doğrulanmıştır.
  • Yeniden üretilebilir girdiler. Ardışık düzen, derlemeden önce her kaynak deposunu ilgili sürüm etiketinden bire bir klonlar. build.yml dosyası üzerinden doğrulanmıştır (--branch "${TAG}").

İddia etmediği şeyler:

  • Standartlara uygunluğu, tam PHP sürümü uyumluluğunu ya da dönüştürülen programın doğruluğunu, sözdizimi kabulü ve test takımının ötesinde iddia etmez.
  • Sürüm düşürme, çalışma zamanında zorunlu kılınan değişmezliği kaldırır (readonly ifadelerinin çıkarılması). Salt okunur bir özelliğe yazma işlemini reddetmek için çalışma zamanına güvenen kod, sürümü düşürülmüş çıktıda bu savunmayı kaybeder. Bu, clone-with güvenliği için belgelenmiş, bilinçli bir ödünleşimdir — bkz. /integrations/backport/troubleshooting/.

Oluşturucudaki güvenlik sorunları için deponun SECURITY.md belgesindeki süreç geçerlidir: bunları herkese açık bir sorun olarak değil, bir GitHub güvenlik danışma belgesi aracılığıyla ya da güvenlik iletişim noktası üzerinden bildirin. Üretilen koddaki sorunları özgün kaynak depolarına bildirin; çünkü üretilen ağaç makine çıktısıdır ve üzerinde geliştirme yapılmaz. SECURITY.md ve projenin README.md dosyaları üzerinden doğrulanmıştır.

  • /integrations/backport/overview/ — oluşturucunun ne olduğu ve neler ürettiği.
  • /integrations/backport/production-usage/ — sürüm ardışık düzeninin nasıl işletileceği.