퍼징이란 취약점을 찾기 위해 사용하는 기술들의 집합입니다.
BOF 라든지 악성코드를 심는 걸 퍼징을 통해 발견합니다.
발표 순서는 다음과 같았습니다.
1. 기본 개념
- 버그(Bug)와 퍼징(Fuzzing)의 관계
- Input/Corpus
- 퍼징의 방식
- 퍼징을 도와 주는 도구
2. 커버리지 가이드 퍼징
- 커버리지 피드백(Coverage Feedback) (퍼징이 요새 주목받게 된 이유)
- AFL/libfuzzer
3. 구조적 입력 퍼징 (Structured Input)
4. 하이브리드 퍼징(Hybrid)
- Taint analysis
- Symbolic Execution
5. 안티 퍼징 (Anti)
6. 분산 퍼징(Distributed), 진행되고 있는 연구
1. 기본 개념
- 버그와 퍼징의 관계
버그 : 소프트웨어 개발자의 실수, 주로 메모리상의 접근으로 정의 (여기서는 앞과 같이 정의) ex) 버퍼오버플로우
퍼징은 이러한 버그를 찾고자 하는 것.
버그가 보안 취약점으로 연결되면 자동적으로 악성코드를 심는데 이용될 수 있음.
- Input/Corpus
Input : 퍼징 대상 프로그램에게 주는 입력
Test Case, Seed 라고도 부름
Corpus : Fuzzing 에 사용되는 Input 의 집합
Corpus Pruning : 반복 수행 시 중복 값들이 생성되기 때문에 input corpus 를 정리해 주어야하는 것.
- 퍼징의 방식
1. Input 생성 2. 프로그램 실행 3. 결과 관찰
-> 어떻게 "좋은 Input"을 생성할 수 있을까?
-> 어떻게 "빠르게" 실행할까?
-> 어떻게 "Bug를 놓치지 않을까"? (소스가 있냐 없냐에 따라서 달라짐. 구글에서 개발한 Address Sanitizer를 사용하면 버그를 거의 잡아준다. 하지만 소스코드가 없을 때 해결방법은 아직 모호)
- 퍼징을 도와 주는 도구
Address Sanitizer
구글에서 개발. 퍼징을 위한 표준 도구
발생한 버그를 놓치지 않게 도와줌
메모리 버그 임에도 일반적으로 프로그램을 실행하게 되면 아무 일도 일어나지 않음
-> Address Sanitizer 이 어떻게 해결 ?
-> 모든 메모리 접근을 instrument , 즉 모든 부분을 수정해서 허용 가능한지를 확인
(Sagmentation Bug 등의 시그널이 발생하지 않아도 Bug의 존재 유무를 파악)
단점은 기능 추가 때문에 메모리 사용이 올라가는 것
2. 커버리지 가이드 퍼징
- 커버리지란?
프로그램이 있을 때 프로그램의 실행 흐름을 측정, 얼마나 많은 부분이 실행되었느냐에 대해
척도 : 함수, 라인, 블록, 일반적으로 많이 사용 되는 에지(Edge) - 블록 커버리지 보다 프로그램 실행 측면에서 더 많은 경우의 수를 고려, 블록의 조합이라고 생각해도 됨
- 유전 알고리즘
퍼징 세대(Round)마다 새로운 Corpus Set을 생성
오류를 더 많이 발견하기 위한 방식
- 커버리지 피드백(Coverage Feedback) (퍼징이 요새 주목받게 된 이유)
- AFL/libfuzzer
AFL
구글에서 개발
초기의 커버리지 피드백 기반 Fuzzer
유전자 알고리즘 적용, Fuzzing Boom의 시초가 됨
libFuzzer
구글에서 개발
LLVM 프로젝트의 일환
실제로 업계에서 가장 많이 사용
In-Process Fuzzer : 퍼징을 위해 프로그램 전체를 독립 실행 시키지 않음, 퍼저가 한 번 실행하면 함수 단위로 퍼징 수행 -> 속도 향상, 단점은 Stub 의 작성 단계 필요
3. 구조적 입력 퍼징 (Structured Input)
프로그램의 Input 구조는 매우 다양, 이를 어떻게 해결할 것이냐?
Language Fuzzing
- Web Browser, Action Script 등의 프로그램은 Input구조가 복잡하기 때문에 Random mutation을 돌리면 syntax error 를 유발하게 됨 -> Coverage 병목이 발생
(예제에 있는 문법이 아니면 모두 오류, 입력에 대한 처리를 프로그램이 안 함)
Abstract Syntax Tree 레벨에서 Mutation
코드를 내부에서 Abstract Syntax Tree로 바꾸고 여기서 Mutation 을 하고 다시 코드로 변환
4. 하이브리드 퍼징(Hybrid)
효율 극대화를 위해 Input 생성을 랜덤에만 의존하지 않음
Hybrid Fuzzing = Fuzzing + Analysis
- Taint analysis
데이터를 랜덤하게 바꾸는게 아니라 데이터와 프로그램의 연관성을 분석해서 결과를 통해 생성값을 생성
: 입력의 어느 부분이 어느 변수에 영향을 미치는지 확인하는 기술
대표적인 도구 : DFSan(LLVM)
데이터의 이동을 모두 추척해야함
- Symbolic Execution
방정식을 해결하는 엔진의 기능을 통해 분기문이라든지 코드의 커버리지를 더 사용할 수 있는 방법
: 프로그램의 분기문에 관한 수식 해결
Concolic Execution = Symbolic Execution + Concrete Values
5. 안티 퍼징 (Anti)
어떻게 퍼징을 방해할까?
-BranchTrap : 가짜 커버리지를 주입, 쓸데없는 코드가 경우마다 추가적으로 실행시키게 함
-> 실행이 잘 되어서 커버리지가 커졌는지 판단하기가 어려움
Fuzzing 성능 저하
- SpeedBump : Selective Delay Injection
동영상 파일을 열었을 때 비정상적인 연결이면 '코덱이 없습니다, 확장자가 잘못 됐습니다.' 등등을 확인할 수 있음
퍼징이라고 생각했을 때 정상적으로 실행되기 보단 비정상적으로 종료되는 경우가 더 많을 것
-> 비정상적인 종류를 알리는 문구 등을 통해 그 부분이 실행 됐을 때 실행을 느려버리게 하면 Fuzzing 의 속도가 크게 감소
6. 분산 퍼징(Distributed), 진행되고 있는 연구
퍼징은 병렬 컴퓨팅으로 활용하기 용이
퍼징의 효율 극대화를 위해 대규모 병렬 컴퓨팅을 활용
OSSFzz
:구글에서 진행중인 프로젝트 - 분산 시스템 활용
Cluster Fuzz
:구글에서 개발한 분산 퍼징 플랫폼
OSSFuzz의 프로젝트들을 대상으로 활용
결론
2014,15년을 기점으로 최근 탑 학회에서 퍼징 연구가 활발히 진행
구글에서 개발한 'AFL 퍼저'가 유명해지면서 산업계에서도 접근 활용
퍼징은 이론적 측면과 산업적 측면에서도 용이
평소 '퍼징을 배워야지, 배워야지' 생각만 하고 있었는데 발표자님이 설명을 너무 잘해주셔서 이런 전문적 지식을 쉽게 배울 수 있어서 너무 좋았다. 퍼징 실습 파트도 진행했으면 좋았을 텐데 해킹캠프 동영상 시청 시간이 끝나버렸다ㅠ
퍼징은 간단히 말해서 입력값을 통해 오류를 찾아낸다고 할 수 있을 거 같다. 그 입력값을 어떻게 만들어 낼지에 대해 고민하는 공부인 거 같다.
'스터디 > 22회 해킹캠프' 카테고리의 다른 글
22회 해킹캠프 후기 및 추천글 (0) | 2021.02.23 |
---|