← Back to Feed CACHED · 2026-10-30 09:24:30 · CACHE_KEY CVE-2026-118539
CVE-2026-118539 · CWE-862 · Disclosed 2026-10-30

Drupal Commerce Core missing authorization allows forced browsing to order data

ASSESSED — NOISGATE
Vendor
—
—
—
Reassessed
—
—
—
Verdict: —
Do you agree?
01 · The Real Story

A shop's back office ledger left visible to anyone who guesses the room number

Drupal Commerce Core is the e-commerce engine for Drupal sites, handling products, carts, orders, and customer records. CVE-2026-118539 is a missing authorization flaw (CWE-862) that enables forced browsing: certain Commerce routes rely on URL obscurity or incomplete access checks, so an unauthenticated visitor can directly request protected order/administration pages and read data they should not see. The vulnerable range is Commerce Core 0.0.0 through 2.41 and 3.0.0 through 3.3.13; fixed versions are 2.42 and 3.3.14.

There is no vendor CVSS baseline for this record, so this assessment establishes severity from first principles. The impact is primarily confidentiality loss of customer PII and order metadata, not code execution or payment-token theft. A HIGH severity is appropriate because Drupal Commerce stores are public by design, the attack is network-reachable with no authentication, and sequential order IDs make bulk browsing practical.

"Unauthenticated forced browsing in Drupal Commerce Core can leak order and customer PII; patch 2.42 / 3.3.14 now."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Identify a Drupal Commerce site

Use fingerprinting with HTTP requests to /admin/modules, /modules/contrib/commerce/commerce.info.yml, or a normal storefront response that reveals Drupal headers. Confirm Commerce Core is installed and, if version disclosure is present, map it to the vulnerable ranges. Tools: curl, wappalyzer, whatweb.
Conditions required:
  • Site is internet-facing
  • Commerce Core module is enabled or version is disclosed
Where this breaks in practice:
  • Version may be hidden by server config or Composer installs
  • Not all Drupal sites run Commerce Core
Detection/coverage: Passive; no scanner signature likely until after PoC release
STEP 02

Request an unauthorized Commerce route directly

Send an anonymous GET to a Commerce order or admin page whose route lacks a proper access handler. The request is indistinguishable from a normal page view at the HTTP level, so no exploit technique is required—only a browser or curl.
Conditions required:
  • Vulnerable version installed
  • Affected route is reachable from attacker position
Where this breaks in practice:
  • Site may place admin routes behind an IP allowlist or reverse-proxy ACL
  • Some routes may require at least a low-privilege Drupal session if the missing check is only enforced downstream
Detection/coverage: WAF logs may show direct hit to protected path but cannot distinguish anomalous from legitimate authenticated traffic
STEP 03

Enumerate order and customer identifiers

Iterate order IDs using a script such as a Python requests loop or ffuf with numeric wordlists. Because Commerce order IDs are often sequential, the forced-browsing gap returns customer-facing data instead of 403 for unauthorized IDs. Tools: Python requests, ffuf, Burp Intruder.
Conditions required:
  • Predictable or sequential identifiers
  • Response differentiates authorized from unauthorized records
Where this breaks in practice:
  • If order IDs are UUIDs or scoped by randomness, bulk enumeration slows down
  • Rate limiting or bot detection can stall automated iteration
Detection/coverage: High request volume to order pages is visible to WAF/CDN rate rules, but low-volume targeted browsing may evade thresholds
STEP 04

Exfiltrate customer PII and order history

Capture names, addresses, email addresses, order totals, line items, and possibly payment status from the leaked pages. The data enables fraud, targeted phishing, and regulatory exposure. Tools: curl + custom parser, or gau/httpx for crawling affected routes.
Conditions required:
  • Commerce installation stores PII in page output
  • No field-level redaction on affected route
Where this breaks in practice:
  • Payment card data is typically tokenized by payment gateways and not shown
  • Some deployments store minimal customer data
Detection/coverage: Data loss prevention (DLP) or egress monitoring may flag large downloads; smaller exfiltration likely silent
03 · Compensating Control

1
HIGH 7.5→IGNORE 0.0
SEVERITY REDUCED
Patch Commerce Core to 2.42 or 3.3.14 — Apply the fixed release as soon as possible on all Commerce-enabled Drupal sites. This is the noisgate remediation SLA action for a HIGH severity: deploy within ≤180 days, but public PII-heavy stores should patch in days, not months.
2
HIGH 7.5→MEDIUM 4.3
SEVERITY REDUCED
Restrict affected Commerce routes at WAF or reverse proxy — If patching is delayed, block /admin/commerce/* and known order paths from public access and allow only trusted admin IPs/VPN within the noisgate mitigation SLA (≤30 days for HIGH). This breaks anonymous network reach.
3
HIGH 7.5→IGNORE 0.0
SEVERITY REDUCED
Disable Commerce Core on non-critical or high-risk stores — For stores handling large volumes of PII and no immediate patch window, temporarily disabling Commerce Core removes the vulnerable routes entirely and reduces residual risk to zero.
What doesn't work
  • CAPTCHA or login throttling: does not stop direct URL access to missing-authorization routes.
  • Generic WAF signature rules: forced browsing looks like legitimate HTTP GETs; a WAF won't detect missing access control unless route-specific ACLs are configured.
  • Drupal Security Kit / headers: controls browser-side behavior, not server-side access checks.
04 · Intelligence Metadata

The supporting signals.

CVE IDCVE-2026-118539
ProductDrupal Commerce Core
CWECWE-862 Missing Authorization
Affected versions0.0.0–2.41, 3.0.0–3.3.13
Fixed versions2.42, 3.3.14
Disclosed2026-10-30
KEVNo; not in CISA KEV as of 2026-10-31
In-the-wild exploitationNone reported
PoC availabilityNone found on pocindex.io or GitHub
EPSSNot yet scored / no data
CVSS v3.1 (assessed)CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N → 7.5 High
Reporting orgNot disclosed in record

Sources.

  1. NVD CVE-2026-118539
  2. CVE.org Record
  3. Drupal Commerce project page
  4. Drupal Commerce releases
  5. Drupal Security advisories
  6. CISA KEV Catalog
  7. PoC Index CVE page
  8. GitHub drupal-commerce/commerce
05 · The Call

Final Verdict
= UNCHANGED to HIGH (7.5/10)

Why this verdict

  • No vendor CVSS: This is a first-assessed severity, not an upgrade or downgrade. The official record lacks a vendor score.
  • Friction audit: Anonymous network access is sufficient; no prior compromise is required. Public e-commerce exposure is inherent, so the base attack path is broadly reachable.
  • Role multiplier: Drupal Commerce stores are internet-facing and hold customer PII/order data. Successful forced browsing can mass-exfiltrate regulated PII and fuel fraud; this floors the verdict at HIGH.
  • No KEV/exploit: No in-the-wild exploitation or public PoC lowers immediate urgency but does not reduce data exposure on vulnerable stores.

Why not higher?

No evidence of administrator write access, payment-token theft, remote code execution, or store defacement. The weakness is missing authorization on browsing routes, so availability and integrity are unaffected. No active exploitation or KEV listing further argues against CRITICAL.

Why not lower?

The vulnerable component is network-facing by design and stores personal data. A direct forced-browsing request with no authentication can reveal customer PII and order history at scale, making MEDIUM too low. Sequential order IDs make enumeration straightforward.

06 · Verification

Crowdsourced verification payload.

Run on the Drupal web server or a host with the webroot mounted, as a user with read access to the codebase (e.g., root or www-data). Invoke: bash check_cve_2026_118539.sh /var/www/html where the argument is your Drupal docroot.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# CVE-2026-118539 Drupal Commerce Core version checker
set -uo pipefail
docroot="${1:-/var/www/html}"
printf 'Checking %s\n' "$docroot"

ver_lte() {
  local a="$1" b="$2"
  local latest
  latest="$(printf '%s\n%s\n' "$a" "$b" | sort -V | tail -n1)"
  [[ "$latest" == "$b" ]]
}

ver_lt() {
  if [[ "$1" == "$2" ]]; then return 1; fi
  ver_lte "$1" "$2"
}

in_range() {
  local v="$1"
  v="${v#8.x-}"
  v="${v#7.x-}"
  v="${v#v}"
  case "$v" in
    *.*.*) ;;
    *.*) v="$v.0" ;;
    *) v="$v.0.0" ;;
  esac
  if ver_lte "$v" "2.41.0" && ! ver_lt "$v" "0.0.0"; then return 0; fi
  if ver_lte "$v" "3.3.13" && ! ver_lt "$v" "3.0.0"; then return 0; fi
  return 1
}

found=0
vuln=0

while IFS= read -r -d '' file; do
  found=1
  ver="$(grep -m1 -E '^version[[:space:]]*:' "$file" 2>/dev/null | sed -E 's/^[^:]*:[[:space:]]*//')"
  if [[ -z "$ver" ]]; then
    lock="${docroot}/composer.lock"
    if [[ -f "$lock" ]]; then
      ver="$(php -r '$data=json_decode(file_get_contents($argv[1]), true); foreach (($data["packages"]??[]) as $p) { if (($p["name"]??"")==="drupal/commerce") { echo $p["version"]??""; break; } }' "$lock" 2>/dev/null)"
    fi
  fi
  echo "Found: ${file#$docroot/} version=${ver:-unknown}"
  if [[ -n "$ver" ]]; then
    if in_range "$ver"; then
      vuln=1
    fi
  else
    vuln=2
  fi
done < <(find "$docroot" -type f -path '*/commerce/commerce.info.yml' -print0 2>/dev/null)

if [[ $found -eq 0 ]]; then
  echo "UNKNOWN: Commerce Core info file not found under $docroot"
  exit 2
fi

if [[ $vuln -eq 1 ]]; then
  echo "VULNERABLE: Drupal Commerce Core version is in affected ranges 0.0.0-2.41 or 3.0.0-3.3.13"
  exit 1
elif [[ $vuln -eq 2 ]]; then
  echo "UNKNOWN: unable to determine Commerce Core version"
  exit 2
else
  echo "PATCHED: Drupal Commerce Core version is 2.42+, 3.3.14+, or otherwise outside affected ranges"
  exit 0
fi