You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
fix(security): pin image build downloads by version and checksum - #189
The PHP images run two installers downloaded at build time without any verification: install-php-extensions from the latest release and the nvm installer from the master branch, piped into bash. The nginx image was built from the floating nginx:alpine tag and is republished every night. A change upstream would end up in the published :latest images without any review in this repository.
This change:
Downloads install-php-extensions 2.13.2 and the nvm v0.41.0 installer with ADD --checksum, so the build fails if the content differs from the pinned SHA-256. The nvm installer is no longer piped into a shell.
Pins the nginx base image to nginx:1.31.8-alpine by digest, which Dependabot already tracks under /.docker/.
Adds a policy test that rejects floating references for these downloads.
Validation
New test in tests/proxy/compose-policy.bats fails on main and passes with this change; the rest of the file still passes.
Built Dockerfile.php83 and Dockerfile.nginx locally: the PHP image installs the same 59 PHP modules and Node 24 with npm and nvm 0.41.0, and the installers are not left in the image.
A build with a wrong checksum fails with a digest mismatch.
Please make both dependencies automatically maintainable in Dockerfile.php82 and Dockerfile.php83:
PHP Extension Installer: Keep the existing ADD --checksum. Configure Renovate custom.regex with datasource github-release-attachments (mlocati/docker-php-extension-installer), extracting currentValue from the release URL and currentDigest from the SHA-256. Both must be updated together.
NVM: Replace the remote installer with a Git checkout of the immutable commit, before sourcing nvm.sh. Declare the version and commit on separate lines:
Configure a second Renovate custom.regex using github-tags (nvm-sh/nvm), mapping the version comment to currentValue and the commit SHA to currentDigest. Both must update together.
Add .github/renovate.json5 with enabledManagers: ["custom.regex"], limited to these two dependencies. Keep Dependabot responsible for the existing PHP and Nginx image updates.
Update the Bats policy test and validate Renovate extraction/update plus both PHP image builds.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The PHP images run two installers downloaded at build time without any verification:
install-php-extensionsfrom thelatestrelease and the nvm installer from themasterbranch, piped intobash. The nginx image was built from the floatingnginx:alpinetag and is republished every night. A change upstream would end up in the published:latestimages without any review in this repository.This change:
install-php-extensions2.13.2 and the nvm v0.41.0 installer withADD --checksum, so the build fails if the content differs from the pinned SHA-256. The nvm installer is no longer piped into a shell.nginx:1.31.8-alpineby digest, which Dependabot already tracks under/.docker/.Validation
tests/proxy/compose-policy.batsfails onmainand passes with this change; the rest of the file still passes.Dockerfile.php83andDockerfile.nginxlocally: the PHP image installs the same 59 PHP modules and Node 24 with npm and nvm 0.41.0, and the installers are not left in the image.