Skip to content

Commit 5ff8bb5

Browse files
authored
fix: update Node runtimes for CVE-2026-111497 (#544)
Void's shipped default Sandbox still uses Node 26.10.0, and the GitHub build-agent image uses the floating `node:26-slim` tag. Upgrade the maintained runtime pins to the fixed versions listed in the [October 2026 Node security release](https://nodejs.org/en/blog/vulnerability/october-2026-security-releases) for CVE-2026-111497. - Set `.node-version` to **24.22.1**, which is already consumed by the CI setup and release workflows. - Upgrade the default Sandbox to **node:26.12.1-trixie-slim** and pin the build agent to **node:26.12.1-slim**. Docker Hub manifest inspection confirmed both fixed tags exist, support amd64/arm64, and resolve to the same Debian Trixie image index; the distro is preserved. - Sync the Sandbox Dockerfile example and build-agent README, including the example's existing SDK helper version with the installed 1.0.2 helper. Package compatibility ranges, dependency versions and the lockfile are unchanged. Platform CI already uses `docker build --pull`; there are no additional static cached Node image references to update. ## Validation - `vp install --frozen-lockfile`: passed, including the core package build. - Focused Sandbox configuration, packaging, RPC/runtime and build-container tests: **5 files / 315 tests passed** under Node 24.22.1. - `vp run test --list`: selected all 731 files because `.node-version` changed; that selection was covered by the full verification below. - `vp run test:all`: formatting, lint, all package/playground builds, artifact checks, platform type-aware lint and `vp run check` passed. - Both updated Dockerfiles built successfully using `--pull --platform linux/amd64`. Inspection containers reported **Node v26.12.1** and **Debian 13 (trixie)**. The Sandbox helper was executable and a harmless Brotli round trip passed. The build agent retained Corepack 0.35.0, Bun 1.3.14, builder uid 1000 and its packaged agent entry; pnpm 11.8.0 and Yarn 1.22.22 ran offline as the unprivileged builder. - `git diff --check`: passed. **The full test suite did not pass:** 728 files passed, 2 failed and 1 skipped; **14,262 tests passed, 2 failed and 31 skipped**. The overall `vp run test:all` exit code was 1. 1. `platform/packages/api/test/integration/admin-dashboard.test.ts:491`: the ResizeObserver sizes array remained empty until `expect.poll` timed out. The entire file passed on a focused rerun. 2. `packages/void/test/integration/astro.test.ts`: the initial SSR fetch lost its loopback connection. On the focused rerun, the dev cases passed but the PostgreSQL suite failed in `beforeAll` at line 297: Astro restarted after dependency optimization/tsconfig reload, and Miniflare/Cloudflare Vite plugin type discovery lost a loopback socket (`Server stopped while waiting`, `other side closed`). The same PostgreSQL startup failure was reproduced with the original **Node 24.21.0**, confirmed with both `node --version` and `vp exec node --version`. The fixed 24.22.1 pin was restored afterward. No application or test-source changes were made to hide these failures. This PR prepares the source fix. Existing published packages and running containers still require their normal release/rebuild/rollout before their runtime exposure is remediated.
1 parent dc0c3c1 commit 5ff8bb5

5 files changed

Lines changed: 8 additions & 8 deletions

File tree

‎.node-version‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24.21.0
1+
24.22.1

‎docs/guide/sandboxes.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@ See the [configuration reference](../reference/config.md#sandbox) for binding na
120120
Custom images must include the helper matching Void's installed Sandbox SDK version. The SDK image supplies this binary, but is not a runnable environment itself:
121121

122122
```dockerfile
123-
FROM node:26.10.0-trixie-slim
124-
COPY --from=docker.io/cloudflare/sandbox:1.0.1 /usr/local/bin/sandbox-shim /usr/local/bin/sandbox-shim
123+
FROM node:26.12.1-trixie-slim
124+
COPY --from=docker.io/cloudflare/sandbox:1.0.2 /usr/local/bin/sandbox-shim /usr/local/bin/sandbox-shim
125125
WORKDIR /workspace
126126
CMD ["sleep", "infinity"]
127127
```

‎packages/void/sandbox.Dockerfile‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM node:26.10.0-trixie-slim
1+
FROM node:26.12.1-trixie-slim
22
COPY --from=docker.io/cloudflare/sandbox:1.0.2 /usr/local/bin/sandbox-shim /usr/local/bin/sandbox-shim
33
WORKDIR /workspace
44
CMD ["sleep", "infinity"]

‎platform/packages/api/README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ src/
6969
routes/ # Admin page shells, audited form actions, and log polling
7070
middleware/auth.ts # Admin cookie auth + same-origin guard on every write
7171
container/
72-
Dockerfile # node:26-slim + pinned corepack + bun build image
72+
Dockerfile # node:26.12.1-slim + pinned corepack + bun build image
7373
build-agent.mjs # Downloads source tarball, installs deps, runs `npx void deploy`
7474
drizzle/
7575
0000_*.sql

‎platform/packages/api/container/Dockerfile‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
# Env vars injected by the DO at start():
1010
# BUILD_ID, PROJECT_ID, PROJECT_SLUG, SOURCE_TARBALL_URL, SOURCE_TOKEN,
1111
# VOID_TOKEN, VOID_API_URL, VOID_PROJECT, DO_LOG_URL, AGENT_TOKEN
12-
FROM node:26-slim
12+
FROM node:26.12.1-slim
1313

14-
# node:26-slim ships `tar` + `gzip` but is otherwise minimal. We add:
14+
# node:26.12.1-slim ships `tar` + `gzip` but is otherwise minimal. We add:
1515
# ca-certificates HTTPS for the tarball fetch, npm/bun installs, deploy upload
1616
# curl documented fallback download path + the bun install script
1717
# unzip required by the bun install script
@@ -59,7 +59,7 @@ RUN curl -fsSL https://bun.sh/install | bash -s "bun-v${BUN_VERSION}" \
5959
# unprivileged install has somewhere writable — build-agent.mjs points the child's
6060
# cache env vars (builderCacheEnv) at these paths. /tmp/build is the agent's
6161
# WORK_DIR parent; chowning it lets the builder own the extracted tree.
62-
# node:26-slim ships a built-in `node` user that already owns uid/gid 1000, so
62+
# node:26.12.1-slim ships a built-in `node` user that already owns uid/gid 1000, so
6363
# it must be removed first or the useradd fails with "UID 1000 is not unique"
6464
# and the image cannot build. Nothing here runs as `node`.
6565
RUN userdel node \

0 commit comments

Comments
 (0)