Skip to main content

BentoPDF EUVDEUVD-2026-101579

| CVE-2026-102354 MEDIUM
Time-of-check Time-of-use (TOCTOU) Race Condition (CWE-367)
2026-10-14 security-advisories@github.com
6.8
CVSS 3.1 · Vendor: github
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Register attacker domain with low-TTL authoritative DNS
  2. Delivery
    Forge allowed Origin, submit cert/OCSP/CRL/TSA URL
  3. Exploit
    Pass DNS safety check with public IP
  4. Execution
    Rebind DNS to private/metadata address before fetch
  5. Persist
    Proxy fetches internal resource
  6. Impact
    Exfiltrate internal response body

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V15 - Secure Coding and Architecture TOCTOU prevention
Exploitation Conditions

Exploitation requires a specific non-default deployment: the worker must run OFF Cloudflare (e.g. workerd, Node, or another runtime inside a cloud VPC that can actually route to internal/RFC1918/loopback/link-local/169.254.169.254 addresses) AND PROXY_SECRET validation must be disabled AND no network-level egress filtering is present. The attacker must additionally control authoritative DNS for a domain with a very low TTL to win the rebinding race between hostnameResolvesToPrivate() and the outbound fetch. Limiting factors: on the default Cloudflare Workers deployment this is NOT exploitable (no route to private/metadata addresses); redirects and IP-literal obfuscation are blocked; precise timing is needed; and network reachability of the worker to the target constrains impact to I:N/A:N (read-only disclosure).

Impact

This is a moderate, highly conditional server-side request forgery (SSRF) issue, not a broadly urgent priority. The CVSS 3.1 vector (AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:N/A:N = 6.8 Medium) is internally consistent with the description: network-reachable and requiring no authentication (PR:N applies only when PROXY_SECRET validation is disabled), but with High attack complexity reflecting the CWE-367 TOCTOU race - the attacker must win a timing window between the DNS-over-HTTPS safety check in hostnameResolvesToPrivate() and the later outbound fetch(). No EPSS score, KEV listing, or public exploit was provided in the input, so there is no public exploit identified at time of analysis and no evidence of active exploitation. Critically, the vendor's own fix commit and docs state that the DEFAULT Cloudflare Workers deployment is NOT exploitable (Cloudflare's edge has no route to RFC1918/loopback/link-local/169.254.169.254), so real-world risk collapses to the subset of self-hosters running the worker off Cloudflare (workerd/Node inside a VPC) AND without PROXY_SECRET AND without network egress filtering. The scope change (S:C) and C:H are justified because a successful rebind lets the proxy read internal/cloud-metadata resources and return bodies to the attacker. Net: a real but narrowly-conditioned issue dominated by non-default deployment requirements and high exploitation complexity, not a high-CVSS-but-fictional risk nor a drop-everything emergency.

Exploit ScenarioDerived

An organization self-hosts the BentoPDF CORS proxy worker off Cloudflare (e.g. workerd or Node inside a cloud VPC) with PROXY_SECRET unset. An attacker who controls authoritative DNS for their own domain (very low TTL) forges an allowed Origin header and submits a certificate/OCSP/CRL/TSA URL pointing at that domain; the domain answers with a public IP during the safety check, then rebinds to a private or 169.254.169.254 metadata address for the actual fetch, returning internal response bodies to the attacker. No public exploit code was identified, and success requires precise timing since IP-literal obfuscation and redirects are blocked.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 14, 2026

Server-side request forgery in the self-hosted CORS proxy worker bundled with BentoPDF (cloudflare/cors-proxy-worker.js) through version 2.8.6 lets an unauthenticated remote attacker who controls authoritative DNS for a domain with a very low TTL win a DNS-rebinding race and make the proxy fetch internal, loopback, link-local or cloud-metadata addresses, returning the response body to the attacker. Exploitation is highly conditional: the worker must be running outside Cloudflare (for example workerd, Node, or another runtime inside a cloud VPC that can actually route to RFC1918 and 169.254.169.254 addresses), PROXY_SECRET validation must be disabled, no network-level egress filtering may be present, and the attacker must supply a certificate, OCSP, CRL or TSA URL that passes the proxy's accepted path checks. The default Cloudflare deployment is not exploitable, redirects and IP-literal obfuscation are blocked, and impact is limited to read-only information disclosure (C:H/I:N/A:N); the issue is fixed in 2.8.7 and no public exploit was identified at time of analysis.

RemediationAI

Vendor-released patch: 2.8.7 - upgrade BentoPDF to v2.8.7 (https://github.com/alam00000/bentopdf/releases/tag/v2.8.7), which incorporates the fixes in commits 45496fcd2ed6e02dcdde0d3839cc5024c091760c and 58cd1a8893bfe06e4a59a72adc2e7db00a8b9266 and aligns with advisory GHSA-wh78-rcw2-hhg9. If upgrading immediately is not possible, the single most effective compensating control for non-Cloudflare deployments is network-level egress filtering in front of the worker, blocking outbound connections to RFC1918 ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), loopback (127.0.0.0/8), link-local and the metadata endpoint (169.254.0.0/16, including 169.254.169.254) plus their IPv6 equivalents - application code alone cannot guarantee this on a non-Cloudflare runtime, so the egress firewall should be treated as required, and the trade-off is that overly broad rules may break legitimate CA certificate-chain fetches. Enabling PROXY_SECRET raises the bar for casual abuse but is not a genuine authentication boundary, since the secret ships in the public client bundle, so it must not be relied on as the primary fix. Migrating the worker back to the default Cloudflare deployment removes the exposure entirely because Cloudflare Workers have no route to private or metadata addresses. Self-hosting guidance is documented in docs/self-hosting/cors-proxy.md.

Affected VersionsENISA

bentopdf < 2.8.7

Affected Packages

euvd bentopdf fix: 2.8.7

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The flaw is a time-of-check-to-time-of-use (TOCTOU) race condition, classified as CWE-367, in the CORS proxy worker's SSRF defense. The worker calls hostnameResolvesToPrivate(), a DNS-over-HTTPS safety check used by isValidCertificateUrl() and isValidTsaUrl(), as a separate resolution step from the later outbound fetch(targetUrl, ...). Because the check and the fetch each resolve the hostname independently, an attacker with control over their own domain's authoritative DNS (served with a very low TTL) can answer the validation query with a public address and the subsequent fetch query with a private, loopback, link-local or metadata address such as 169.254.169.254. The proxy deliberately cannot restrict destinations to a fixed host allowlist, because it must retrieve certificate-chain URLs from arbitrary certificate authorities via each certificate's AIA/OCSP/CRL fields (for example www.cert.fnmt.es and corporate CAs), which is what leaves the rebinding gap open. The Origin allow-list and the optional PROXY_SECRET HMAC are anti-abuse controls rather than a security boundary: the Origin header is forgeable by non-browser clients and the HMAC secret ships in the public client bundle. The CVSS vector AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:N/A:N reflects network reachability, high attack complexity due to the timing-dependent race, no authentication or user interaction required, a scope change because the proxy is used to reach resources outside its own security authority, high confidentiality impact, and no integrity or availability impact. Deployments on Cloudflare egress from Cloudflare's edge, which has no route to private, internal or metadata addresses, so a successful rebind reaches nothing.

Know when the next one hits your stack

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (github) PRIMARY 6.8 MEDIUM
AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:N/A:N
vuln.today AI 6.8 MEDIUM

Unauthenticated when PROXY_SECRET is off (PR:N); AC:H for the DNS-rebinding timing race; S:C and C:H as the proxy reads internal systems and returns bodies; no integrity/availability impact.

3.1 AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:N/A:N
4.0 AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N

Primary rating from Vendor (github).

CVSS VectorVendor: github

Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
None
Scope
Changed
Confidentiality
High
Integrity
None
Availability
None

Lifecycle Timeline

1
Patch available
Oct 14, 2026 - 20:34 EUVD

DescriptionCVE.org

BentoPDF is a privacy-focused PDF toolkit that runs in the browser. In versions through 2.8.6, cloudflare/cors-proxy-worker.js performs a DNS-over-HTTPS safety check in hostnameResolvesToPrivate(), as used by isValidCertificateUrl() and isValidTsaUrl(), separately from the outbound fetch(targetUrl, ...). In deployments where PROXY_SECRET validation is not enabled, a direct client that controls authoritative DNS can forge the Origin header, supply a certificate, OCSP, CRL, or TSA URL that passes the proxy's accepted path checks, return a public address during validation, and return a private or link-local address during the later fetch. The endpoint can return allowed response bodies to the attacker, but exploitation requires precise timing, redirects and IP-literal obfuscation are blocked, and network reachability limits the target. This vulnerability is fixed in 2.8.7.

Threat Intelligence Overview

EPSS Score
0.2%
Top 91% exploitable
Prevalence
Low
niche open-source browser PDF toolkit, limited self-hosted off-Cloudflare footprint
Data Quality
5 sources
Confidence: Medium

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

34
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +34
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy