라이브러리는 독립적으로 실행되지 않고 많은 응용 프로그램에서 사용되므로, 라이브러리의 취약점을 사전에 탐지하는 것은 중요하다. 라이브러리 취약점을 탐지하기 위해 동적 분석 방법인 퍼징이 사용되고 있다. 퍼징 기술은 코드 커버리지 및 크래시 발생 횟수 측면에서 개선된 결과를 보여주지만, 그 효과를 라이브러리 퍼징에 적용하기는 쉽지 않다. 특히, 라이브러리의 다양한 상태를 재현하려면 특정 함수 시퀀스를 호출하고 퍼저의 입력을 전달하여 라이브러리 코드를 실행하는 퍼징 대상 파일과 시드코퍼스가 필요하다. 그러나 퍼징 환경(시드 코퍼스, 퍼징 대상 파일)을 준비하는 것은 라이브러리에 대한 이해와 퍼징에 대한 이해가 동시에 필요한 어려운 일이다. 이에, 본 논문에서는 테스트 프레임워크를 활용하여 라이브러리 퍼징의 용이성을 확보하고, 코드 커버리지와 크래시 탐지 성능을 향상하기 위한 개선 방법을 제안한다. 본 논문에서 제안한 시스템은 9개의 오픈 소스 라이브러리에 적용하여 기존 연구들과 비교를 통한 개선 효과를 검증하였다. 실험 결과 코드 커버리지 31.2%, 크래시 탐지 기준 58.7%의 개선효과를 확인하였고, 3개의 알려지지 않는 취약점을 탐지하였다.
라이브러리는 독립적으로 실행되지 않고 많은 응용 프로그램에서 사용되므로, 라이브러리의 취약점을 사전에 탐지하는 것은 중요하다. 라이브러리 취약점을 탐지하기 위해 동적 분석 방법인 퍼징이 사용되고 있다. 퍼징 기술은 코드 커버리지 및 크래시 발생 횟수 측면에서 개선된 결과를 보여주지만, 그 효과를 라이브러리 퍼징에 적용하기는 쉽지 않다. 특히, 라이브러리의 다양한 상태를 재현하려면 특정 함수 시퀀스를 호출하고 퍼저의 입력을 전달하여 라이브러리 코드를 실행하는 퍼징 대상 파일과 시드 코퍼스가 필요하다. 그러나 퍼징 환경(시드 코퍼스, 퍼징 대상 파일)을 준비하는 것은 라이브러리에 대한 이해와 퍼징에 대한 이해가 동시에 필요한 어려운 일이다. 이에, 본 논문에서는 테스트 프레임워크를 활용하여 라이브러리 퍼징의 용이성을 확보하고, 코드 커버리지와 크래시 탐지 성능을 향상하기 위한 개선 방법을 제안한다. 본 논문에서 제안한 시스템은 9개의 오픈 소스 라이브러리에 적용하여 기존 연구들과 비교를 통한 개선 효과를 검증하였다. 실험 결과 코드 커버리지 31.2%, 크래시 탐지 기준 58.7%의 개선효과를 확인하였고, 3개의 알려지지 않는 취약점을 탐지하였다.
Because the library cannot be run independently and used by many applications, it is important to detect vulnerabilities in the library. Fuzzing, which is a dynamic analysis, is used to discover vulnerabilities for the library. Although this fuzzing technique shows excellent results in terms of code...
Because the library cannot be run independently and used by many applications, it is important to detect vulnerabilities in the library. Fuzzing, which is a dynamic analysis, is used to discover vulnerabilities for the library. Although this fuzzing technique shows excellent results in terms of code coverage and unique crash counts, it is difficult to apply its effects to library fuzzing. In particular, a fuzzing executable and a seed corpus are needed that execute the library code by calling a specific function sequence and passing the input of the fuzzer to reproduce the various states of the library. Generating the fuzzing environment such as fuzzing executable and a seed corpus is challenging because it requires both understanding about the library and fuzzing knowledge. We propose a novel method to improve the ease of library fuzzing and enhance code coverage and crash detection performance by using a test framework. The systems's performance in this paper was applied to nine open-source libraries and was verified through comparison with previous studies.
Because the library cannot be run independently and used by many applications, it is important to detect vulnerabilities in the library. Fuzzing, which is a dynamic analysis, is used to discover vulnerabilities for the library. Although this fuzzing technique shows excellent results in terms of code coverage and unique crash counts, it is difficult to apply its effects to library fuzzing. In particular, a fuzzing executable and a seed corpus are needed that execute the library code by calling a specific function sequence and passing the input of the fuzzer to reproduce the various states of the library. Generating the fuzzing environment such as fuzzing executable and a seed corpus is challenging because it requires both understanding about the library and fuzzing knowledge. We propose a novel method to improve the ease of library fuzzing and enhance code coverage and crash detection performance by using a test framework. The systems's performance in this paper was applied to nine open-source libraries and was verified through comparison with previous studies.
본 연구에는 그레이박스 퍼저를 기반으로 초기 입력 데이터 역할을 하는 시드 코퍼스와 퍼징의 대상이 되는 퍼징 대상 파일을 자동으로 생성하는 연구를 수행한다. 이에 관련 연구로 그레이박스에 관한 관련 연구를 먼저 논의하고, 시드 코퍼스 및 퍼징 대상 파일 생성에 대한 자동화 관련 연구를 소개한다.
제안 방법
더 많은 명령이 실행되면 코드의 더 많은 부분을 방문하여 버그를 발견할 기회가 증가한다. 따라서 방문한 코드 라인의 수를 측정하여 발견된 크래시 수와 함께 그레이박스 퍼저의 성능을 평가한다.
이를 위해서는 사람의 많은 개입이 필요하다. 본 시스템에서는 사람이 수동으로 FA들을 선정하는 방법과 과정을 모방하여, FA를 추론하는 자동화 방법을 제안한다. Fig.
본 연구에서 제안하는 FuzzBuilderEx 시스템은 사람의 개입을 최소화하기 위해 라이브러리 프로젝트에 존재하는 테스트 프로그램의 정적/동적 분석을 통해 획득한 정보를 활용하여 퍼즈 드라이버를 자동으로 생성한다. 또한, 개발자는 FuzzBuilderEx 시스템을 통해 퍼징을 위한 코드 작성의 부담에서 벗어날 수 있으며, 검증자는 라이브러리에 대한 적은 이해로 라이브러리에 퍼징을 적용할 수 있다.
본 연구에서는 시드 코퍼스를 생성하기 위해서 앞서 선정된 FA의 매개변수 값을 저장하는 방식을 사용한다. 즉, 테스트 데이터 및 테스트 케이스를 통해 입력되는 값이 FA의 매개변수에 전달이 되어, 실행되는 시점에 해당 값을 저장하는 방식을 통해 시드 코퍼스를 자동으로 생성한다.
본 연구에서는 이를 자동화하여 FA의 후보가 될 수 있는 API들을 선정하고, 이를 위한 FA 설정 파일을 생성한다. 이 생성된 FA 후보군을 그대로 또는 이를 참고하여 FA를 지정할 수 있다.
테스트 프레임워크는 테스트 대상이 되는 라이브러리를 독립적인 실행 파일로 생성하여 테스트를 수행한다. 본 연구에서는 이를 활용하여 여기서 생성된 실행 파일을 퍼징 대상 파일로 변모시킨다. 즉, 앞서 적용하였던 FA 매개변수 값 치환 등의 퍼저와 퍼징 대상과의 연결 부분을 테스트 프로그램에 적용하여 최종적으로 퍼징 대상 파일을 생성한다.
많은 보안 커뮤니티에서 소프트웨어 취약성을 발견하기 위한 자동화된 접근 방식으로 퍼징에 관한 연구를 진행했음에도 불구하고, 퍼징에는 실행 환경, 특히 퍼징을 위한 퍼징 대상 파일이 필요하므로 많은 최신의 퍼징 방법이 라이브러리에는 제대로 적용되지 못했다. 이러한 문제를 해결하기 위해 테스트 프레임 워크를 기반으로 라이브러리용 퍼즈 드라이버를 자동으로 생성하는 시스템인 FuzzBuilderEx 시스템을 제안하였다. 특히, 본 연구진은 테스트 프레임워크를 사용하여 라이브러리용 퍼즈 드라이버를 생성하는 최초의 연구를 제안한 이후, 퍼징 성능과 효율성을 극적으로 개선한 접근 방식을 제안하였다.
테스트 프로그램을 기반으로 자동 생성된 퍼징 대상 파일은 퍼징과는 상관없는 함수 호출이나 연산이 포함되어 있다. 이를 위해 본 연구에서는 퍼징 대상 파일을 최적화하는 단계를 추가하였다. 기존 연구에서는 단순히 FA에 들어가는 값을 시드의 값으로 치환될 수 있도록 하였기에, 실질적으로 퍼징에서 필요로 하지 않는 FA가 포함되지 않은 함수나 상태를 확인하기 위한 코드들을 포함하고 있다.
본 연구에는 그레이박스 퍼저를 기반으로 초기 입력 데이터 역할을 하는 시드 코퍼스와 퍼징의 대상이 되는 퍼징 대상 파일을 자동으로 생성하는 연구를 수행한다. 이에 관련 연구로 그레이박스에 관한 관련 연구를 먼저 논의하고, 시드 코퍼스 및 퍼징 대상 파일 생성에 대한 자동화 관련 연구를 소개한다.
하지만 퍼징에서 이 테스트 매크로는 필요가 없으므로, 퍼징 대상 파일에서 이를 제거해줄 필요가 있다. 이에 본 연구에서는 이를 제거하면서도, 퍼징 과정에는 영향을 주지 않도록 퍼징 대상 파일을 최적화한다.
앞선 퍼즈 드라이버의 효율성을 검증하기 위한 실험은 FA를 OSSFuzz 기준으로 제한하여 실험을 진행하였다. 이에 이번 절에서는 OSSFuzz에 포함된 cJSON 프로젝트와 OSSFuzz에 포함되지 않는 mpc 프로젝트 선정하여 실제 취약점을 찾을 수 있는지 확인하기 위한 추가 실험을 진행하였다. 파싱 (parsing) 관련 라이브러리 중 가장 빈번하게 사용되는 프로젝트 중 테스트 코드를 프로젝트 내에 포함 하고 있는 것을 선정 기준으로 하였고, 이렇게 선정된 2개 프로젝트는 FA의 제약 없이 사용 가능한 모든 FA를 자동 선정하여 실험에 적용하였다.
하지만 여전히 라이브러리 퍼징을 위해서는 검증자의 개입을 많이 필요로 하며, 제한된 API만을 대상으로 적용할 수 있다는 한계가 있다. 이에 제안하는 FuzzBuilderEx 시스템은 선행 연구를 고도화하고 자동화를 더하여 기존보다 더욱 사람의 개입을 최소화하고, 더 많은 FA를 대상으로 퍼징을 할 수 있도록 하였다.
위의 연구들은 다양한 분석을 통해 일련의 함수 시퀀스를 생성하고, 이에 맞는 입력값 형식을 구체화하여 이를 충족하는 시드 코퍼스를 생성한다. 즉, 위의 연구들은 다양한 분석을 통해 입력값 형식을 구체화하고 이를 충족하는 시드 코퍼스를 생성하는 반면에, 본 연구에서는 개발자가 작성한 테스트 코드의 함수 시퀀스를 사용하여 시드 코퍼스를 생성한다. 특히 개발자가 개발 단계에서 검증을 위해 사용하는 테스트 코드를 그대로 사용하므로 별도의 노력 없이 효율적인 시드 코퍼스를 생성할 수 있으며, 무엇보다 주요 사용 시나리오를 기반으로 작성된 테스트 코드를 컴파일(compile)한 테스트 프로그램을 수정하여 퍼징 대상 파일을 자동으로 생성할 수 있다는 점에서 기존 연구와 차별화된다.
2) 시드 코퍼스 생성 단계에서는 수정된 라이브러리와 테스트 프로그램을 사용하여 시드 코퍼스를 생성한다. 특히 커버리지 측면의 퍼징 성능 향상을 위하여 본 연구에서는 문자열을 인자로 사용하는 FA뿐만 아니라 정수를 인자로 사용하는 FA도 대상으로 퍼징 할 수 있도록 확장하였다.
이러한 문제를 해결하기 위해 테스트 프레임 워크를 기반으로 라이브러리용 퍼즈 드라이버를 자동으로 생성하는 시스템인 FuzzBuilderEx 시스템을 제안하였다. 특히, 본 연구진은 테스트 프레임워크를 사용하여 라이브러리용 퍼즈 드라이버를 생성하는 최초의 연구를 제안한 이후, 퍼징 성능과 효율성을 극적으로 개선한 접근 방식을 제안하였다.
대상 데이터
52b를 사용하였고 또한 AddressSanitizer도 함께 사용하였다. AFL은 64bit 실행 파일에 대한 AddressSanitizer를 지원하지 않기 때문에, 평가를 위한 검증 대상은 모두 32bit로 빌드하였다.
FuzzBuilderEx는 C/C++로 개발된 라이브러리만을 대상으로 한다. 본 연구에서는 자동화를 위해서 테스트 프레임워크와 LLVM IR을 이용 하였기 때문에 다른 프로그램 언어로의 확장이 비교적 쉬울 수 있으나, 언어적인 특성을 고려하기 위해서 추가 연구를 수행해야 한다.
OSSFuzz와의 비교를 위하여 OSSFuzz가 프로젝트별로 선정한 FA와 같게 퍼징 대상 파일을 생성하였다. 단, 1) 프로젝트 내에 테스트 코드가 없거나, 2) 테스트 코드에 FA와 관련된 테스트 케이스 가 없는 경우, 본 연구에서는 퍼징 환경을 자동 생성할 수 없으므로 검증 대상에서 제외하였다.
FuzzBuilderEx를 통해 자동 생성된 시드 코퍼스의 효율성을 검증하기 위하여 프로젝트별 선정된 FA들에 대한 각각의 시드 코퍼스를 생성하여, 커버리지를 비교하였다. 공정한 비교를 위해 퍼징의 대상이 되는 퍼징 대상 파일은 OSSFuzz에서 생성한 퍼 징 대상 파일을 같게 사용하고, 시드 코퍼스만 OSSFuzz, FuzzBuilder, FuzzBuilderEx에서 각각 생성한 것을 사용하였다. 시드 생성의 기준이 되는 FA의 선정 또한 공정한 비교를 위해 OSSFuzz에서 FA로 사용하고 있는 것으로 제한하였다.
은 OSSFuzz와 FuzzBuilder 그리고 FuzzBuilderEx를 통해 각각 생성한 퍼징 대상 파일을 대상으로 크래시 발생 개수와 커버리지를 측정한 결과이다. 앞선 시드 코퍼스 효율성 평가 방법과 같이 7개 프로젝트를 대상으로 측정하였으며, OSSFuzz 결과와 비교하면 총 6개 프로젝트에서 크래시와 커버리지 모두 우수한 결과를 도출할 수 있 었다. 다만, BoringSSL의 경우 앞선 “CBS_init” 과 같은 이유로 다양한 함수 시퀀스에 대한 테스트 코드가 부족하여 OSSFuzz 대비 커버리지와 크래시 모두 낮은 성능을 보였다.
이러한 기준으로 본 연구에서는 검증을 위한 총 9개의 오픈 소스 프로젝트에 FuzzBuilderEx를 적용하였다. 이 중에 7개의 프로젝트는 성능 비교를 위해 OSSFuzz와 FuzzBuilderEx 모두 적용하였고, 나머지 2개 프로젝트는 취약점 분석 목적으로 FuzzBuilderEx만 적용하였다. 실험에 적용한 프로젝트 목록은 Table 1.
이에 이번 절에서는 OSSFuzz에 포함된 cJSON 프로젝트와 OSSFuzz에 포함되지 않는 mpc 프로젝트 선정하여 실제 취약점을 찾을 수 있는지 확인하기 위한 추가 실험을 진행하였다. 파싱 (parsing) 관련 라이브러리 중 가장 빈번하게 사용되는 프로젝트 중 테스트 코드를 프로젝트 내에 포함 하고 있는 것을 선정 기준으로 하였고, 이렇게 선정된 2개 프로젝트는 FA의 제약 없이 사용 가능한 모든 FA를 자동 선정하여 실험에 적용하였다.
데이터처리
FuzzBuilderEx를 통해 자동 생성된 시드 코퍼스의 효율성을 검증하기 위하여 프로젝트별 선정된 FA들에 대한 각각의 시드 코퍼스를 생성하여, 커버리지를 비교하였다. 공정한 비교를 위해 퍼징의 대상이 되는 퍼징 대상 파일은 OSSFuzz에서 생성한 퍼 징 대상 파일을 같게 사용하고, 시드 코퍼스만 OSSFuzz, FuzzBuilder, FuzzBuilderEx에서 각각 생성한 것을 사용하였다.
FuzzBuilderEx를 통해 자동 생성된 퍼징 대상 파일의 효율성을 검증하기 위하여 각 퍼징 시 발생한 크래 시의 개수와 커버리지를 측정하여 비교하였다. 시드 코퍼스의 효율성 평가와 마찬가지로 공정한 평가를 위해 앞서 FuzzBuilderEx를 사용하여 생성한 시드 코퍼스를 사용하는 것으로 하였다.
본 연구에서는 실험을 통해 FuzzBuilderEx의 효과에 대해서 검증을 진행하였다. 먼저, 본 연구가 제안하는 퍼징 자동화를 통해 사람의 개입을 얼마나 감소시켰는지를 퍼징의 절차를 구분하여, 절차별로 자동화 가능 여부를 분석하였다. 특히, 본 연구는 사람의 개입을 가장 많이 필요로 하고, 시간이 많이 소요되는 FA 선정과 퍼즈 드라이버 생성 작업을 자동화해서 선행 연구 대비 큰 수준의 개선 효과를 달성할 수 있었다.
본 실험에서는 FuzzBuilderEx의 효율성과 편리성 검증을 위해 OSSFuzz, 그리고 선행 연구인 FuzzBuilder와의 실험 결과를 비교한다. 실험을 통해 검증하고자 하는 항목은 다음과 같다.
본 연구에서는 실험을 통해 FuzzBuilderEx의 효과에 대해서 검증을 진행하였다. 먼저, 본 연구가 제안하는 퍼징 자동화를 통해 사람의 개입을 얼마나 감소시켰는지를 퍼징의 절차를 구분하여, 절차별로 자동화 가능 여부를 분석하였다.
본 연구의 실험에서는 총 7개의 오픈 소스 프로젝트에 FuzzBuilderEx를 적용하여 퍼즈 드라이버의 효율성을 평가하였다. 본 연구를 통해 자동 생성한 시드 코퍼스는 기존 연구 대비 약 31.
앞선 퍼즈 드라이버의 효율성을 검증하기 위한 실험은 FA를 OSSFuzz 기준으로 제한하여 실험을 진행하였다. 이에 이번 절에서는 OSSFuzz에 포함된 cJSON 프로젝트와 OSSFuzz에 포함되지 않는 mpc 프로젝트 선정하여 실제 취약점을 찾을 수 있는지 확인하기 위한 추가 실험을 진행하였다.
퍼징 준비 과정을 자동화해줌에 따라 얼마나 사람의 개입을 절감시켜주는지 평가하기 위해 퍼징의 절차를 나열하고 각 항목에 대한 사람의 개입이 필요한지 아닌지를 판단하여 각 항목에 대한 자동화 수준을 비교한다. 단 여기서 사람은 검증자뿐만 아니라 개발자도 될 수 있으며, 개발자 또는 검증자에 따른 난이도 차이가 분명하기에 이를 분리하여 기술한다.
이론/모형
실험을 위해 사용한 퍼저는 대표적인 그레이박스 퍼징 도구인 AFL 2.52b를 사용하였고 또한 AddressSanitizer도 함께 사용하였다. AFL은 64bit 실행 파일에 대한 AddressSanitizer를 지원하지 않기 때문에, 평가를 위한 검증 대상은 모두 32bit로 빌드하였다.
단, 1) 프로젝트 내에 테스트 코드가 없거나, 2) 테스트 코드에 FA와 관련된 테스트 케이스 가 없는 경우, 본 연구에서는 퍼징 환경을 자동 생성할 수 없으므로 검증 대상에서 제외하였다. 이러한 기준으로 본 연구에서는 검증을 위한 총 9개의 오픈 소스 프로젝트에 FuzzBuilderEx를 적용하였다. 이 중에 7개의 프로젝트는 성능 비교를 위해 OSSFuzz와 FuzzBuilderEx 모두 적용하였고, 나머지 2개 프로젝트는 취약점 분석 목적으로 FuzzBuilderEx만 적용하였다.
성능/효과
은 프로젝트별 취약점 분석 결과를 보여 준다. 2개 프로젝트에서 총 3개의 취약점을 발견하 였고, mpc의 2개 취약점은 각각 Stack Buffer Overflow와 Heap Buffer Overflow 취약점으로, 개발자의 검증 이후 다음 버전 배포 시에 패치되었으며, cJSON의 경우 NULL Dereference 취약점 을 발견하여 신규 CVE로 등록되었다. 무엇보다도 cJSON에서 신규로 발견한 취약점의 경우 OSSFuzz를 통해 발견하지 못한 취약점을 FuzzBuilderEx를 통해 찾았다는 점에서 의미가 크다.
FuzzBuilderEx에서 생성된 퍼징 대상 파일은 AFL과 같은 다른 퍼저에서 사용할 수 있어 다양한 베이스 퍼저의 사용을 통한 확장이 가능하고, 퍼징을 위한 소스 코드의 작성 및 유지 관리를 제거하여 개발자에 의한 퍼징을 쉽게 한다. 또한, 이 방법을 사용하면 검증자가 프로젝트에 대한 고수준의 지식 없이 퍼징을 수행할 수 있으며, 개발자 또한 퍼징에 대한 고수준의 퍼징을 수행할 수 있다.
이러한 실험 결과를 통해 우리는 FuzzBuilderEx가 사람의 개입을 최소화하여 라이브러리의 퍼징을 쉽게 해줄 수 있고, 또한 자동으로 생성한 퍼즈 드라이버를 통해 효율적인 퍼징이 가능함을 확인할 수 있었다. 그 뿐만 아니라 실제 취약점 분석에도 효과가 있음을 증명하였다.
이는 기존 연구 대비 FA의 매개변수 확장을 통해 퍼징 가능 범위가 확장되었기 때문으로 예측한다. 그뿐만 아니라 자동 생성된 퍼징 대상 파일도 크래시 발생 개수를 기준으로 기존 연구 대비 약 58.7% 향상이 있었다. 이는 FA의 매개변수 확장뿐 아니라, 퍼징 대상 파일의 최적화를 통해 퍼징에 불필요한 부분을 최소화하여 좀 더 의미 있는 영역을 집중적으로 퍼징 할 수 있도록 하였기 때문이다.
그 후 FuzzBuilderEx는 이전에 이용했던 테스트 프로그램을 이용하여 퍼징을 위한 퍼징 대상 파일을 생성한다. 기존 연구에서는 FA의 매개변수에 들어가는 값을 퍼징에서 사용되는 변수로 대체 하는 것만을 수행하였지만, 본 연구에서는 퍼징 수행에 불필요한 함수를 제거하고 기능 단위로 세분화하여 더 향상된 효율성을 기대할 수 있다.
또한, 자동으로 생성한 시드 코퍼스를 실험한 결과는 FuzzBuilderEx에서 생성된 시드 코퍼스가 실용성을 만족시키면서 효율적인 퍼징에 도움이 될 수 있음을 보여준다. 따라서 FuzzBuilderEx는 다양한 유형의 라이브러리에 큰 노력 없이 퍼징을 적용하여 소프트웨어 보안을 강화하는 데 도움이 될 수 있다.
FuzzBuilderEx에서 생성된 퍼징 대상 파일은 AFL과 같은 다른 퍼저에서 사용할 수 있어 다양한 베이스 퍼저의 사용을 통한 확장이 가능하고, 퍼징을 위한 소스 코드의 작성 및 유지 관리를 제거하여 개발자에 의한 퍼징을 쉽게 한다. 또한, 이 방법을 사용하면 검증자가 프로젝트에 대한 고수준의 지식 없이 퍼징을 수행할 수 있으며, 개발자 또한 퍼징에 대한 고수준의 퍼징을 수행할 수 있다. 코드 커버리지 비교 결과 FuzzBuilderEx는 라이브러리에 대한 최소한의 이해로 라이브러리 퍼징을 위한 다양한 라이브러리 API 함수를 호출할 기회를 제공한다.
코드 커버리지 비교 결과 FuzzBuilderEx는 라이브러리에 대한 최소한의 이해로 라이브러리 퍼징을 위한 다양한 라이브러리 API 함수를 호출할 기회를 제공한다. 또한, 자동으로 생성한 시드 코퍼스를 실험한 결과는 FuzzBuilderEx에서 생성된 시드 코퍼스가 실용성을 만족시키면서 효율적인 퍼징에 도움이 될 수 있음을 보여준다. 따라서 FuzzBuilderEx는 다양한 유형의 라이브러리에 큰 노력 없이 퍼징을 적용하여 소프트웨어 보안을 강화하는 데 도움이 될 수 있다.
본 연구의 실험에서는 총 7개의 오픈 소스 프로젝트에 FuzzBuilderEx를 적용하여 퍼즈 드라이버의 효율성을 평가하였다. 본 연구를 통해 자동 생성한 시드 코퍼스는 기존 연구 대비 약 31.2% 수준의 커 버리지 향상이 있었다. 이는 기존 연구 대비 FA의 매개변수 확장을 통해 퍼징 가능 범위가 확장되었기 때문으로 예측한다.
마지막으로 위에서 적용했던 프로젝트 이외의 2개 프로젝트를 추가로 선정하여 취약점 분석을 진행하여, 3개의 취약점을 분석할 수 있었다. 이러한 실험 결과를 통해 우리는 FuzzBuilderEx가 사람의 개입을 최소화하여 라이브러리의 퍼징을 쉽게 해줄 수 있고, 또한 자동으로 생성한 퍼즈 드라이버를 통해 효율적인 퍼징이 가능함을 확인할 수 있었다. 그 뿐만 아니라 실제 취약점 분석에도 효과가 있음을 증명하였다.
또한, 이 방법을 사용하면 검증자가 프로젝트에 대한 고수준의 지식 없이 퍼징을 수행할 수 있으며, 개발자 또한 퍼징에 대한 고수준의 퍼징을 수행할 수 있다. 코드 커버리지 비교 결과 FuzzBuilderEx는 라이브러리에 대한 최소한의 이해로 라이브러리 퍼징을 위한 다양한 라이브러리 API 함수를 호출할 기회를 제공한다. 또한, 자동으로 생성한 시드 코퍼스를 실험한 결과는 FuzzBuilderEx에서 생성된 시드 코퍼스가 실용성을 만족시키면서 효율적인 퍼징에 도움이 될 수 있음을 보여준다.
먼저, 본 연구가 제안하는 퍼징 자동화를 통해 사람의 개입을 얼마나 감소시켰는지를 퍼징의 절차를 구분하여, 절차별로 자동화 가능 여부를 분석하였다. 특히, 본 연구는 사람의 개입을 가장 많이 필요로 하고, 시간이 많이 소요되는 FA 선정과 퍼즈 드라이버 생성 작업을 자동화해서 선행 연구 대비 큰 수준의 개선 효과를 달성할 수 있었다.
후속연구
다만, c-ares와 JSON-C의 경우에는 커버리지 상승 폭이 크지 않았는데, 이는 선정된 FA에 정수형 매개변수를 활용하는 시퀀스가 많이 포함되어 있지 않기 때문이다. 다만, 이러한 결과도 프로젝트가 개발됨에 따라 테스트 코드가 추가되어 정수형 매개변수를 활용하는 시퀀스가 추가된다면, 다른 프로젝트의 결과와 마찬가지로 커버리지의 향상을 기대할 수 있다. 마지막으로 BoringSSL의 경우에는 기존 연구에서는 OSSFuzz와 커버리지 차이가 큰 폭으로 낮은 문제가 있었으나, FA 매개변수 확장으로 인해 OSSFuzz와 커버리지 차이를 상당 수준 감소시킬 수 있었다.
하지만, 라이브러리 내에 존재하는 테스트 코드가 높은 수준의 테스트를 포함하지 않거나, 테스트 코드가 부족한 경우에는 본 연구를 통해 자동 생성된 시드 코퍼스는 퍼징의 효율성을 높이기는 어렵다는 한계가 있다. 따라서 이러한 문제를 해결하기 위해 향후 연구로 기존 연구에 딥러닝 모델을 적용하는 연구를 진행하고자 한다.
그러나 BoringSSL의 테스트 코드에는 이에 대한 함수 시퀀스가 일부만 구현되어 있으므 로 낮은 커버리지를 달성하였다. 따라서 프로젝트가 추가로 개발됨에 따라 테스트 코드가 추가되고, 위의 FA에 대한 시퀀스가 보강된다면, 본 연구를 통해 생성된 시드를 사용하여 더 높은 커버리지를 달성할 수 있을 것이라 예상한다.
많은 보안 커뮤니티에서 소프트웨어 취약성을 발견하기 위한 자동화된 접근 방식으로 퍼징에 관한 연구를 진행했음에도 불구하고, 퍼징에는 실행 환경, 특히 퍼징을 위한 퍼징 대상 파일이 필요하므로 많은 최신의 퍼징 방법이 라이브러리에는 제대로 적용되지 못했다. 이러한 문제를 해결하기 위해 테스트 프레임 워크를 기반으로 라이브러리용 퍼즈 드라이버를 자동으로 생성하는 시스템인 FuzzBuilderEx 시스템을 제안하였다.
FuzzBuilderEx는 C/C++로 개발된 라이브러리만을 대상으로 한다. 본 연구에서는 자동화를 위해서 테스트 프레임워크와 LLVM IR을 이용 하였기 때문에 다른 프로그램 언어로의 확장이 비교적 쉬울 수 있으나, 언어적인 특성을 고려하기 위해서 추가 연구를 수행해야 한다. 더욱이 FuzzBuilderEx의 현재 설계는 프로그램의 소스 코드를 사용할 수 있다는 가정하에 퍼즈 드라이버를 자동으로 생성하는 것으로 제한된다.
JSON-C의 테스트 코드를 분석해 보면, 테스트 코드 내에 ASSERT 구문을 사용하여 특정 조건이 만족하였는지 여부를 확인하는 코드가 반복적으로 사용 됨을 알 수 있다. 해당 부분도 프로젝트를 개발함에 따라 테스트 코드가 추가되거나 개선되면 퍼징의 효율성도 같이 증가할 것을 기대할 수 있다.
참고문헌 (34)
B.P. Miller, L. Fredriksen, and B. So, "An empirical study of the reliability of unix utilities," Communications of the ACM, vol. 33, no. 12, pp. 32-44, Dec. 1990.
V.J.M. Manes, H. Han, C. Han, S.K. Cha, M. Egele, E.J. Schwartz, and M. Woo, "The art, science, and engineering of fuzzing: A survey," IEEE Transactions on Software Engineering, Oct. 2019.
M. Bohme, V.-T. Pham, and A. Roychoudhury, "Coverage-based greybox fuzzing as markov chain," IEEE Transactions on Software Engineering, vol. 45, no. 5, pp. 489-506, Dec. 2017.
M. Bohme, V.-T. Pham, M.-D. Nguyen, and A. Roychoudhury, "Directed greybox fuzzing," Proceedings of the 2017 ACM SIGSAC Conference on Computer and Communications Security, pp. 2329-2344, Oct. 2017.
S. Gan, C. Zhang, X. Qin, X. Tu, K. Li, Z. Pei, and Z. Chen, "Collafl: Path sensitive fuzzing," 2018 IEEE Symposium on Security and Privacy (SP), pp. 679-696, IEEE, Jul. 2018.
N. Stephens, J. Grosen, C. Salls, A. Dutcher, R. Wang, J. Corbetta, Y. Shoshitaishvili, C. Kruegel, and G. Vigna, "Driller: Augmenting fuzzing through selective symbolic execution.," NDSS, vol. 16, pp. 1-16, Jan. 2016.
S. Rawat, V. Jain, A. Kumar, L. Cojocar, C. Giuffrida, and H. Bos, "Vuzzer: Application-aware evolutionary fuzzing.," NDSS, vol. 17, pp. 1-14, Feb. 2017.
H. Peng, Y. Shoshitaishvili, and M. Payer, "T-fuzz: fuzzing by program transformation," 2018 IEEE Symposium on Security and Privacy (SP), pp. 697-710, IEEE, Jul. 2018.
I. Yun, S. Lee, M. Xu, Y. Jang, and T. Kim, "{QSYM}: A practical concolic execution engine tailored for hybrid fuzzing," 27th {USENIX} Security Symposium ({USENIX} Security 18), pp. 745-761, Aug. 2018.
P. Chen and H. Chen, "Angora: Efficient fuzzing by principled search," 2018 IEEE Symposium on Security and Privacy (SP), pp. 711-725, IEEE, Jul. 2018.
D. Babic, S. Bucur, Y. Chen, F. Ivancic, T. King, M. Kusano, C. Lemieux, L. Szekeres, and W. Wang, "Fudge: fuzz driver generation at scale," Proceedings of the 2019 27th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering, pp. 975-985, Aug. 2019.
K. Ispoglou, D. Austin, V. Mohan, and M. Payer, "Fuzzgen: Automatic fuzzer generation," 29th {USENIX} Security Symposium ({USENIX} Security 20), pp. 2271-2287, Aug. 2020.
J. Jang and H.K. Kim, "Fuzzbuilder: automated building greybox fuzzing environment for c/c++ library," Proceedings of the 35th Annual Computer Security Applications Conference, pp. 627-637, Dec. 2019.
C. Lemieux and K. Sen, "Fairfuzz: A targeted mutation strategy for increasing greybox fuzz testing coverage," Proceedings of the 33rd ACM/IEEE International Conference on Automated Software Engineering, pp. 475-485, Sep. 2018.
Y. Li, B. Chen, M. Chandramohan, S.-W. Lin, Y. Liu, and A. Tiu, "Steelix: program-state based binary fuzzing," Proceedings of the 2017 11th Joint Meeting on Foundationsof Software Engineering, pp. 627-637, Aug. 2017.
J. Choi, J. Jang, C. Han, and S.K. Cha, "Grey-box concolic testing on binary code," 2019 IEEE/ACM 41st International Conference on Software Engineering (ICSE), pp. 736-747, IEEE, May 2019.
V. Jain, S. Rawat, C. Giuffrida, and H. Bos, "Tiff: using input type inference to improve fuzzing," Proceedings of the 34th Annual Computer Security Applications Conference, pp. 505-517, Dec. 2018.
N. Coppik, O. Schwahn, and N. Suri, "Memfuzz: Using memory accesses to guide fuzzing," 2019 12th IEEE Conference on Software Testing, Validation and Verification(ICST), pp. 48-58, IEEE, Apr. 2019.
H. Zhong, T. Xie, L. Zhang, J. Pei, and H. Mei, "MAPO: Mining and Recommending API Usage Patterns," European Conference on Object Oriented Programming, pp. 318-343, Jul. 2009.
M.A. Saied, O. Benomar, H. Abdeen, and H. Sahraoui, "Mining multi-level api usage patterns," 2015 IEEE 22nd international conference on software analysis, evolution, and reengineering (SANER), pp. 23-32, IEEE, Mar. 2015.
J. Fowkes and C. Sutton, "Parameterfree probabilistic api mining across github," Proceedings of the 2016 24th ACM SIGSOFT international symposium on foundations of software engineering, pp. 254-265, Nov. 2016.
J.E. Montandon, H. Borges, D. Felix, and M.T. Valente, "Documenting apis with examples: Lessons learned with the api miner platform," 2013 20th working conference on reverse engineering (WCRE), pp. 401-408, IEEE, Oct. 2013.
L. Moreno, G. Bavota, M. Di Penta, R. Oliveto, and A. Marcus, "How can i use this method?," 2015 IEEE/ACM 37th IEEE International Conference on Software Engineering, vol. 1, pp. 880-890, IEEE, May 2015.
N. Katirtzis, T. Diamantopoulos, and C.A. Sutton, "Summarizing software api usage examples using clustering techniques.," FASE, pp. 189-206, Apr. 2018.
C. Pacheco, S. K. Lahiri, M. D. Ernst, and T. Ball, "Feedback-directed random test generation," 29th International Conference on Software Engineering (ICSE'07), pp. 75-84, IEEE, May 2007.
W. Zheng, Q. Zhang, M. Lyu, and T. Xie, "Random unit-test generation with mut-aware sequence recommendation," Proceedings of the IEEE/ACM international conference on Automated software engineering, pp. 293-296, Sep. 2010.
S. Zhang, D. Saff, Y. Bu, and M.D. Ernst, "Combined static and dynamic automated test generation," Proceedings of the 2011 International Symposium on Software Testing and Analysis, pp. 353-363, Jul. 2011.
M. Pradel and T.R. Gross, "Leveraging test generation and specification mining for automated bug detection without false positives," 2012 34th International Conference on Software Engineering (ICSE), pp. 288-298, IEEE, Jun. 2012.
J. Wang, B. Chen, L. Wei, and Y. Liu, "Skyfire: Data-driven seed generation for fuzzing," 2017 IEEE Symposium on Security and Privacy (SP), pp. 579-594, IEEE, May 2017.
C. Lyu, S. Ji, Y. Li, J. Zhou, J. Chen, and J. Chen, "Smartseed:Smartseed generation for efficient fuzzing," arXiv preprint arXiv:1807.02606, Jul. 2018.
I.J. Goodfellow, J. PougetAbadie, M. Mirza, B. Xu, D. Warde-Farley, S. Ozair, A. Courville, and Y. Bengio, "Generative adversarial networks," arXiv preprint arXiv:1406.2661, Jun. 2014.
K. Sen, "Concolic testing," in Proceedings of the Twenty-Second IEEE/ACM International Conference on Automated Software Engineering, ASE '07, pp. 571-572, Nov. 2007
※ AI-Helper는 부적절한 답변을 할 수 있습니다.