Gotenberg CVE-2026-42589: one unauthenticated request runs commands, and attackers are using it
An ExifTool argument injection in Gotenberg before 8.31.0 gives unauthenticated command execution and is being exploited. Update and keep the API private.
- Published
- Updated
- Ecosystem
- Open sourceCloudWebsites and CMS
- Fixed in
- Gotenberg 8.31.0
- Exploitation
- Yes, VulnCheck counted 1,358 exploitation events from 128 IPs in the 30 days before 24 October 2026, earliest seen late June; in VulnCheck KEV since 26 June 2026, not in CISA KEV as of 30 October
Live scores
CVE-2026-42589- EPSS
- 0.030
some chance of attack soon - VEDAS
- 0.981
strong exploit evidence - On CISA KEV
- Not listed
What happened
Gotenberg is a Docker-packaged API that converts documents to PDF. Before 8.31.0, its /forms/pdfengines/metadata/write endpoint takes a JSON metadata object and passes the keys straight to ExifTool. Nothing checks the characters in a key. A newline in a key starts a new ExifTool argument, so an attacker can add flags such as -if, which evaluates Perl. The result is unauthenticated OS command execution in a single HTTP request, rated CVSS 9.8 (CVE record).
The attack is quiet. The server answers with HTTP 200 and a valid PDF, so there is no error to notice (CVE record). The researcher S-Senhaji reported it. Gotenberg’s advisory, published on 30 April 2026, includes working proof-of-concept code (GitHub advisory). The fix shipped in 8.31.0, released on 17 April 2026 (Gotenberg release).
It is exploited, by many actors. VulnCheck added the CVE to its own KEV list on 26 June 2026. In a 26 October post, it counted 1,358 exploitation events from 128 source IPs over 30 days, in at least seven clusters: a scanner on Contabo, XMRig cryptominers, Python reverse shells, S3-hosted payloads and others. The earliest activity it saw came from Telecom Italia infrastructure from late June into early August (VulnCheck).
One cluster drops cache_base, a 5.2 MB stripped Go binary. It writes ./.cached_db.lock so only one copy runs, asks ipinfo.io for the victim’s location, registers with its command server and pipes the connection to /bin/sh. It has no persistence of its own (VulnCheck). The flaw was not in CISA’s KEV catalog as of 30 October (CISA KEV).
Am I affected?
You are affected if any Gotenberg container runs a version before 8.31.0 and something untrusted can reach its API. Gotenberg often hides inside other stacks as a helper container, so search for it:
# Docker hosts
docker ps --format '{{.Names}} {{.Image}}' | grep -i gotenberg
# Kubernetes, including sidecars
kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.namespace}/{.metadata.name}{"\t"}{range .spec.containers[*]}{.image}{" "}{end}{"\n"}{end}' | grep -i gotenberg
# Compose files and manifests in your repos
grep -rn 'gotenberg/gotenberg' --include='*.yml' --include='*.yaml' .A floating tag such as gotenberg/gotenberg:8 only moves when you pull it and recreate the container. Gotenberg’s advisory lists 8.29.1 as the version that tag served when the bug was reported (GitHub advisory).
Then check exposure: is port 3000 (or whatever you mapped) reachable from the internet, from other tenants, or from anything that passes user input through unchanged?
What to do now
- Update to Gotenberg 8.31.0 or later and recreate every container that uses it. Pulling a new image does not change a running container.
- Put the API behind an authenticating reverse proxy and never expose port 3000 to untrusted networks. This is the only workaround Gotenberg gives (GitHub advisory).
- Hunt for attempts. Search proxy and access logs for
POST /forms/pdfengines/metadata/write. That endpoint is legitimate, so look for requests from sources outside your own apps. - Check containers for the dropper VulnCheck described: a
.cached_db.lockfile in the process working directory,/tmp/nx_cmd.txt, a process withPYTHONUNBUFFERED=1set, or outbound HTTP with the user agentGo-http-client/2.0from the Gotenberg container. - Block and search for the network indicators VulnCheck published, including
39.105.65.32,5.161.100.63,132.145.123.143,210.170.22.208and thestrangled[.]netsubdomainsubuntu-repo,linux-x86-tcpudpandcheeva. Its post also lists MD5 hashes forcache_baseand related builds (VulnCheck). - If you find a hit, treat the container and whatever it could reach as compromised. Gotenberg usually sits next to application servers and storage. Rebuild it, and review the credentials and network access its pod or host had.
Why this matters
The fix shipped in April, and the first attacks VulnCheck saw came in late June. By October, more than a hundred IPs were using the bug. Gotenberg rarely appears in an asset inventory as its own product. It is a dependency someone added to a Compose file to make PDFs, which is why old copies keep running.