본 논문은 사실 Article의 형태로 학회나 저널에 등재된 것은 아니고, 저자의 홈페이지 블로그를 통해 소개되고 있다. (참고 : Introducing jsfunfuzz

jsfunfuzz는 인터넷 브라우져인 Firefox의 Javascript Engine을 소프트웨어 테스팅하기 위한 퍼징 기법 도구이다. 이 자료는 2007년 Black Hat USA에서 Window Snyder & Mike Shaver의 발표 "Building and Breaking the Browser"에서 처음 공개되었다. 이들은 Mozilla Corporation의 직원이며, 자신들의 브라우저인 파이어폭스가 전세계적으로 애용되고 있으며 보안 관련 이슈들을 꼼꼼하게 챙길 필요성이 있음을 강조하였다. 그리고 그들이 사용하는 프로그램을 소개한다.  

이 프로그램들 중 특별히 Javascript Fuzzer는 모질라 내부에서 이용하는 도구라고 언급하였고, 이것이 바로 Jesse Ruderman이 제작한 jsfunfuzz가 알려진 시초이다.

jsfunfuzz는 자바스크립트 엔진 자체를 테스팅하는 도구이다. 이를 사용하여 파이어폭스의 엔진 중 280개 이상의 버그를 발견하였고 대부분을 수정한 패치가 발표되었다. 특히 메모리 관련 취약점에 의한 임의코드 실행 공격에 악용될 가능성이 높은 버그들을 상당히 많이 발견할 수 있었다. (참고 : jsfunfuzz를 사용하여 발견된 취약점 목록)


저자인 Jesse Ruderman은 BlackHat 슬라이드에서 자세히 언급하지 못한 내용을 아래와 같이 설명하고 있다.

  • 자바스크립트 언어의 문법규칙을 내장하고 있으며, 이를 통해 언어 기능 조합에 관한 적절한 적용 및 응용이 가능하였다.
  • 만약 rule에서 어긋난 경우, bug 350415와 같은 문법오류를 발견하여 처리하는 등의 방법으로 fuzzer가 '사각지대'에 빠지는 위험에서 벗어날 수 있도록 해준다.
  • 버그 353079와 같은 경우, 상당히 복잡한 방식으로 중첩된 자바스크립트 구문임에도 불구하고 무난하게 처리할 수 있었다.
  • 반복문 안에서도 함수를 작성하고 시행하는 등 진행상태를 누적하여 저장할 수 있다. (다른 방법으로 찾기 힘든 예 : 361346)
  • 단지 Crash나 Assert만 찾는것이 아니라 문법적 정확성(Correctness)를 검증한다. (참고 : Fuzzing for JavaScript correctness)


이 비결은 무엇이었을까? jsfunfuzz는 github에 오픈소스로 공개되어있으므로 스스로 분석할 수 있다.

FunFuzz : https://github.com/MozillaSecurity/funfuzz/

jsfunfuzz : https://github.com/MozillaSecurity/funfuzz/tree/master/js/jsfunfuzz


jsfunfuzz는 JavaScript 엔진을 테스트하기 위해 위의 그림과 같은 임의의 JavaScript 함수 본문 (유효하지 않은 JavaScript 함수 본문 포함)을 생성한다. 코드는 String의 형태로 출력되며, 해당 코드를 브라우져에서 실행해보는 방식으로 테스트가 된다.(*그러나 브라우저 전체를 여러번 재기동하는 방식으로 수행하면 작업시간이 굉장히 소요되므로, standalone JavaScript Shell을 사용하여 테스트하는 것을 추천한다.)

소스코드에 포함된 것 중 가장 핵심적으로 중요한, 가장 큰 규모의 파일은 'gen-grammar.js'이다. 촘스키 위계에 따른 Type-2 grammar(context-free)을 인식하기 위한 일종의 설정파일이다.

실제로 코드를 살펴보면, 자바스크립트 문법을 체크하고 그에 알맞은 소스코드를 작성할 때 상당히 무식한(?) 방법으로 노가다;;를 뛰는 것을 볼 수 있다. 이렇게 하면 사람이 직접 모든 코드를 작성했기 때문에 정확성 측면에서는 우수할 수 있으나, 만들기가 너무 어렵고 시간이 많이 소요될 것이다. 또한, javascript가 아닌 다른 언어에 대한 Fuzzer로는 활용하기가 불가능하며 이를 위해서는 처음부터 다시 제작해야 한다는 단점이 있다.


이러한 단점을 지적하여 '일반화'를 목표로 제작한 LangFuzz가 2012년 USENIX Security Symposium에서 발표되었다. 저자인 Christian Holler 역시 이 공로를 인정받아 Mozilla에 입사하였고, jsfunfuzz를 개선하는 작업에 참여하기도 하였다. 해당 LangFuzz 논문 관련해서는 다음 리뷰에..


CPUU님의 창작활동을 응원하고 싶으세요?