DASE

보안공학연구논문지 14(6), 2017 · 실습 데모

멀티미디어 파일 취약점 분석을 위한 퍼징 기반 테스트 케이스 생성 기법

파일 퍼징은 입력 파일을 조금씩 바꿔 가며 소프트웨어가 비정상적으로 동작하는지 확인하는 보안 테스팅 기법입니다. 이 데모는 논문의 변이 기법(SWAP, BIT-FLIPPING)과 제안 FLIPPING 알고리즘이 테스트 케이스를 얼마나 만들어 내는지를 계산하고, 효율성 주장의 근거를 다시 따져 봅니다. 바이트는 i·j·k·l 같은 추상 기호로만 다룹니다. 논문 DOI

퍼즈 테스팅의 분류 (표 3)

기준종류내용
입력 주입 형태단순키보드 입력값 변경
파일소프트웨어가 읽는 파일 변경
네트워크송수신 패킷 변경
입력 처리 방법생성 기반완전히 새 입력 생성
변이 기반기존 입력 일부 변경
분석 정도덤(블랙박스)구조 분석 없이 무작위
스마트(화이트박스)소스코드 분석
바이너리(그레이박스)역공학으로 취약 예상 지점

논문은 굵게 표시한 변이 기반 바이너리 파일 퍼징을 다룹니다.

논문의 제안 (그림 8)

  1. 입력 파일 분석: 파일을 16진수로 보고, 파일 형식 템플릿(010 Editor)으로 헤더·데이터 영역을 나눕니다.
  2. 테스팅 영역 추출: 공개된 기존 취약점 정보와 간단한 변이(SWAP, BIT-FLIPPING, 00/FF 대입)로 반응이 큰 영역만 고릅니다.
  3. 테스트 케이스 생성: 고른 영역에 FLIPPING 알고리즘을 적용해, 1~4바이트를 골라 그 바이트들이 가질 수 있는 모든 값의 조합을 만듭니다.

핵심 주장: 테스트 영역을 줄여 효율을 높이고, 여러 바이트를 함께 바꿔 기존 기법이 놓치는 결함까지 찾는다.

그림 4 · 변이 기반 바이너리 파일 퍼징 과정

그림 4

그림 8 · 제안 테스트 케이스 생성 기법

그림 8

그림 1 · 멀티미디어 소프트웨어 취약점 분포

그림 1

파일 형식 취약점이 약 44%로 가장 많습니다(논문 인용 자료).

그림 2 · 멀티미디어 파일의 일반 구조

그림 2

헤더에는 형식·크기·비트율 같은 필드가 있고, 소프트웨어는 이 값을 믿고 메모리를 할당하거나 데이터를 읽습니다. 그래서 헤더가 퍼징의 주된 대상이 됩니다.

원본 영역을 네 바이트 i j k l로 놓고, 각 기법이 어떤 테스트 케이스를 만드는지 직접 펼쳐 봅니다(그림 6·7·12). 빨간 칸이 바뀐 바이트입니다.

ijkl

기법끼리 서로 못 찾는 변이

논문 4.1절은 두 기존 기법이 서로 보완적임을 보였습니다.

  • SWAP만 만드는 변이: 두 바이트의 위치가 바뀐 경우(예: i j → j i). BIT-FLIPPING은 한 번에 한 바이트만 바꾸므로 두 바이트가 동시에 바뀐 상태를 만들지 못합니다.
  • BIT-FLIPPING만 만드는 변이: 한 바이트가 새로운 값이 된 경우(예: 00 → 07). SWAP은 이미 있는 값을 옮길 뿐 새 값을 만들지 못합니다.
  • FLIPPING d≥2: 두 바이트 이상을 동시에 아무 값으로 바꾸므로 위 둘을 모두 포함합니다. 하지만 그 대가가 ③ 탭의 경우의 수 폭발입니다.

여러 바이트를 함께 바꿔야 드러나는 결함(예: 크기 필드와 실제 데이터 길이가 함께 어긋나는 경우)이 있다는 점에서 다중 바이트 변이의 필요성 자체는 타당합니다. 문제는 “모든 값을 다 시도하는” 방식입니다.

그림 6 · SWAP 기법

그림 6

그림 7 · BIT-FLIPPING 기법

그림 7

영역 길이와 변이 바이트 수에 따른 테스트 케이스 수

FLIPPING은 d개 바이트를 고르는 위치 C(c, d)가지 × 그 바이트들의 값 256d가지를 d = 1…최대 d까지 더합니다(논문 3.3절의 설명대로 계산). 테스트 1건 = 변이 파일 하나를 대상 소프트웨어로 열고 이상 여부를 확인하는 시간입니다.

로그 눈금으로 본 증가 속도

표 7·8 · 세 기법의 영역과 소요 시간

영역은 수백~수만 분의 1로 줄었는데 시간은 왜 2/3에 그칠까

제안 기법은 테스트 영역을 일반 기법의 평균 0.06%로 줄였지만, 소요 시간은 평균 65.3%로만 줄었습니다. 영역 축소 효과를 다중 바이트 조합(256d)이 대부분 상쇄했기 때문입니다.

수치를 맞춰 보면

    그림 16 · AVI·FLV 파일 구조와 영역 번호

    그림 16

    그림 10 · 테스팅 영역 추출 과정

    그림 10

    “모든 값을 다 시도”하는 대신, 오늘날 퍼저는 경계값(interesting values)과 코드 커버리지 피드백으로 경우의 수를 줄입니다. 같은 영역에서 두 방식의 테스트 케이스 수를 비교해 봅니다.

    경계값의 예: 0x00, 0x01, 0x7F, 0x80, 0xFE, 0xFF처럼 부호·오버플로 경계에 걸리는 값, 그리고 크기 필드라면 실제 길이 ±1. 논문도 영역 추출 단계에서 00·FF를 넣어 보았는데, 같은 생각을 생성 단계까지 넓히면 256d 대신 kd로 줄어듭니다.

    2017년 이후 표준이 된 접근

    • 커버리지 기반 퍼징(AFL/AFL++, libFuzzer, honggfuzz): 새 코드 경로를 연 입력만 남겨 다음 변이의 씨앗으로 씁니다. “어느 영역이 취약한가”를 사람이 고르는 대신 실행 피드백이 고릅니다.
    • 결정적 단계 + 무작위 단계: 비트·바이트 뒤집기, 경계값 대입, 산술 증감을 짧게 훑은 뒤 무작위 조합(havoc)으로 넘어갑니다. 모든 조합을 다 시도하지 않습니다.
    • 구조 인지 퍼징: 파일 형식 문법이나 사전(dictionary)을 써서 형식을 깨지 않으면서 필드를 바꿉니다. 논문의 010 Editor 템플릿 아이디어를 자동화한 셈입니다.
    • 새니타이저(ASan, UBSan): 크래시로 드러나지 않는 메모리 오류까지 즉시 잡아 결함 판정을 정확하게 합니다.
    • 지속 퍼징: OSS-Fuzz처럼 코드 변경마다 계속 돌리는 체계가 일반화되었습니다. 논문에서 쓴 CERT FOE는 이후 CERT BFF로 통합되었습니다.

    현재 관점의 검토 의견

    1. “모든 값의 조합”은 실행할 수 없습니다. 4바이트 영역에 d = 4까지 적용하면 약 43억 건이고, 논문의 AVI 추출 영역(약 0.08 KB)에 그대로 적용하면 천문학적인 수가 됩니다(③ 탭). 표 8의 932시간과 맞지 않으므로, 실제로 어떤 d와 어떤 영역에 적용했는지 밝혀야 합니다.
    2. 효율의 기준이 시간뿐입니다. 비교 지표가 테스트 경로 길이와 소요 시간뿐이고, 각 기법이 찾은 결함 수, 고유 크래시 수, 코드 커버리지가 없습니다. “기존 기법이 못 찾는 취약점을 추가로 발견했다”는 주장에 수치가 필요합니다.
    3. 시간 모델의 입력값이 없습니다. 수식 1(p = l·c·t/m)의 c(1회 변이 시간), t(바이트당 변이 횟수), m(장비 수)을 제시하지 않아 표 8을 재현할 수 없습니다. 일반 기법의 1,075시간을 파일 전체 BIT-FLIPPING으로 역산하면 테스트 1건에 약 2.4 ms인데, 플레이어를 실행해 결과를 확인하기에는 너무 짧습니다.
    4. 영역 추출이 사람의 판단에 의존합니다. 표 5의 반응(“음향 오류”, “인식 불가”)을 보고 취약 영역을 고르는데, 증상이 드러나지 않는 영역의 결함은 처음부터 제외됩니다. 영역 추출 단계 자체의 미탐률을 평가해야 합니다.
    5. 결함 판정 기준이 약합니다. “재생 중 정지”, “기능 오류” 같은 관찰 증상과 크래시를 구분해 보고해야 합니다. 메모리 오류 여부(새니타이저나 디버거 기반 분류)와 같은 결함의 중복 제거(triage)도 필요합니다.
    6. 비교 대상이 오래되었습니다. 2017년에는 이미 AFL(2013~)과 libFuzzer가 널리 쓰였습니다. 커버리지 기반 퍼저와 같은 시간을 주고 비교했다면 제안 기법의 위치가 분명해졌을 것입니다.
    7. 실험 범위가 좁습니다. 영상 파일 2종(AVI, FLV), 플레이어 2종, 파일 하나씩만 실험했고, ImageMagick 5.5.7(2003년 버전)은 매우 오래된 판입니다. 여러 입력 파일, 여러 버전, 반복 실행이 필요합니다.
    8. 표기 오류: 그림 3 캡션 “CVE-2008-574”는 본문의 CVE-2008-5745와 다르고, “AVX 파일”은 AVS로 보입니다. 표 8 ‘헤더 대비’ 비율도 표의 시간으로 다시 계산하면 433.7% → 435.5%, 219.5% → 220.2%로 조금 다릅니다.

    수업 과제

    1. ③ 탭에서 영역 길이 8바이트, d = 2일 때의 테스트 케이스 수를 손으로 계산하고, 하루 안에 끝내려면 장비가 몇 대 필요한지 구하세요.
    2. ⑤ 탭의 경계값 방식으로 같은 영역을 테스트하면 몇 건으로 줄어드는지 계산하고, 그 대신 무엇을 놓칠 수 있는지 토론하세요.
    3. “기법 A가 기법 B보다 효율적이다”를 보이기 위한 실험 설계(지표, 반복 횟수, 통계 검정)를 작성하세요.
    4. 직접 작성한 작은 파서 프로그램(교육용)을 libFuzzer나 AFL++로 퍼징하고, 커버리지가 시간에 따라 늘어나는 그래프를 그려 보세요.

    연구를 보강한다면

    • 제안 알고리즘의 d와 영역별 테스트 케이스 수를 표로 공개
    • 찾은 고유 결함 수, 커버리지, 첫 결함까지 걸린 시간으로 효율 비교
    • AFL++ 등 커버리지 기반 퍼저와 같은 시간 예산으로 비교
    • 경계값·사전 기반 변이로 다중 바이트 조합의 경우의 수를 줄이는 개선안
    • 새니타이저를 쓴 결함 판정과 중복 제거, 발견 결함의 책임 있는 공개 절차 기술

    그림 9 · 입력 파일 분석 과정

    그림 9

    그림 11 · FLIPPING 알고리즘 흐름도(일부)

    그림 11

    그림 12 · 4바이트 영역의 순차 변이 방식

    그림 12

    그림 출처: 김상수·강동수, 「멀티미디어 파일 취약점 분석을 위한 퍼징 기반 테스트 케이스 생성 기법」, 보안공학연구논문지 14(6), pp.441–458, 2017. 교육 목적으로 출처를 밝혀 인용합니다.

    연구·교육용 데모 · 테스트 케이스 수와 시간은 논문의 규칙으로 계산한 값이며, 이 페이지는 실제 변이 파일을 만들거나 소프트웨어를 실행하지 않습니다.