Skip to content

fix(docker): pin base image to node 22.23.4 for CVE-2026-111497 - #576

Merged
jpr5 merged 1 commit into
mainfrom
fix/node-cve-2026-10
Oct 23, 2026
Merged

jpr5 merged 1 commit into
mainfrom
fix/node-cve-2026-10

Conversation

@jpr5

@jpr5 jpr5 commented Oct 22, 2026

Copy link
Copy Markdown
Contributor

The published ghcr.io/copilotkit/aimock:latest (1.46.0) runs Node 22.23.3. That version has CVE-2026-111497, a Brotli decompression memory bug. Node 22.23.4 fixes it.

The Dockerfile used the floating node:22-alpine tag. When 1.46.0 was built, that tag resolved to 22.23.3. This PR pins both build stages to node:22.23.4-alpine@sha256:fe4f6d74e20370acb04ad889077d14d0f64a9c8ea6a42bc60cddf1e844699914 (the multi-arch index digest). Renovate keeps the digest up to date.

The npm package and CI are not affected. engines is >=20.15.0, and setup-node uses floating majors, so neither pins a version below the fix. The Docker image is rebuilt in a follow-up patch release (1.46.1).

Red / green (local, Docker Desktop buildx)

RED: the published image

$ docker pull ghcr.io/copilotkit/aimock:latest   # label version 1.46.0
$ docker run --rm --entrypoint node ghcr.io/copilotkit/aimock:latest -v
v22.23.3

A local build of the unpinned Dockerfile now gives v22.23.4, because node:22-alpine has moved since 1.46.0 was built (same index digest fe4f6d74…). So the defect is in the published image. Without a pin, the Dockerfile could resolve to any patch version.

GREEN: this branch

$ docker buildx build --builder desktop-linux --load -t aimock:green .
$ docker run --rm --entrypoint node aimock:green -v
v22.23.4
$ docker run -d -p 14010:4010 aimock:green
$ curl -s localhost:14010/health
{"status":"ok"}
$ curl -s -X POST localhost:14010/v1/chat/completions -d '{"model":"gpt-4o","messages":[{"role":"user","content":"hello"}]}'
{"id":"chatcmpl-…","object":"chat.completion",…"content":"Hello! How can I help you today?"…}

Checks

  • format:check, lint, typecheck, build: pass
  • test: 17603 passed. 8 tests timed out at 5s while the full suite ran under machine load. Their 7 files pass when run alone (561/561). This change touches only Dockerfile and CHANGELOG.md.

The 1.46.0 image was built on node:22-alpine when that tag resolved to
22.23.3, which is affected by CVE-2026-111497 (Brotli decompression
memory bug). Pin both stages to node:22.23.4-alpine by index digest so
the release image cannot float back below the fix.
@jpr5
jpr5 force-pushed the fix/node-cve-2026-10 branch from d583399 to e343ad7 Compare October 22, 2026 18:17
@pkg-pr-new

pkg-pr-new Bot commented Oct 22, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@copilotkit/aimock@576

commit: e343ad7

@jpr5
jpr5 merged commit 508dd9b into main Oct 23, 2026
14 checks passed
@jpr5
jpr5 deleted the fix/node-cve-2026-10 branch October 23, 2026 18:57
@jpr5 jpr5 mentioned this pull request Oct 27, 2026
jpr5 added a commit that referenced this pull request Oct 27, 2026
Release v1.47.0. Merging this PR publishes through
`publish-release.yml`: npm, the git tag, the GitHub Release and Slack.

## Changelog

### Added

- Fixture `citations` serve sources on Responses, Chat Completions,
Claude and Gemini (#550, #578)
- Fixture `files` serve generated images on Gemini and OpenAI Responses
(#550, #578)
- Raw passthrough fixtures send provider SSE events or JSON exactly as
written (#580)
- Opt-in `nonStreamingTimingAllProviders` delays non-streaming replies
on every provider (#579)

### Fixed

- Client disconnects stop and journal every LLM reply; Docker image on
Node 22.23.4 (#579, #576)

The detailed notes from `[Unreleased]` are condensed into these bullets.
The full detail is in the linked PRs. The drift-harness and CI changes
(#583–#587) do not change what users see, so they are left out.

## Docs (separate commit)

- The fixtures page gets a new **Citations and generated files**
section: the fixture shape, the wire shape for each provider, the error
codes, and override-table and provider-matrix rows. The Responses, Chat
Completions, Claude and Gemini pages link to it.
- What's New has three 1.47.0 cards: citations and generated images, raw
passthrough, and stream realism (disconnects and timing on every
provider). The two 1.46.0 cards are merged into one. The GPT-Live card
is removed because it shipped in 1.43.0, more than a month ago.
- The README has new feature bullets for citations and files, raw
passthrough and client disconnects. The Streaming Physics bullet now
mentions `nonStreamingTimingAllProviders`.
- The competitive matrix has three new hand-reviewed rows:
provider-native citations, model-generated images, and stopping on
client disconnect. Each competitor cell was checked against a shallow
clone of that competitor's source on 2026-10-26, and an HTML comment on
each row records the evidence. The rows are added to `HAND_ROWS`, so the
weekly scan never rewrites them. The homepage ND count in the test is
now 56.

## Version carriers (`git grep -F 1.46.0`)

`package.json`, `charts/aimock/Chart.yaml` appVersion,
`.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json`
(`^1.47.0`), the `docs/index.html` banner, the
`packages/aimock-pytest/README.md` default, and `_version.py`
`AIMOCK_VERSION`. These are not bumped: the CHANGELOG history, the
`version-note` labels for 1.46.0 features, and `pyproject.toml`.

## Local verification

- format:check, lint, typecheck, build, api:report with no `etc/` diff,
test:exports, the docs and matrix tests, and the full `pnpm test`.
- The citations and files wire shapes were exercised against the built
server for Chat, Responses, Claude and Gemini, including the 500 for
`files` on Chat Completions.
- Screenshots of What's New, the matrix and the fixtures section at 375,
430 and 1440 px.
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.

1 participant