[국내논문]동적 기호 실행을 이용한 윈도우 시스템 콜 Use-After-Free 취약점 자동 탐지 방법 Automated Method for Detecting Use-After-Free Vulnerability of Windows System Calls Using Dynamic Symbolic Execution원문보기
최근 소프트웨어 산업의 발달에 따른 사회적 보안 문제가 지속적으로 발생하고 있으며, 소프트웨어 안정성 검증을 위해 다양한 자동화 기법들이 사용되고 있다. 본 논문에서는 소프트웨어 테스팅 기법 중 하나인 동적 기호 실행을 이용해 윈도우 시스템 콜 함수를 대상으로 Use-After-Free 취약점을 자동으로 탐지하는 방법을 제안한다. 먼저, 목표 지점을 선정하기 위한 정적 분석 기반 패턴 탐색을 수행한다. 탐지된 패턴 지점을 바탕으로 관심 밖의 영역으로의 분기를 차단하는 유도된 경로 탐색 기법을 적용한다. 이를 통해 기존 동적 기호 실행 기술의 한계점을 극복하고, 실제 목표 지점에서의 취약점 발생 여부를 검증한다. 제안한 방법을 실험한 결과 기존에 수동으로 분석해야 했던 Use-After-Free 취약점을 제안한 자동화 기법으로 탐지할 수 있음을 확인하였다.
최근 소프트웨어 산업의 발달에 따른 사회적 보안 문제가 지속적으로 발생하고 있으며, 소프트웨어 안정성 검증을 위해 다양한 자동화 기법들이 사용되고 있다. 본 논문에서는 소프트웨어 테스팅 기법 중 하나인 동적 기호 실행을 이용해 윈도우 시스템 콜 함수를 대상으로 Use-After-Free 취약점을 자동으로 탐지하는 방법을 제안한다. 먼저, 목표 지점을 선정하기 위한 정적 분석 기반 패턴 탐색을 수행한다. 탐지된 패턴 지점을 바탕으로 관심 밖의 영역으로의 분기를 차단하는 유도된 경로 탐색 기법을 적용한다. 이를 통해 기존 동적 기호 실행 기술의 한계점을 극복하고, 실제 목표 지점에서의 취약점 발생 여부를 검증한다. 제안한 방법을 실험한 결과 기존에 수동으로 분석해야 했던 Use-After-Free 취약점을 제안한 자동화 기법으로 탐지할 수 있음을 확인하였다.
Recently, social security problems have been caused by the development of the software industry, and a variety of automation techniques have been used to verify software stability. In this paper, we propose a method of automatically detecting a use-after-free vulnerability on Windows system calls us...
Recently, social security problems have been caused by the development of the software industry, and a variety of automation techniques have been used to verify software stability. In this paper, we propose a method of automatically detecting a use-after-free vulnerability on Windows system calls using dynamic symbolic execution, one of the software testing methods. First, a static analysis based pattern search is performed to select a target point. Based on the detected pattern points, we apply an induced path search technique that blocks branching to areas outside of interest. Through this, we overcome limitations of existing dynamic symbolic performance technology and verify whether vulnerability exists at actual target point. As a result of applying the proposed method to the Windows system call, it is confirmed that the use-after-free vulnerability, which had previously to be manually analyzed, can be detected by the proposed automation technique.
Recently, social security problems have been caused by the development of the software industry, and a variety of automation techniques have been used to verify software stability. In this paper, we propose a method of automatically detecting a use-after-free vulnerability on Windows system calls using dynamic symbolic execution, one of the software testing methods. First, a static analysis based pattern search is performed to select a target point. Based on the detected pattern points, we apply an induced path search technique that blocks branching to areas outside of interest. Through this, we overcome limitations of existing dynamic symbolic performance technology and verify whether vulnerability exists at actual target point. As a result of applying the proposed method to the Windows system call, it is confirmed that the use-after-free vulnerability, which had previously to be manually analyzed, can be detected by the proposed automation technique.
* AI 자동 식별 결과로 적합하지 않은 문장이 있을 수 있으니, 이용에 유의하시기 바랍니다.
문제 정의
본 논문에서는 DSE 기술의 장점을 이용한 새로운 윈도우 시스템 콜 UAF 취약점(이하, UAF) 자동 탐지 방법을 제안한다. 먼저 목표 지점을 선정하기 위해 정적 분석 기반 패턴 탐색을 수행한다.
Step1에서는 DSE 수행하기 앞서 목표 지점을 선정하는 작업을 수행한다. 본 논문에서는 유저모드콜백에 의해 발생하는 윈도우 커널 UAF 취약점을 탐지하기 위한 패턴을 정의한다. 정의된 패턴을 바탕으로 정적 분석을 통해 크래시가 발생할 가능성이 있는 후보 지점을 추출한다.
본 논문에서 제안한 DSE 기반 윈도우 시스템 콜UAF 취약점 자동 탐지 방법의 우수성을 입증하기 위한 실험 및 평가를 수행한다. 평가의 용이성을 위해 2011년부터 2015까지 발생한 UAF 취약점 중 분석이 완료된 취약점을 대상으로 실험을 수행한다.
본 논문에서 윈도우 시스템 콜의 유저모드 콜백에 의한 UAF 취약점을 자동으로 탐지하는 방법을 제안하였다. 취약점 탐지의 자동화를 위해 정적 분석기반 UAF 취약점 탐지 모델을 개발하였으며, 이를 활용해 잠재적 크래시 유발 지점을 추출하였다.
가설 설정
유저모드 콜백 발생을 탐지하기 위해 KeUserModeCallback 함수의 크로스 레퍼런스(Xref to KeUserModeCallback)를 추출한다. 만약 추출된 함수가 추적 중인 객체를 파라미터로 사용한다면, 유저모드 콜백이 발생했다고 가정한다.
가지치기 대상 코드블록을 식별하기 위해 먼저, 단일함수 내에 존재하는 모든 코드블록을 추출한다. Fig. 2에서 총 11개의 코드블록이 존재하고, 마킹된 블록(CBt)이 목표 지점이라 가정한다.
제안 방법
먼저 목표 지점을 선정하기 위해 정적 분석 기반 패턴 탐색을 수행한다. 이후 추출된 후보 지점을 바탕으로 관심 밖의 영역으로의 분기를 차단하는 유도된 경로 탐색 기법을 통해 기존 DSE 기술의 한계점을 극복하고, 해당 취약점을 탐지한다.
먼저, 선택된 객체에 대한 유저모드 콜백 발생 여부를 확인한다. 그리고 유저모드 콜백 발생 이전까지의 코드에서 해당 객체에 대한 락킹 수행 여부를 확인한다. 해당 객체에 대한 락킹이 수행되지 않았다면, 이후 재참조 패턴을 탐색하여 UAF 취약점이 발생할 가능성을 확인한다.
목표 지점 후보를 추출하기 위한 과정은 Table 1에 제시한 알고리즘을 따른다. 먼저, 추적할 객체가 저장되어 있는 변수(레지스터 혹은 스택)를 선정하고, 추적한다. 해당 변수가 ‘mov’ 혹은 ‘lea’ 명령어에 의해 이동, 복사될 경우 또한 계속해서 추적을 유지한다.
유저모드 콜백 발생을 탐지하기 위해 KeUserModeCallback 함수의 크로스 레퍼런스(Xref to KeUserModeCallback)를 추출한다. 만약 추출된 함수가 추적 중인 객체를 파라미터로 사용한다면, 유저모드 콜백이 발생했다고 가정한다.
따라서 유저모드 콜백 발생 이전의 코드에서 해당 객체에 대한 락킹 수행 여부의 확인이 필요하다. 이를 위해 추적중인 객체의 특정 오프셋에 대한 접근 여부를 모니터링한다. 이 값은 락킹 카운트를 의미하며, 이 값을 증가시키는 코드가 존재하지 않다면 락킹이 정상적으로 이루어지지 않았다고 판단한다.
먼저 Step1에서 제안한 알고리즘을 이용해 취약점 패턴을 탐지한 결과, 5개의 기존UAF 취약점 발생 위치를 정확하게 탐지했다. 이후 Nt 함수에서 선정된 목표 지점까지 도달하는 경로인 각각 2개(depth 6), 2개(depth 6), 16개(depth 6), 22개((depth 7), 7개(depth 6)의 호출 체인을 추출했다. 이를 바탕으로 S2E에서 제공하는 Annotation 플러그인을 이용해 Step2의 유도된 경로 탐색을 적용하고, DSE를 수행했다.
이후 Nt 함수에서 선정된 목표 지점까지 도달하는 경로인 각각 2개(depth 6), 2개(depth 6), 16개(depth 6), 22개((depth 7), 7개(depth 6)의 호출 체인을 추출했다. 이를 바탕으로 S2E에서 제공하는 Annotation 플러그인을 이용해 Step2의 유도된 경로 탐색을 적용하고, DSE를 수행했다.
본 논문에서 윈도우 시스템 콜의 유저모드 콜백에 의한 UAF 취약점을 자동으로 탐지하는 방법을 제안하였다. 취약점 탐지의 자동화를 위해 정적 분석기반 UAF 취약점 탐지 모델을 개발하였으며, 이를 활용해 잠재적 크래시 유발 지점을 추출하였다. 추출된 지점을 바탕으로 관심 밖의 영역으로의 분기를 차단하는 유도된 경로 탐색 기법을 적용하였으며, DSE 기술의 경로 폭발 문제를 완화시켰다.
취약점 탐지의 자동화를 위해 정적 분석기반 UAF 취약점 탐지 모델을 개발하였으며, 이를 활용해 잠재적 크래시 유발 지점을 추출하였다. 추출된 지점을 바탕으로 관심 밖의 영역으로의 분기를 차단하는 유도된 경로 탐색 기법을 적용하였으며, DSE 기술의 경로 폭발 문제를 완화시켰다. 또한 RtlFreeHeap 후킹 드라이버를 설치하여 목표 지점에서의 취약점 발생 여부를 식별할 수 있도록 하였다.
추출된 지점을 바탕으로 관심 밖의 영역으로의 분기를 차단하는 유도된 경로 탐색 기법을 적용하였으며, DSE 기술의 경로 폭발 문제를 완화시켰다. 또한 RtlFreeHeap 후킹 드라이버를 설치하여 목표 지점에서의 취약점 발생 여부를 식별할 수 있도록 하였다. 결론적으로, DSE 기술을 활용해 윈도우 시스템콜 안정성 검증의 자동화가 가능함을 증명할 수 있었다.
대상 데이터
본 논문에서 제안한 기법의 우수성을 검증하기 위해 윈도우 커널에서 발생하는 기존 취약점을 대상으로 실험을 수행하였다. 그 결과 제안한 기법을 활용하여 기존에 수동으로 수행했던 윈도우 시스템 콜UAF 취약점 색출의 자동화가 가능함을 입증하였다.
가지치기 대상 코드블록을 식별하기 위해 실제로 관심 있는 코드블록을 추출한다. 목표 블록인 CBt의 상호참조 블록은 CB8이며, CB8의 상호참조 블록은 CB2와 CB5이다.
가지치기 대상 코드블록을 식별하기 위해 실제로 관심 있는 코드블록을 추출한다. 목표 블록인 CBt의 상호참조 블록은 CB8이며, CB8의 상호참조 블록은 CB2와 CB5이다. 이와 같은 과정으로 실제 타깃 코드블록과 관련 있는 모든 블록 리스트를 식별한다.
본 논문에서 제안한 DSE 기반 윈도우 시스템 콜UAF 취약점 자동 탐지 방법의 우수성을 입증하기 위한 실험 및 평가를 수행한다. 평가의 용이성을 위해 2011년부터 2015까지 발생한 UAF 취약점 중 분석이 완료된 취약점을 대상으로 실험을 수행한다. 제안한 방법을 이용해 추출된 결과와 기존에 알려진 분석 결과 및 PoC 코드와의 비교를 통해 우수성을 검증한다.
제안한 방법을 이용해 추출된 결과와 기존에 알려진 분석 결과 및 PoC 코드와의 비교를 통해 우수성을 검증한다. 실험에 사용된 호스트 시스템은 Intel Core i7-3770 CPU 3.0GHz와 8GB RAM 사양의 Ubuntu 12.04 운영체제이며, 게스트 시스템은 S2E DSE 도구에 가장 최적화되어 있는 Windows XP SP3 운영체제 환경을 대상으로 실험을 수행했다.
데이터처리
평가의 용이성을 위해 2011년부터 2015까지 발생한 UAF 취약점 중 분석이 완료된 취약점을 대상으로 실험을 수행한다. 제안한 방법을 이용해 추출된 결과와 기존에 알려진 분석 결과 및 PoC 코드와의 비교를 통해 우수성을 검증한다. 실험에 사용된 호스트 시스템은 Intel Core i7-3770 CPU 3.
성능/효과
본 논문에서 제안한 기법의 우수성을 검증하기 위해 윈도우 커널에서 발생하는 기존 취약점을 대상으로 실험을 수행하였다. 그 결과 제안한 기법을 활용하여 기존에 수동으로 수행했던 윈도우 시스템 콜UAF 취약점 색출의 자동화가 가능함을 입증하였다.
Table 2는 제안한 방법을 이용해 취약점 탐지를 수행한 결과다. 먼저 Step1에서 제안한 알고리즘을 이용해 취약점 패턴을 탐지한 결과, 5개의 기존UAF 취약점 발생 위치를 정확하게 탐지했다. 이후 Nt 함수에서 선정된 목표 지점까지 도달하는 경로인 각각 2개(depth 6), 2개(depth 6), 16개(depth 6), 22개((depth 7), 7개(depth 6)의 호출 체인을 추출했다.
제안한 알고리즘에 의해 탐지된 5개의 목표 지점을 대상으로 DSE 기술을 적용한 결과, 수분 내에 모두 BSOD가 발생하는 것을 확인할 수 있었다. 실험 결과 로그를 통해 BSOD를 발생시키는 테스트케이스 즉, 호출 체인의 최상단에 위치한 Nt 함수의 파라미터를 얻을 수 있었으며, 이는 실제 공개된 PoC 코드에서 사용하는 값과 일치함을 확인했다.
제안한 알고리즘에 의해 탐지된 5개의 목표 지점을 대상으로 DSE 기술을 적용한 결과, 수분 내에 모두 BSOD가 발생하는 것을 확인할 수 있었다. 실험 결과 로그를 통해 BSOD를 발생시키는 테스트케이스 즉, 호출 체인의 최상단에 위치한 Nt 함수의 파라미터를 얻을 수 있었으며, 이는 실제 공개된 PoC 코드에서 사용하는 값과 일치함을 확인했다. 또한 추출된 로그의 파싱을 통해 BSOD가 발생하는 호출 체인도 얻을 수 있었다.
실험 결과 로그를 통해 BSOD를 발생시키는 테스트케이스 즉, 호출 체인의 최상단에 위치한 Nt 함수의 파라미터를 얻을 수 있었으며, 이는 실제 공개된 PoC 코드에서 사용하는 값과 일치함을 확인했다. 또한 추출된 로그의 파싱을 통해 BSOD가 발생하는 호출 체인도 얻을 수 있었다.
또한 RtlFreeHeap 후킹 드라이버를 설치하여 목표 지점에서의 취약점 발생 여부를 식별할 수 있도록 하였다. 결론적으로, DSE 기술을 활용해 윈도우 시스템콜 안정성 검증의 자동화가 가능함을 증명할 수 있었다. 제안한 방법은 운영체제 커널 안정성 검증의 자동화에 활용될 수 있을 것으로 기대한다.
후속연구
정의된 패턴을 바탕으로 정적 분석을 통해 크래시가 발생할 가능성이 있는 후보 지점을 추출한다. 추출된 주소는 목표 지점 후보로 등록되며, 추후 동적 실행을 통해 해당 지점에서 크래시가 실제로 발생하는지 여부를 검증하기 위해 사용된다.
결론적으로, DSE 기술을 활용해 윈도우 시스템콜 안정성 검증의 자동화가 가능함을 증명할 수 있었다. 제안한 방법은 운영체제 커널 안정성 검증의 자동화에 활용될 수 있을 것으로 기대한다. 향후 추가적인 버그 체크 모델을 개발할 것이며, 추가적인 실험을 통해 신규 커널 취약점을 탐지하기 위한 지속적인 연구를 수행할 계획이다.
제안한 방법은 운영체제 커널 안정성 검증의 자동화에 활용될 수 있을 것으로 기대한다. 향후 추가적인 버그 체크 모델을 개발할 것이며, 추가적인 실험을 통해 신규 커널 취약점을 탐지하기 위한 지속적인 연구를 수행할 계획이다.
질의응답
핵심어
질문
논문에서 추출한 답변
동적 기호 실행이란?
동적 기호 실행(Dynamic symbolic execution, 이하 DSE)은 소프트웨어의 입력 데이터를 심볼릭 변수로 정의함으로써 실행 가능한 모든 경로를 빠르게 탐색하는 분석 방법이다[6]. 높은 코드 커버리지와 높은 정확성을 모두 가지는 DSE는 소프트웨어 취약점 탐지에 활용될 수 있으며, 지난 몇 년 동안 EXE[7], KLEE[8], FuzzBALL[9], SAGE[10], S2E[11]와 같은 자동화 도구들이 연구되었다.
동적 기호 실행의 특징은?
동적 기호 실행(Dynamic symbolic execution, 이하 DSE)은 소프트웨어의 입력 데이터를 심볼릭 변수로 정의함으로써 실행 가능한 모든 경로를 빠르게 탐색하는 분석 방법이다[6]. 높은 코드 커버리지와 높은 정확성을 모두 가지는 DSE는 소프트웨어 취약점 탐지에 활용될 수 있으며, 지난 몇 년 동안 EXE[7], KLEE[8], FuzzBALL[9], SAGE[10], S2E[11]와 같은 자동화 도구들이 연구되었다. 하지만 기존의 DSE 기술은 상용 소프트웨어에 대한 적용을 방해하는 경로 폭발 문제(path explosion)에 직면해있다.
소프트웨어 취약점을 탐지 시 가진 단점을 극복하기 위한 방법은 어떻게 나뉘는가?
하지만 소프트웨어 취약점을 탐지하기 위해서는 전문 지식이 요구될 뿐만 아니라 많은 시간과 비용이 소모된다. 이를 극복하기 위해 많은 자동 테스팅 기법에 대한 연구가 진행되고 있으며, 이러한 연구들은 정적 탐지 방법과 동적 탐지 방법으로 나눌 수 있다. GUEB[3]와 같은 정적 탐지 도구는 높은 코드 커버리지를 가지지만 정확성은 떨어진다.
참고문헌 (25)
SPri, "Software Industry Annual Report", http://spri.kr/post/11313, 2015.
Cadar C, Ganesh V, Pawlowski P M, et al. "EXE:Automatically generating inputs of death", Computer Andcommunications Security, 2006, 12(2):3296-3306.
Cadar C, Dunbar D, Engler D R. "KLEE: Unassisted and automatic generation of high-coverage tests for complex systems programs", USENIX, 2008.
D Babic, L Martignoni, S McCamant, and D Song, "Statically-Directed Dynamic Automated Test Generation", In Proceedings of the ACM/SIGSOFT (ISSTA), July. 2011.
E. Bounimova, P. Godefroid, and D. Molnar, "Billions and Billions of Constraints: Whitebox Fuzz Testing in Production", IEEE, 2013.
Vitaly Chipounov, Volodymyr Kuznetsov, George Candea. "S2E: A Platform for In Vivo Multi-Path Analysis of Software Systems", 16th Intl. ASPLOS, Newport Beach, CA, March. 2011.
Google Groups, "S2E Developer Forum", https://groups.google.com/d/forum/s2e-dev
VT Pham, WB Ng, K Rubinov et al, "Hercules : Reproducing Crashes in Real-World Application Binaries", ACM, 2015.
C Yeh, H Lu, C Chen et al, "CRAXDroid: Automatic android system testing by selective symbolic execution", 8th International Conference on Software Security and Reliability, 2014.
N Stephens, J Grosen, C Salls et al, "Driller : Augmenting Fuzzing Through Selective Symbolic Execution", Internetsociety, 2016.
B Zhang, C Feng, B Wu et al, "Detecting integer overflow in Windows binary executables based on symbolic execution", IEEE/ACIS. 2016.
Yu Wang, "A New CVE-2015-0057 Exploit Technology", BlackHat, Sep. 2015.
Aaron Adams, "Exploiting the win32k!xxxEnableWndSBArrows use-after-free (CVE-2015-0057) bug on both 32-bit and 64-bit", An NCC Group Publication, 2015.
Dominic Wang, "Exploiting MS15-061 Microsoft Windows Kernel Use-After-Free(win32!xxxSetClassLong), nccgroup, 2015.
※ AI-Helper는 부적절한 답변을 할 수 있습니다.