Skip to content

Stop trusting compromised eMudhra roots in CI images - #897

Open
eliottness wants to merge 2 commits into
DataDog:mainfrom
eliottness:eliottness/emudhra-ca-roots
Open

eliottness wants to merge 2 commits into
DataDog:mainfrom
eliottness:eliottness/emudhra-ca-roots

Conversation

@eliottness

Copy link
Copy Markdown

What

Images used by this repository's CI still ship CA stores that trust emSign ECC Root CA - G3 and/or AAA Certificate Services, the roots behind the compromised eMudhra intermediates (incident IR-62343). The APPSEC-71273 ledger lists 16 impacted image references here. Images that CI never builds or pulls are left alone.

Changes

  • .gitlab-ci.yml
    • alpine:3.22.1@sha256:4bcff63911fcb4448bd4fdacec207030997caf25e9bea4045fa6c8c44de311d1 -> alpine:3.24.3@sha256:be2656061b536c1883c4034790e21d0a09c5aaaf51968b89368a3c0371ea2c9a: Pipeline default image upgraded to current stable Alpine 3.24.3; exact digest scans clean.
  • .gitlab/base/Dockerfile
    • patched in place (no clean version to move to): REBUILD_IMAGES must republish this image and update the pinned CI/benchmark digest
  • .gitlab/base/Dockerfile.musl
    • patched in place (no clean version to move to): REBUILD_IMAGES must republish this image and update the pinned CI/benchmark digest Review: dropped the Alpine edge nodejs-current install; the base (Alpine 3.24) main repo ships nodejs 24.22.1-r0 (fixed), pulled in by the existing npm insta
  • .gitlab/base/el7/Dockerfile
    • patched in place (no clean version to move to): REBUILD_IMAGES must republish this image and update the pinned CI/benchmark digest
  • .gitlab/base/el8/Dockerfile
    • patched in place (no clean version to move to): REBUILD_IMAGES must republish this image and update the pinned CI/benchmark digest
  • .gitlab/benchmarks/.gitlab-ci.yml
    • registry.ddbuild.io/images/benchmarking-platform-tools-ubuntu:newest -> alpine:3.24.3@sha256:be2656061b536c1883c4034790e21d0a09c5aaaf51968b89368a3c0371ea2c9a: Generated skip-benchmarks child job only echoes a skip message; current stable Alpine scans clean.
  • .gitlab/benchmarks/child.gitlab-ci.yml
    • registry.ddbuild.io/images/benchmarking-platform-tools-ubuntu:newest -> alpine:3.24.3@sha256:be2656061b536c1883c4034790e21d0a09c5aaaf51968b89368a3c0371ea2c9a: benchmarks-inputs-guard only checks two variables and echoes values; Alpine sh runs the same guard.
  • .gitlab/build-deploy/.gitlab-ci.yml
    • alpine:3.22.1@sha256:4bcff63911fcb4448bd4fdacec207030997caf25e9bea4045fa6c8c44de311d1 -> alpine:3.24.3@sha256:be2656061b536c1883c4034790e21d0a09c5aaaf51968b89368a3c0371ea2c9a: Pipeline default image upgraded to current stable Alpine 3.24.3; exact digest scans clean.

Verification

Every new image reference and every changed Dockerfile was pulled or built and scanned with the eMudhra scanner (checks every file in the image for the roots' public keys); all return empty hits. Of the 16 impacted references: 1 fixed here, 7 fixed at their in-repo image source (clean once the image job republishes), 8 follow-ups below.

  • .gitlab/base/Dockerfile.musl: full image build left to PR CI

Follow-ups (not in this PR)

  • needs rebuild at source (7):
    • registry.ddbuild.io/images/benchmarking-platform-tools-ubuntu:newest: DataDog/images/benchmarking-platform-tools-ubuntu:newest; newest/latest resolve to bad digest 1e27d877; active PREPARE_IMAGE or benchmark-image base needs a republished clean tool image.
    • registry.ddbuild.io/ci/async-profiler-build:v137281788-datadog-ci@sha256:84b7902bec3b4cef3e5dbeb0a8a2c2542f388: java-profiler/.gitlab/Dockerfile.datadog-ci
    • registry.ddbuild.io/slack-notifier:v91289620-4ec922a-latest@sha256:06b24f392ccc383d371c72001520a254edef523bc0b: DataDog/slack-notifier:latest; latest resolves to the pinned bad digest 06b24f39 (10 trust-store hits).
    • eclipse-temurin:21-jdk-alpine@sha256:c98f0d2e171c898bf896dc4166815d28a56d428e218190a1f35cdc7d82efd61f: java-profiler/.gitlab/base/Dockerfile.musl (lane src-java-profiler), then update pinned digests; JDK 21 is deliberately pinned by .gitlab/build-deploy/images.yml comments; the current 21-jdk-alpine digest remains bad.
    • almalinux:8@sha256:9f355ae942d6a6c0561f0771dc053a2cfae9580fc45fa4252756db7c7e80c09f: java-profiler/.gitlab/base/el8/Dockerfile (lane src-java-profiler), then update pinned digests; AlmaLinux 8 pins the shipped binary glibc 2.28 floor; scanned AlmaLinux 9/10 also remain bad.
    • registry.ddbuild.io/ci/async-profiler-build-amd64:v137281788-amd64-benchmarks@sha256:28e10be33f32e73ba3850796b: java-profiler/.gitlab/benchmarks/docker/Dockerfile
    • registry.ddbuild.io/ci/async-profiler-build-arm64:v137281788-arm64-benchmarks@sha256:c03d7ac565f4b36fc3086a00f: java-profiler/.gitlab/benchmarks/docker/Dockerfile
  • unscannable (1):
    • 486234852809.dkr.ecr.us-east-1.amazonaws.com/images/docker:24.0.4-gbi-focal: pull: Error response from daemon: failed to resolve reference "486234852809.dkr.ecr.us-east-1.amazonaws.com/images/docker:24.0.4-gbi-focal": pull access denied, repository does not exist or may require authorization: aut

Jira: APPSEC-71294 (parent APPSEC-71273)

Upgrade the default CI image to alpine 3.24.3, use a plain alpine image for the no-op reliability job, and patch the
async-profiler-build base Dockerfiles (CA bundle, Node 22.23.4, botocore bundle, JDK cacerts) so the next REBUILD_IMAGES
run publishes clean images (IR-62343).

Jira: APPSEC-71294
@jbachorik

Copy link
Copy Markdown
Collaborator

@copilot resolve the merge conflicts in this pull request

@jbachorik
jbachorik marked this pull request as ready for review October 24, 2026 12:18
@jbachorik
jbachorik requested a review from a team as a code owner October 24, 2026 12:18
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-24T12:28:41.298642Z 8715e05 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@datadog-prod-us1-6 datadog-prod-us1-6 Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bits Code Review: PASS

More details

Image-level verification remains incomplete: full builds and certificate scans were not independently confirmed, so this review does not establish that rebuilt CI images contain none of the compromised roots.

Was this helpful? React 👍 or 👎

Open Bits AI session

🤖 Bits Code Review · Commit 8715e05

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8715e053d4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .gitlab/base/Dockerfile
ARG CI_JOB_TOKEN
WORKDIR /root

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y ca-certificates \

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Add copyright headers to all modified files

The repository requires a copyright line whenever an existing file without one is modified. This Dockerfile still has no header, and the same omission is present in .gitlab/base/Dockerfile.musl, .gitlab/base/el7/Dockerfile, .gitlab/base/el8/Dockerfile, .gitlab/benchmarks/.gitlab-ci.yml, .gitlab/benchmarks/child.gitlab-ci.yml, and .gitlab/build-deploy/.gitlab-ci.yml; add the 2026 Datadog line to these seven changed files, as was already done for .gitlab-ci.yml.

AGENTS.md reference: AGENTS.md:L334-L336

Useful? React with 👍 / 👎.

This branch has not been deployed

No deployments
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.

2 participants