굶기거나 채우지 마세요: 온디맨드 입력 전달을 통한 펌웨어 퍼징 (Fuzzing) 효율성 향상
요약
기존 펌웨어 퍼징 방식은 입력 전달 타이밍과 양을 조절하지 못해 데이터 과부하(stuffing)나 부족(starving) 현상이 발생하여 효율이 떨어지는 문제가 있습니다. 본 논문은 정적 및 동적 분석을 통해 입력 처리 경로를 세 단계로 매핑하고, 최적의 시점에 입력을 전달하는 FIDO 프로토타입을 제안합니다. FIDO는 기존 도구 대비 코드 커버리지를 대폭 향상시키며 새로운 버그를 식별하는 데 성공했습니다.
핵심 포인트
- 펌웨어 입력의 비동기적 특성으로 인한 기존 퍼징 방식의 한계(stuffing 및 starving) 지적
- 정적 및 동적 분석을 활용하여 입력 경로를 '검색-확인-처리'의 3단계로 매핑
- 의미론적 정보를 바탕으로 최적의 타이밍과 데이터 양을 결정하는 온디맨드 입력 전달 방식 제안
- FIDO 프로토타입을 통해 기존 Fuzzware, MULTIFUZZ, SEmu 대비 코드 커버리지 및 버그 발견율 대폭 개선
펌웨어 퍼징 (Fuzzing)은 펌웨어 버그를 식별하기 위해 주목받고 있습니다. 그러나 현재의 접근 방식은 일반 소프트웨어용 퍼징 도구를 직접 통합하는 경우가 많습니다. 일반 소프트웨어는 I/O 함수를 만날 때 입력을 받지만, 펌웨어 입력은 펌웨어의 실행과 독립적으로, 그리고 비동기적으로 불확실한 타이밍과 양으로 전달될 수 있습니다. 펌웨어의 예외 상황을 완전히 인지하지 못하는 기존 솔루션들은 퍼저 (Fuzzer)가 생성한 입력을 임의의 방식으로 펌웨어에 부주의하게 전달하곤 합니다. 이는 펌웨어의 처리 기능을 압도하거나 (stuffing), 입력 처리 함수를 트리거할 만큼 충분한 입력 데이터를 전달하지 못하는 (starving) 결과를 초래합니다. 두 경우 모두 퍼징 능력이 약화됩니다.
본 논문에서는 입력 전달 문제를 종합적으로 조사합니다. 테스트 케이스를 전달하기 위한 최적의 타이밍과 양을 결정하기 위해, 우리는 펌웨어가 데이터를 사용하기 전에 입력 가용성을 확인해야 한다는 사실을 활용합니다. 따라서 우리는 정적 및 동적 분석 (Static and Dynamic Analysis)을 사용하여 각 입력 처리 경로를 입력 검색 (Input retrieval), 가용성 확인 (Availability check), 처리 (Processing)의 세 단계로 매핑합니다. 이렇게 복구된 의미론적 정보 (Semantic information)를 통해 퍼저는 예상 길이 범위 내의 가용성 확인 시점에 입력을 정확하게 전달할 수 있습니다. 다중 입력 경로 문제에 대해서는 더 다양한 경로에 도달할 수 있도록 스케줄링 알고리즘을 최적화했습니다.
우리의 프로토타입인 FIDO는 기존 펌웨어 퍼저의 테스트 케이스 전달 효과를 향상시키는 애드온 (Add-on) 역할을 할 수 있습니다. Fuzzware 및 MULTIFUZZ에서 사용되는 임의의 입력 전달 방식과 비교했을 때, FIDO는 각각 중앙값 코드 커버리지 (Code coverage)를 최대 115%와 54%까지 증가시켰습니다. 사람이 수동으로 입력 전달 지점을 지정해야 하는 SEmu와 비교해도, FIDO는 커버리지를 최대 19%까지 개선했습니다. 결과적으로 FIDO는 알려진 버그를 훨씬 더 빠르게 발견하며, 이전에 알려지지 않았던 5개의 버그를 새롭게 식별했습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 arXiv Codex (cs.SE)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기