WINNIE
WINNIE는 국내 개발자 정진호 외 4명이 개발한 윈도우 기반 퍼저이다.
Harness 자동 제작은 물론 fork() 기술을 이용하여 빠른 퍼징을 수행한다.
개발 배경
- 퍼저는 대부분 리눅스 기반이다. 물론 윈도우 기반 퍼저 역시 존재하지만 당면한 과제가 있다.
- 윈도우의 특성, 즉 비공개 소스, GUI 과다사용, 프로세스 복제 능력 부족 등으로 인해 퍼징 개발에 어려움을 주고 있는 실정이다.
- 결과적으로 윈도우 바이너리에서 61개의 버그를 발견하는 데 성공하였다.
기존 Window 퍼저와 차이점
- 2.2배 더 많은 프로그램 수 지원
- 3.9배 더 많은 프로그램 상태 파악 지원
- 26.6배 더 빠른 실행 능력
Window 퍼징 당면 과제
- 사용자가 프로그램을 종료해도 그 프로세스는 종료되지 않음
- GUI 지원으로 인한 비교적 떨어지는 복제 성능
- 비공개 소스 기반으로 인해내부 맥락을 추측하기 어려움
기존 솔루션
- GUI 의도적인 미사용과 파싱 추출, 하지만 소스 코드를 모르기 때문에 효과가 크지 않음
- 입력 파서에서 Loop돌리기, 하지만 전역 프로그램 상태와 충돌할 수 있기에 불안정함
WINNIE만의 솔루션
- Harness generation 이용
- 리눅스의 fork() 메카니즘 차용
- 하이브리드 분석과 Fullspeed 이용
자세히 살펴보면 먼저,
1) Harness generation
Trace Collector
프로그램의 API 콜이나 리턴값을 수집함
- 메인 프로그램, 라이브러리 그리고 Window API를 대상으로 모니터링 수행
- 상호 간 호출 발생 시 해당 정보를 덤프 뜸
Target Extractor
어느 곳에 퍼징을 시도할 지, 대상을 식별함
- Run Trace 정보를 통해 컨트롤 흐름표를 재구성함
- 퍼징이 먹힐 만한 대상을 식별함
- 가령, 메인프로그램은 최초에 타겟이됨, 그리고 ReadFile을 수행하는 윈도우 API가 그 다음이 타겟으로 설정될 수 있음
Harness Builder
최종 입력 값을 만들어냄
- 이미지 뷰어에 이미지 파일과 텍스트 파일을 입력한 뒤,
그에 대한 결과 값을 통해 로직 정보를 파악 할 수 있었음 - 호출된 API 이름을 식별하는 등의 분석 이후에 코드의 윤곽(Skeleton)을 생성함
- 지금까지의 과정을 토대로 만들어진 하네스 후보 중 하나를 선택함
2) Fork()
리눅스 프로세스 복제 기술을 윈도우에 가져옴
- 부모 프로세스에서 자식 프로세스를 파생시킨다
- 이후 csrss 서브 시스템을 통해 자식 프로세스를 관리한다
- 자식 프로세스에서는 할당된 변수를 해제하는 것을 반복한다
- csrss.exe : 윈도우 시스템에 기본으로 동작되는 프로세스로, 클라이언트 요청에 대한 작업자 스레드를 만들거나 삭제하는 MS 프로그램
3) Fullspeed Fuzzing
Code Coverage 수집을 목적으로 함
- 각 각 의 베이직 블락마다 브레이크 포인트를 걸어둠
- 브레이크 포인트 마다 충돌이 생기는 지 모니터링함
- 충돌이 생기지 않는 곳에는 브레이크 포인트를 해제하고 모니터링을 미수행함
- 점진적으로 충돌을 찾기 위해 위 행동을 반복함
WINAFL vs WININE
성과 및 오픈 소스 주소
오픈소스 : https://github.com/sslab-gatech/winnie
마무리
기존 윈도우 기반 퍼저인 AFL과 비교하여 월등한 성과를 보여준 WINNIE를 알게되었다.
여러므로 성능이 향상된 윈도우 퍼저이니, 앞으로 윈도우 퍼징을 할 기회가 온다면 WINNIE를 사용해보자!