고품질의 입력에 의존 → 고품질의 입력은 프로그램 state space를 효과적으로 탐색할 수 있고 취약점 트리거할 가능성을 높임
고품질의 입력 생성 위해 입력 포맷 중요
입력 포맷: 프로그램의 입력 바이트가 어떻게 구성되어야 하는지에 대한 것
입력 포맷으로 sanity 체크를 우회하는 입력을 생성할 수 있고, 더 깊고 복잡한 코드에 도달할 수 있음
입력 필드의 구조와 의미
입력을 처리하는 기본 블록(BB)에 의해 결정
MOTIVATION
프로그램의 효과적인 입력 생성 위해 프로그램 입력 형식 지식 중요 → 자동화된 입력 형식 리버스 엔지니어링을 통해 입력 포맷 학습
자동화된 입력 형식 리버스 엔지니어링에서의 챌린지 해결
기존 퍼저는 다음의 입력 포맷에서의 챌린지를 모두 다루지 않음
서로 다른 입력 필드에서 boundary가 어디에 있는지 (input field boundary recognition)
입력 필드가 어떤 type에 속하는지 (input field type identification)
입력 포맷의 어떤 지식을 활용해야 하는지
⇒ 3가지 챌린지 해결하기 위해 입력 포맷을 자동으로 reverse하여 퍼징에 활용하는 AIFORE 제안
DESIGN
바이트 수준 taint analysis
각 BB가 처리하는 입력 바이트 구하기
하나의 BB 내에서 여러 명령어로 처리되는 하나의 필드의 경우, 이러한 BB이 항상 실행되지는 않지만 분석이 필요하므로
최소 클러스터 알고리즘 사용: 하나의 BB 내에서 여러 명령어로 처리되는 하나의 필드, 즉 항상 함께 처리되는 분할할 수 없는 입력 필드의 boundary를 BB에서 식별
CNN 모델로 BB 동작 특성 학습
BB에서 처리되는 입력 필드의 타입(size, offset, enum, string, checksum 등) 예측 위해 사용
BB가 입력 필드의 서로 다른 타입을 처리하는 패턴 학습
CNN 모델로 입력 필드의 semantic 타입 예측
power scheduling 알고리즘 사용한 스마트 퍼징 진행
서로 다른 코드 커버리지를 갖는 테스트케이스를 골라서 입력 포맷을 재분석
퍼징 과정에서 덜 테스트된 포맷을 가진 시드에 우선순위 부여 → 해당 시드에 mutation power 증가
RELATED WORK
기존 퍼저의 input field boundary recognition 연구
정적 분석 또는 taint 분석으로 동일한 명령어로 처리된 바이트를 unique field로 그룹화함 → 명령어가 여러 입력 필드를 처리할 수 있고, 긴 필드는 서로 다른 명령어로 처리되어 multiple field로 나뉘면 오류가 날 수 있고, 정적 분석을 통해 필드를 식별하려면 많은 입력이 필요해야 하는 한계가 있음
기존 퍼저의 input field type identification 연구
필드 타입을 추출하기 위해 이전 지식(파라미터 타입 등)에 의존하는데, 이전 지식은 흩어져 있고 휴리스틱한 방법으로 이루어져서 false positive와 false negative가 발생할 수 있다. 또한, 프로그램 동작의 semantic 수준을 고려하지 않아 semantic type(magic number, 크기, checksum 등)을 인식할 수 없다.
기존 퍼저의 utilization of input format 연구
입력 포맷을 퍼징의 테스트케이스 생성이나 변형에 활용하여 타겟 프로그램 내 더 깊은 코드를 탐색
포맷 정보를 시드가 좋은지 안 좋은지 결정하는데도 사용
한계: 필드 관계에 대한 제약조건이 없는 단순한 구조의 시드의 경우 시드 품질 판별 불가능
EVALUATION
최신(SOTA) 포맷 반전 솔루션과 퍼저 ProFuzzer, TIFF-fuzzer, WEIZZ, EcoFuzz, AFL-Analyze, AFLFast와 15개의 서로 다른 포맷을 갖는 리얼월드 프로그램으로 비교하여 포맷 추론 정확성, 퍼징 성능 비교한 결과, AIFORE의 필드 추론 정확도가 SOTA 기준선 능가
→ 필드 boundary 인식 정확도 84.06%로 가장 높았고, 학습되지 않은 포맷과 프로그램으로 타입 예측 정확도 84.26% 달성하여 다른 퍼저보다 높음
→ 포맷 지식 추출하고 power scheduling 알고리즘을 적용하여 24시간 퍼징한 결과, BB coverage를 ProFuzzer보다 6% 높고 WEIZZ 퍼저보다 26% 높게 확보
→ 다른 퍼저에서 놓친 20개의 버그 탐지
CONCLUSION
CONCLUSION
기존 퍼저의 입력 형식을 인식하는데 문제를 해결하기 위해 자동으로 입력 형식을 리버스 엔지니어링하여 퍼징 과정에 활용하는 AIFORE 제안. 오염 분석으로 각 입력 바이트 처리하는 기본 블록 추론 후, 최소 클러스터 알고리즘으로 입력 바이트를 그룹화하였으며, 신경망 모델을 이용하여 기본 블록 동적 기반으로 입력 필드 타입 추론 후 power scheduling 알고리즘 통한 퍼징 진행하는 방법 제시.