본문 바로가기

4-9. 2020-2 심화 스터디/웹 퍼저

[2020.11.07] File Format Fuzzing & Memory Fuzzing

11월 1주 Web Fuzzer 팀은 취약점 분석을 위한 퍼징 문서(KUCIS) 中 4. File Format Fuzzing과 5. Memory Fuzzing을 학습하고, Fuzzing 관련 논문 Fuzzing: a survey를 읽고 발제하였다. 

 

취약점 분석을 위한 퍼징 4. File Format Fuzzing

1. File Format Fuzzing이란?

- 취약점을 유발할 수 있는 쓰레기 코드가 존재할 수 있는지를 검사하는 작업. 

- 애플리케이션은 파일을 읽고 파싱하고 메모리에 읽어들여서 처리한다. 각 파일들은 자체의 포맷을 가지고 있고 애플리케이션은 그 포맷에 맞추어서 파싱을 한다. 따라서 애플리케이션은 취약점을 가질 수 있다. 포맷만 봐서는 정상적인 파일이지만, 그 내부에 에러를 발생시킬만한 쓰레기 코드가 숨어있을 수 있다.

 

2. 퍼징 방법

- 여러 개의 프로세스를 만들고 그 자식 프로세스들은 User_dll.dll의 몇 가지의 함수로 파일을 변경

- 자식프로세스는 타겟 프로세스의 디버거로 동작 -> 예외 상황의 발생을 감지

- 예외가 발생하면 그 때의 파일과 정보를 저장한다.

 

* 추가 조사

DLL 인젝션: 다른 프로세스의 주소 공간 내에서 DLL을 강제로 로드시킴으로써 코드를 실행시키는 기술.

- 외부 프로그램을 통해 다른 프로그램에 저작자가 의도하거나 예상하지 않은 영향을 미치기 위해 사용된다.

- 임의적인 코드를 삽입하는데 사용되는 프로그램을 DLL injector라고 부른다.

예: 삽입된 코드는 시스템 함수 호출을 후킹하거나 또는 보통 방식으로는 읽을 수 없는 패스워드 텍스트 박스의 내용을 읽을 수 있다.

출처: https://ko.wikipedia.org/wiki/DLL_%EC%9D%B8%EC%A0%9D%EC%85%98

 

3. File Fuzzer 구현

buf의 크기는 64byte, 읽어들이는 크기는 1024byte로 하여 overflow가 일어날 수 있도록한다.

•dll 에 함수를 export

•반환되는 값 : 프로그램을 실행시키고 얼마나 대기할 것인가를 나타낸다.

•2초 동안 대기하고 그 시간 안에 예외가 발생하지 않는다면 정상 실행으로 판단하고 종료

•Count 는 초기값이 5로 정해져있고 저 값으로 인해서 5번만 반복하고 종료한다.

•퍼저가 실행되면 info.fdb 라는 파일이 생성되고 info.fdb에 간단한 정보가 기록된다

 

■ Info.fdb 분석

■ 분석 및 결과

•에러를 발생할만한 데이터

•실행 후 에러 발생 확인 (= Fuzzing 수행 성공)

 

 

 

취약점 분석을 위한 퍼징 5. Memory Fuzzing

1. Memory Fuzzing이란?

- Taint Analysis (오염 분석)이라고도 한다.

- Memory Fuzzing은 target 프로그램에 메모리에 존재하는 변이되어 생성되는 데이터들에 초점을 맞추어 Fuzzing을

  수행

 

2, 1메모리 구조 - Microsoft Windows 메모리 모델

3:1의 비율로 user space와 system space로 나뉘어 있으며, user space에는 application 관련 코드가, system space에는 kernel관련 driver, usage 등이 있다.

 

2, 2 메모리 구조 - Memory에 존재하는 권한

위와 같이 여러 가지 권한이 존재한다. 이 중 몇 가지의 권한이 무엇인지 살펴보자면 다음과 같다.

 

PAGE_EXECUTE  

: 해당 페이지 실행. 그 외의 시도는 접근 위반

 

PAGE_EXECUTE_READWRITE 

: 실행, 읽기, 쓰기

 

PAGE_NOACCESS  

: 해당 페이지에 대한 모든 작업(실행, 읽기, 쓰기)에 대해 모두 접근 위반을 일으킴.

 

PAGE_READONLY   

:읽기만 가능

 

PAGE_GUARD

: 해당페이지에 대한 쓰기/읽기 시도시 STATUS_GUARD_PAGE Exception을 발생시킨 후 PAGE_GUARD속성을 제거하도록 한다.

주로 stack구조에서 사용된다.

 

3. 퍼징 방법

메모리 퍼징은 두 가지 방법이 있다. 변조된 반복문의 삽입과 스냅샷과 변조된 영역의 복구이다. 

 

(1) 변조된 반복문의 삽입 (Mutation Loop Insertion)

Accept(): 소켓으로부터 연결을 받아들임.

Recv(): 소켓으로부터 데이터 수신

Unmarshal(): XML문서를 Java Object로

매핑해주는 역할.

parse(): 문자열에서 값 추출

Mutate(): 돌연변이 생성

반복문에서 Unmarshal() 함수 실행 후에 파싱된 값에 변조된 데이터를 삽입하여 반복 실행하여 Fuzzing한다.

 

(2) 스냅샷과 변조된 영역의 복구 (Snapshot Restoration Mutation)

Unmarshal: XML문서를 Java Object로

매핑해주는 역할.

parse(): 문자열에서 값 추출

snapshot(): 스냅샷 생성

Restore(): 복원

 

Unmarshal()함수 실행 후 그 때의 상태를 snapshot한 다음 파싱된 데이터에 hook을 하고 실행한 다음 다시 복원하여 반복한다.

 

좀 더 General한 퍼징 방법을 살펴보자면 아래 그림과 같다.

1단계: Fuzzing된 데이터 생성

2단계: 변조 포맷 생성

3단계: 변조 포맷 포착(capture)

4단계: 기존 템플릿을 이용해 자동 활용

 

4. Memory Fuzzing 도구

(1) Linux의 /dev/urandom 을 이용하여 임의 랜덤 값으로 퍼징을 수행 할 수 있다.

urandom은 유닉스 계열 운영 체제에서 차단 방식의 유사난수 발생기의 역할을 수행하는 특수 파일이다. 장치 드라이버와 기타 소스로부터 모은 환경적 노이즈로의 접근을 허용한다.

난수를 발생시켜 fuzzing을 수행한다.

 

(2) pydbg로 퍼징 수행 

pydbg 모듈을 활용해서 퍼징을 수행한다. 

 

(3) ictlizer, Win32 IOCTL fuzzer 등의 퍼징 도구 활용

- 보안 연구자들은 2007년에 드라이버의 많은 취약점들을 발견했다. 그 중 하나가 IOCTL 드라이버 핸들러의 취약점이다. 이 문제는 디바이스 드라이버의 IOCTL 핸들러 내부에 충분하지 못한 주소 공간 검사에 의해 발생한다. 이러한 취약점들을 퍼징을 통해서 점검할 수 있다.

IOCTL fuzzer Code: https://github.com/Cr4sh/ioctlfuzzer

 

 

Paper  <Fuzzing: a survey>

1. Background : 취약성 발견 기술에 대한 배경지식 제시

(1) Static Analysis

   - 프로그램을 실제로 실행하지 않고 수행되는 분석 방법

   - 장점: 빠른 검출 속도

   - 단점: false rate가 높음

 

(2) Dynamic Analysis

   - 분석가가 실제 시스템이나 에뮬레이터에서 대상 프로그램을 실행해 실행 상태 모니터링, 런타임 분석

   - 장점: 높은 정확도

   - 단점: 느린 속도, 낮은 확장성

 

2. Fuzzing : 퍼징의 기본 개념과 주요 이슈를 포함한 퍼징에 대한 설명

(1) Fuzzing Test 과정

test case 생성 -> test case 실행 -> 프로그램 실행 상태 모니터링 -> 예외 분석 단계로 진행

 

(2) Fuzzing 종류

- generation based / mutation base로 분류

- generation based : 프로그램 입력에 대한 지식 필요, 프로그램 검증을 더 쉽게 통과 가능

- mutation based : 입력에 있어서 지식을 요구하지 않음, 적용이 쉬움

 

- 소소코드 의존성, 프로그램 분석 정도에 따라 White box, Gray box, Black box로 분류 가능

- White box: 프로그램 소스 코드에 접근, 소스코드와 testcase 분석으로 프로그램 실행 상태에 어떻게 영향을 미치는지 파악

- Black box: 대상 프로그램에 대한 정보를 모른채 Fuzzing test 수행

- Gray box : 소스코드 없이 작동, 프로그램 분석을 통해 내부 정보 얻음.

 

 

3. Fuzzing towards different applications : 퍼징은 다양한 유형의 어플리케이션에 사용됨

(1) File format fuzzing

- 대부분의 application은 파일 처리를 포함, fuzzing은 이러한 애플리케이션의 버그를 찾는데 사용 多

- 웹브라우저 fuzzing: 브라우저에 의해 처리되는 파일의 유형인 HTML, CSS, JS파일로부터 브라우저 확장에 의해 처리되는 PDF< SBG 등으로 확장, 특히 브라우저는 웹페이지를 DOM 트리로 구문분석하는데 Fuzzing 대상으로 많이 사용된다.

 

(2) Kernel fuzzing

- Fuzzing이 어려운 분야로 smart fuzzing이 등장하면서 커널 Fuzzing에 진전

- knowledge based fuzzer / coverage guided fuzzer

 

 

3. 1 Coverage-based Fuzzing

- 커버리지 기반 퍼징 전략은 효과적이고 효율적인 것으로 입증되어 최근 퍼저로부터 유용하게 사용되고 있음.

- 높은 성능의 퍼징을 달성하기 위해 퍼징은 가능한 한 많은 프로그램 실행 상태를 통과할 수 있어야 한다.

- 그러나 프로그램 동자의 불확실서으로 프로그램 상태에 대한 단순한 측정 기준이 존재하지는 않는다. -> 코드 커버리지를 측정하는 방식으로 해결(AFL)

 

3.2 New trends of fuzzing

- Smart Fuzzing이 fuzzing의 성능을 개선할 수 있는 방법론 중 하나

- 새로운 기법이 여러 방면에서 취약성 개선에 도움을 줌

- 새로운 시스템 기능과 하드웨어 기능이 무시되어서는 안됨