google-gemini / google-gemini/gemini-cli

Sandbox Dockerfile is on node:20-slim (EOL 2026-04-30), though #1038 moved it to Node 22 in 2025

Open Beginner friendly
#28,584 3 comments 0 reactions 0 assignees View on GitHub
area/security kind/bug priority/p1 status/bot-triaged
Dominant language
TypeScript
Stars
107k
Forks
14.6k
Avg merge
2d 3h
Merged PRs (30d)
45

Description

Hello, and thank you for Gemini CLI.

The sandbox image is built on Node 20, which reached end-of-life three months ago. What made me want to raise it rather than skip it is that you appear to have moved *off* Node 20 once already.

## What I observed

The repository-root `Dockerfile` uses Node 20 for both stages, including the final one:

```
2: FROM docker.io/library/node:20-slim AS builder
42: FROM docker.io/library/node:20-slim <-- final runtime stage
94: ENTRYPOINT ["/usr/local/share/npm-global/bin/gemini"]
```

**Node 20 reached end-of-life on 2026-04-30.** Supported lines are 22, 24 and 26.

## The part I can't explain, and am not going to guess at

[#1038 "Dockerfile: Node 22 and ENTRYPOINT"](https://github.com/google-gemini/gemini-cli/pull/1038) was **merged on 2025-06-14** — *"Upgrade to Node 22"*. Today the file is on Node 20.

I traced back as far as the 2026-05-04 refactor (`b6fc583b0`, "make Dockerfile self-contained with multi-stage build") and it was already `node:20-slim` before that commit, so that refactor isn't the cause. Something between June 2025 and then moved it back and **I have not established what**, so I'm reporting the current state rather than a story about how it got there. You'll know the history better than I can reconstruct it.

## Why it matters for this image in particular

Node states the consequence directly:

> "It's important to note that **End-of-Life versions are always affected** when a security release occurs."

June 2026 fixed twelve CVEs into 22.x/24.x/26.x, with 20.x excluded — including **CVE-2026-48933** (HIGH, WebCrypto AES integer overflow → remote process abort) and **CVE-2026-48618** (HIGH, Unicode dot separator → TLS wildcard-depth authentication bypass), plus TLS host-identity and mTLS authorization bypasses. July 2026, published this week, again patched only 26/24/22.

This is the **sandbox** image — the boundary the CLI runs model-directed commands inside. A boundary is a slightly worse place than most to have a runtime that can no longer receive fixes. I'm stating that as a reason to prioritise, not as a claim that any specific CVE is reachable here.

## What I did NOT check

- I did not pull or scan a published image; this analyses the Dockerfile.
- No reachability or exploitability analysis for any CVE. None is claimed.

## Suggestion

Move both stages to `node:22-slim` or `node:24-slim` — which, if #1038 was the intent, is a return to it rather than a new decision. Happy to open the PR.

*Disclosure: AI-assisted (Claude Opus 5). I verified the live Dockerfile, the #1038 merge, the commit history I cite, the Node EOL dates from endoflife.date and the CVE list from nodejs.org myself before posting.*

Contributor guide

Open the contributing guide

Research direction

Start with the repository-root Dockerfile and compare its two node:20-slim stages with PR #1038 and the cited history. Verify that the sandbox image builds with a supported Node 22 or 24 base; done when neither stage uses the EOL Node 20 image.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker, node.js
Domain
build-system, cli
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
78/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.