CVSS Assessment
| Metric |
Value |
| Score |
9.0 / 10.0 |
| Severity |
Critical |
| Vector |
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H |
CVSS v3.1 Calculator
Summary
All Dockerfiles use mutable version tags (node:22-bookworm, debian:bookworm-slim, ubuntu:24.04) instead of SHA-pinned digests, allowing supply chain attacks where a compromised upstream image is silently pulled into production builds.
Affected Code
Production Dockerfiles:
File: Dockerfile:1
File: Dockerfile.sandbox:1
FROM debian:bookworm-slim
File: Dockerfile.sandbox-browser:1
FROM debian:bookworm-slim
Test/CI Dockerfiles:
File: scripts/docker/cleanup-smoke/Dockerfile:1
FROM node:22-bookworm-slim
File: scripts/docker/install-sh-e2e/Dockerfile:1
FROM node:22-bookworm-slim
File: scripts/docker/install-sh-nonroot/Dockerfile:1
File: scripts/docker/install-sh-smoke/Dockerfile:1
FROM node:22-bookworm-slim
File: scripts/e2e/Dockerfile:1
File: scripts/e2e/Dockerfile.qr-import:1
Attack Surface
How is this reached?
Authentication required?
Entry point: Docker image pull during CI/CD build or local development
Exploit Conditions
Complexity:
User interaction:
Prerequisites: Attacker must compromise Docker Hub/upstream registry or execute a man-in-the-middle attack during image pull
Impact Assessment
Scope:
What can an attacker do?
| Impact Type |
Level |
Description |
| Confidentiality |
High |
Compromised base image can exfiltrate secrets, API keys, and user data from production containers |
| Integrity |
High |
Attacker-controlled code runs as part of the application, can modify responses and inject malware |
| Availability |
High |
Malicious image can crash services, introduce backdoors, or execute ransomware |
Steps to Reproduce
- Observe all 9 Dockerfiles use mutable tags (e.g.,
FROM node:22-bookworm)
- Note that each build may pull a different image if the tag is updated upstream
- If Docker Hub or an intermediate registry is compromised, a malicious image could be pulled without detection
- The CI workflow (
.github/workflows/docker-release.yml) rebuilds on every push to main, pulling fresh base images
- Dependabot is configured (
.github/dependabot.yml) but does NOT include package-ecosystem: docker, so there's no automated digest update mechanism
Recommended Fix
Pin all base images to immutable SHA256 digests:
# Production Dockerfiles
FROM node:22-bookworm@sha256:<digest>
FROM debian:bookworm-slim@sha256:<digest>
# Test/CI Dockerfiles
FROM node:22-bookworm-slim@sha256:<digest>
FROM ubuntu:24.04@sha256:<digest>
Add Docker ecosystem to Dependabot configuration (.github/dependabot.yml):
# Docker base images
- package-ecosystem: docker
directory: /
schedule:
interval: weekly
groups:
docker-images:
patterns:
- "*"
Alternatively, use Renovate or docker-lock for automated digest updates.
To obtain current digests:
docker pull node:22-bookworm && docker inspect --format='{{index .RepoDigests 0}}' node:22-bookworm
docker pull debian:bookworm-slim && docker inspect --format='{{index .RepoDigests 0}}' debian:bookworm-slim
docker pull ubuntu:24.04 && docker inspect --format='{{index .RepoDigests 0}}' ubuntu:24.04
docker pull node:22-bookworm-slim && docker inspect --format='{{index .RepoDigests 0}}' node:22-bookworm-slim
References
- CWE: CWE-1104 - Use of Unmaintained Third Party Components
CVSS Assessment
Summary
All Dockerfiles use mutable version tags (
node:22-bookworm,debian:bookworm-slim,ubuntu:24.04) instead of SHA-pinned digests, allowing supply chain attacks where a compromised upstream image is silently pulled into production builds.Affected Code
Production Dockerfiles:
File:
Dockerfile:1FROM node:22-bookwormFile:
Dockerfile.sandbox:1FROM debian:bookworm-slimFile:
Dockerfile.sandbox-browser:1FROM debian:bookworm-slimTest/CI Dockerfiles:
File:
scripts/docker/cleanup-smoke/Dockerfile:1FROM node:22-bookworm-slimFile:
scripts/docker/install-sh-e2e/Dockerfile:1FROM node:22-bookworm-slimFile:
scripts/docker/install-sh-nonroot/Dockerfile:1FROM ubuntu:24.04File:
scripts/docker/install-sh-smoke/Dockerfile:1FROM node:22-bookworm-slimFile:
scripts/e2e/Dockerfile:1FROM node:22-bookwormFile:
scripts/e2e/Dockerfile.qr-import:1FROM node:22-bookwormAttack Surface
How is this reached?
Authentication required?
Entry point: Docker image pull during CI/CD build or local development
Exploit Conditions
Complexity:
User interaction:
Prerequisites: Attacker must compromise Docker Hub/upstream registry or execute a man-in-the-middle attack during image pull
Impact Assessment
Scope:
What can an attacker do?
Steps to Reproduce
FROM node:22-bookworm).github/workflows/docker-release.yml) rebuilds on every push to main, pulling fresh base images.github/dependabot.yml) but does NOT includepackage-ecosystem: docker, so there's no automated digest update mechanismRecommended Fix
Pin all base images to immutable SHA256 digests:
Add Docker ecosystem to Dependabot configuration (
.github/dependabot.yml):Alternatively, use Renovate or
docker-lockfor automated digest updates.To obtain current digests:
References