Skip to content

fix(docker): upgrade libexpat in the dashboard image - #49

Merged
TheMeinerLP merged 1 commit into
mainfrom
fix/dashboard-libexpat
Oct 17, 2026
Merged

TheMeinerLP merged 1 commit into
mainfrom
fix/dashboard-libexpat

Conversation

@TheMeinerLP

Copy link
Copy Markdown

Description

The "Container images" CI job fails at "Scan the dashboard image" on main (a1d7fbf): Trivy reports libexpat 2.8.5-r0 with CVE-2026-77214 (HIGH), fixed in 2.9.0-r0.

The pinned base nginxinc/nginx-unprivileged:1.31-alpine still ships libexpat 2.8.5-r0 (checked by pulling the tag, which resolves to the same digest), so bumping the digest does not help. This change upgrades only libexpat in the run stage of reposilite-frontend/Dockerfile. The step runs as root for the upgrade and switches back to the unprivileged user 101 immediately after. The image contract (non-root runtime user, no other changes) is unchanged.

Closes the failing dashboard scan on main.

Type of change

  • fix - bug fix
  • feat - new feature
  • refactor - internal change without behaviour change
  • perf - performance improvement
  • docs - documentation only
  • test - tests only
  • build / ci / chore - tooling, dependencies, pipelines
  • Breaking change (configuration, API or behaviour that existing deployments rely on)

How was this tested?

Docker's buildx plugin is not installed on the build host, so the image was built with the legacy builder. The only change for that is --platform=$BUILDPLATFORM replaced by --platform=linux/amd64 in a scratch copy of the Dockerfile (build host is amd64, so the result is identical). The repository file is unchanged in that respect.

  • docker build of the dashboard image from the repository root: succeeded.
  • apk info/apk policy in the built image: libexpat is 2.9.0-r0; the image runs as uid 101 (docker inspect user 101).
  • Trivy aquasec/trivy:0.70.0 image --severity CRITICAL,HIGH --ignore-unfixed --exit-code 1: 0 findings, exit code 0.
  • Smoke test: the container starts nginx as uid 101 and GET / returns 200.

Checklist

  • Commit messages follow the Conventional Commits convention documented in CLAUDE.md (English, imperative, one of feat, fix, docs, refactor, test, build, ci, chore, perf)
  • Tests cover the change, or the change is not testable and I explained why above
  • ./gradlew build passes locally (not affected: only the dashboard Dockerfile changed)
  • Documentation and configuration samples are updated if the change is user-facing (not user-facing)
  • Existing copyright headers are preserved; new files carry the appropriate header
  • No credentials, tokens or personal data are included in the diff

The pinned nginx-unprivileged 1.31-alpine base ships libexpat 2.8.5-r0,
which is affected by CVE-2026-77214 (HIGH), fixed in 2.9.0-r0. The base
digest for this tag has no fixed build yet, so upgrade just libexpat in
the run stage. The step runs as root only for the upgrade and switches
back to the unprivileged user 101 immediately after.
@TheMeinerLP
TheMeinerLP merged commit a71d395 into main Oct 17, 2026
7 checks passed
@TheMeinerLP
TheMeinerLP deleted the fix/dashboard-libexpat branch October 17, 2026 20:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant