Skip to content

fix: move image to Node 22 for eMudhra CA distrust - #960

Merged
dialmaster merged 2 commits into
devfrom
fix/node22-ca-trust-store
Oct 22, 2026
Merged

dialmaster merged 2 commits into
devfrom
fix/node22-ca-trust-store

Conversation

@dialmaster

Copy link
Copy Markdown
Collaborator

The private keys of eight eMudhra intermediate certificate authorities can be recovered from their public certificates (disclosure, 2026-10-20). Browsers were protected by Certificate Transparency, but the HTTPS clients inside the Youtarr image don't check it, and every one of them still trusted certificates issued under those authorities. Someone able to intercept a server's traffic could have impersonated YouTube, plex.tv, or GitHub, where yt-dlp gets its updates.

  • The image moves from node:20-slim to node:22-bookworm-slim. Node 20 reached end of life in April and won't get the corrected root list; Node 22.23.4 has it. Staying on bookworm keeps Python at 3.11, which the curl_cffi build stage needs.
  • The image's other trust stores (Debian ca-certificates for curl, certifi for yt-dlp and Apprise, and Deno's own) are fixed by any rebuild without cache, which the release workflow already does.
  • CI and the release workflows run on Node 22 to match.

Testing

Each client in the image was run against the disclosure site's test hosts, which serve certificates from the compromised intermediates (one through the eMudhra root, one through the Sectigo cross-sign):

Client v1.90.0 build This branch
Node 20.20.2, trusted 22.23.4, rejected
yt-dlp and Apprise (certifi) 2026.07.22, trusted 2026.10.19, rejected
curl (Debian ca-certificates) 20230311+deb12u1, trusted both 20250419~deb12u2, rejected
Deno 2.9.1, trusted 2.9.8, rejected
  • YouTube, api.github.com, plex.tv, and i.ytimg.com still connect from all four clients.
  • bcrypt, the only native addon, loads and hashes on Node 22 (it ships N-API prebuilds), and every server module loads.
  • A local instance rebuilt from this branch runs normally.
  • The full test suite has not run on Node 22 yet; CI on this PR is the first run.

Node 22 support ends on 2027-04-30, so the move to Node 24 should come before then.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Upis7aQ8f9zmaGAZQs36NQ

The keys of eight eMudhra intermediate CAs can be recovered from their
public certificates (disclosed 2026-10-20). Every TLS client in the
image (Node, yt-dlp and Apprise through certifi, curl, Deno) still
trusted chains through them, and none of them checks Certificate
Transparency, so an on-path attacker could impersonate YouTube, GitHub
(yt-dlp self-update) or plex.tv.

Node 20 is end of life and will not get the updated bundled roots, so
the image moves to node:22-bookworm-slim (22.23.4 carries the fix;
bookworm keeps Python 3.11 for the curl_cffi stage). The no-cache
release build picks up the fixed Debian ca-certificates, certifi and
Deno. CI and release workflows move to Node 22 to match.
@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

📊 Test Coverage Report

Backend Coverage

Type Coverage Status
Lines 91.26% 🟢
Statements 91.14% 🟢
Functions 91.11% 🟢
Branches 85.13% 🟢

Frontend Coverage

Type Coverage Status
Lines 89.77% 🟢
Statements 88.23% 🟢
Functions 81.99% 🟢
Branches 82.93% 🟢

Coverage Requirements

  • Minimum threshold: 70% line coverage
  • Backend: ✅ Passes
  • Frontend: ✅ Passes

Coverage report generated for commit 489a7fc

Storybook 10.0.0 through 10.6.1 is affected by a critical advisory
(GHSA-f2ph-cmg5-wxc8, missing origin validation in the preview), which
fails the client critical-level audit in CI. Storybook is a dev
dependency and is not part of the image.

The @storybook/* packages move with the core so their versions match.
10.6.3 is newer but still inside the 5-day min-release-age window.
@dialmaster
dialmaster merged commit 02a320f into dev Oct 22, 2026
13 checks passed
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