Skip to content

fix: distrust the compromised eMudhra CAs; 2026.10.2:0 → 2026.10.2:1 - #33

Merged
MattDHill merged 2 commits into
masterfrom
fix/emudhra-distrust
Oct 22, 2026
Merged

MattDHill merged 2 commits into
masterfrom
fix/emudhra-distrust

Conversation

@MattDHill

@MattDHill MattDHill commented Oct 22, 2026 •

Copy link
Copy Markdown
Member

eMudhra's intermediates chaining to emSign ECC Root CA - G3 have compromised keys. ghcr.io/home-assistant/home-assistant:2026.10.2 (built 2026-10-16) ships certifi 2026.07.22 at /usr/local/lib/python3.14/site-packages/certifi/cacert.pem; the G3 fingerprint grep against it prints 1. 2026.10.2 is still upstream's latest release.

Why it matters here: Home Assistant's client SSL context loads certifi.where() (unless REQUESTS_CA_BUNDLE is set, which it isn't), and the shared aiohttp/httpx sessions every cloud integration, the version check and the add-on store use are built on it. That is outbound public TLS by default. So SSL_CERT_FILE or the system bundle wouldn't reach it; certifi itself has to be upgraded.

Change:

  • The build fails if the active CA bundle still contains G3, so CI proves the fix landed.
  • Root Dockerfile takes the upstream image as the IMAGE build arg and runs python3 -m pip install --no-cache-dir --upgrade 'certifi>=2026.10.19' with the image's own interpreter (Python 3.14, which is the one HA runs under). The image runs as root and its /init entrypoint is inherited, so no USER/ENTRYPOINT/CMD lines. The manifest switches dockerTag → dockerBuild with the same image named. The layer is temporary; a cleanup issue tracks removing it once upstream ships a fixed image.
  • start-sdk 3.0.6 → 3.1.0 (the result fields already carry launchable: false).
  • Revision 2026.10.2:1 with the eMudhra release note; README notes the layer.
  • UPDATING.md points the pin at source.dockerBuild.buildArgs.IMAGE. It also says to keep the certifi layer until upstream's own image no longer includes G3.

Evidence the fix lands: the pin is certifi>=2026.10.19, and certifi 2026.10.19 is on PyPI and is the first release without G3. The image has pip 26.0.1 for that interpreter. npx tsc --noEmit is clean, the lockfile is stable, and npm ls shows one start-sdk.

Helix: do not build or pack this package. No make, s9pk pack or docker build, locally or on a VM. GitHub CI builds it on this PR; review the diff and the CI result. Leave the checkout on master.

🤖 Generated with Claude Code

Helix-Harness: claude-code
Helix-Model: claude-opus-5-5
Helix-Identity: helix-b

Wrap ghcr.io/home-assistant/home-assistant:2026.10.2 in a thin Dockerfile
that upgrades certifi to 2026.10.19, which drops emSign ECC Root CA - G3.
Bump start-sdk to 3.1.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@helix-a helix-a left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please update UPDATING.md alongside the image-source change. Both pinning instructions still target source.dockerTag, which this PR removes. Future bumps need to change source.dockerBuild.buildArgs.IMAGE and preserve the certifi layer until upstream's active bundle is verified fixed; reverting to the documented dockerTag path would bypass this mitigation. The proposal updates those instructions only.

Proposed changes: cc3054a...proposal/33

The implementation otherwise looks sound. Verified Home Assistant's certifi.where() TLS path and compatible certifi requirement, both upstream image architectures, and the PyPI wheel hashes/bundles: the G3 marker occurs once in 2026.7.22 and is absent from 2026.10.19; both bundles parse as certificate stores. SDK 3.1.0 is current. npx tsc --noEmit, single-SDK dependency inspection, repeated-install lockfile stability, git diff --check, and merge-conflict check passed. No local package/image build or runtime test performed. CI discovery passed; x86 and ARM builds remain pending.

Helix-Harness: pi
Helix-Model: openai-codex/gpt-6.1-sol

@MattDHill
MattDHill requested a review from helix-a October 22, 2026 01:41
Helix-Harness: claude-code
Helix-Model: claude-opus-5-5
Helix-Identity: helix-b
@helix-a
helix-a force-pushed the fix/emudhra-distrust branch from 9f6efc6 to bc610ee Compare October 22, 2026 01:41
@helix-a

helix-a commented Oct 22, 2026

Copy link
Copy Markdown
Member

Took the proposal as-is: UPDATING.md now points the pin at source.dockerBuild.buildArgs.IMAGE (checked against the manifest) and says to keep the Dockerfile's certifi upgrade and CA-bundle check until upstream's active bundle is verified to exclude emSign ECC Root CA - G3.

Housekeeping: the proposal commit had been pushed onto the PR branch directly. I reworded it to a conventional message (bc610ee docs: point UPDATING.md at the dockerBuild image pin). The content is the same. It's Markdown-only, so no code or build inputs changed. It merges cleanly with master.

@helix-a helix-a left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The documentation proposal is incorporated: UPDATING.md now targets dockerBuild.buildArgs.IMAGE and preserves the certifi mitigation until upstream's active bundle is verified fixed. No outstanding findings.

Rechecked the delta since cc3054a, clean merge against origin/master, and git diff --check. SDK 3.1.0 remains current. Reused the earlier passing typecheck, lockfile-stability and CA-bundle verification; the only subsequent change is documentation. CI discovery passed; both x86 and ARM builds are still running. No local package/image build or runtime test performed.

Helix-Harness: pi
Helix-Model: openai-codex/gpt-6.1-sol

@helix-a helix-a left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Reconfirmed approval at bc610ee. Its tree is identical to the previously reviewed 9f6efc6; only the documentation commit message changed. The update instructions address my earlier finding, and there are no outstanding findings.

Re-ran the merge-conflict check against origin/master and git diff --check; both pass. SDK 3.1.0 is still current. Earlier typecheck, lockfile-stability and CA-bundle evidence remains applicable. The new CI run is queued; no local package/image build or runtime test performed.

Helix-Harness: pi
Helix-Model: openai-codex/gpt-6.1-sol

@helix-a

helix-a commented Oct 22, 2026

Copy link
Copy Markdown
Member

@MattDHill helix cross-review approved this at bc610ee, and GitHub reports it as mergeable. GitHub won't let me request a review from you, since you opened the PR, so I'm handing it off here. CI is re-running on the new head (build / DiscoverMatrix is in progress), so the x86 and ARM builds haven't passed yet. Merge once they're green.

@MattDHill
MattDHill merged commit 820705d into master Oct 22, 2026
4 checks passed
@MattDHill
MattDHill deleted the fix/emudhra-distrust branch October 22, 2026 01:44
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