math.js 원격 코드 실행(RCE) 취약점 발견 및 악용 기법

Source

  • Evernote/Inbox/How we exploited a remote execution vulnerability in math.js.md

Summary

본 문서는 math.js API(api.mathjs.org)에서 발견된 원격 코드 실행(RCE) 취약점의 발견, 악용, 그리고 책임 있는 보고 과정을 설명합니다. 작성자는 eval, Function, setTimeout 등이 차단된 환경에서 기존 함수의 생성자(constructor)를 우회하여 코드 실행을 성공시켰습니다. 구체적으로 cos.constructor("return 1")()와 같은 기법을 통해 Node.js 환경의 process 객체에 접근하고, process.binding을 이용해 OS 파일 읽기 및 child_process 기능 재구성을 통한 임의 명령어 실행 가능성을 입증했습니다.

Key Points

  • math.js API는 evalFunction 등 직접적인 코드 실행 함수를 차단하거나 안전 버전으로 대체하여 보호하고 있음.
  • 우회 기법: 기존에 정의된 함수(예: cos, Math.floor)의 .constructor 속성을 통해 Function 생성자에 간접 접근하여 임의 코드 실행 가능함 (예: cos.constructor("return 1")()).
  • Node.js 환경에서 require는 사용 불가하나, process 객체는 접근 가능하여 환경 변수(process.env) 및 내부 바인딩(process.binding)을 활용할 수 있음.
  • process.binding('fs')를 사용하여 서버의 로컬 파일(예: /etc/passwd) 읽기가 가능함을 확인함.
  • child_process 모듈을 직접 require하지 않고, Node.js 소스 코드의 spawn_sync 바인딩과 관련 함수를 재구성하여 임의 명령어 실행(Spawn) 가능성을 시연함.