KR20190078545A - 프로그램 동적 분석 장치 및 그 방법 - Google Patents

프로그램 동적 분석 장치 및 그 방법 Download PDF

Info

Publication number
KR20190078545A
KR20190078545A KR1020180169833A KR20180169833A KR20190078545A KR 20190078545 A KR20190078545 A KR 20190078545A KR 1020180169833 A KR1020180169833 A KR 1020180169833A KR 20180169833 A KR20180169833 A KR 20180169833A KR 20190078545 A KR20190078545 A KR 20190078545A
Authority
KR
South Korea
Prior art keywords
analysis
program
function
dynamic
point
Prior art date
Application number
KR1020180169833A
Other languages
English (en)
Other versions
KR102195906B1 (ko
Inventor
조은선
목성균
전현구
Original Assignee
충남대학교산학협력단
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 충남대학교산학협력단 filed Critical 충남대학교산학협력단
Publication of KR20190078545A publication Critical patent/KR20190078545A/ko
Application granted granted Critical
Publication of KR102195906B1 publication Critical patent/KR102195906B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs

Abstract

프로그램 동적 분석 장치 및 방법이 개시된다.
본 발명의 일 실시예에 따른 프로그램 동적 분석 장치는, 바이너리 프로그램을 동적 분석하여 콜 트레이스(call trace)를 획득하는 동적 분석부, 상기 콜 트레이스를 기반으로 상기 바이너리 프로그램의 테인트(taint)에 대한 정적 분석을 수행하여 의존 그래프를 생성하는 정적 분석부, 상기 의존 그래프를 기반으로 상기 바이너리 프로그램을 동적 역방향 분석을 수행하여, 상기 바이너리 프로그램의 입력과 관련 여부에 대한 결과를 출력하는 동적 역방향 분석부를 포함한다.

Description

프로그램 동적 분석 장치 및 그 방법{Apparatus and Method for program analysis dynamically}
본 발명은 프로그램 동적 분석 장치 및 그 방법에 관한 것으로, 특히 정적 분석을 통한 프로그램 슬라이싱 후 동적 역방향 분석을 수행하는 프로그램 동적 분석 방법 및 그 장치에 관한 것이다.
바이너리 프로그램 분석은 소스 코드에 의존하지 않고 프로그램의 구조와 실행 흐름 등을 파악하는데 매우 중요하다. 하지만 다른 모든 분석들과 마찬가지로, 정확한 프로그램 분석에는 프로그램의 크기에 비례하여 많은 시간이 걸리게 되고, 시간이 적게 소요되는 간단한 분석 방법으로는 그 적용 범위가 매우 작거나 잘못된 분석 결과를 도출할 확률이 높아진다. 따라서 바이너리 프로그램을 효율적으로 분석하려는 연구가 필요하다.
프로그램의 동적 분석은 프로그램의 취약점 분석과 악성코드 분석 등 보안 분야에서 널리 활용된다. 그중에서 동적 역방향 분석은 프로그램의 특정 지점이 프로그램의 입력과 관계가 있는지 파악하기 위해 사용한다.
종래의 동적 역방향 분석에 관해서 ARM-Analyzer와 VDT(Visual Data Tracer)가 있다. 그러나, 이러한 방법은 프로그램을 실행시켜야 하기 때문에 분석에 시간이 오래 걸리고, 분석이 오래 걸리면 취약점의 패치나 악성코드에 대한 대처가 제때 되지 않을 수 있다.
또한, 바이너리 프로그램을 동적으로 역방향 분석을 할 때, 명령어 트레이스를 추출하여 분석을 한다. 이 때, 트레이스의 크기가 크면 클수록 분석에 필요한 시간 역시 많이 필요하다. 실제 상용프로그램은 프로그램의 코드의 양이 많기 때문에 트레이스의 크기 또한 커지고 분석에 필요한 시간도 오래 걸리게 된다. 프로그램 분석이 오래 걸린다면, 악성코드에 대한 대처가 늦거나 프로그램의 취약점 패치가 느려지는 단점이 있다.
이에, 프로그램 실행 명령 트레이스의 크기를 줄이는 방법으로 동적 분석을 수행할 수 있는 기술 개발이 요구되고 있다.
한국 등록특허공보 제10-1482073호(2006.04.24.)
본 발명이 해결하고자 하는 과제는 프로그램 실행 명령 트레이스의 크기를 줄이는 방법으로 동적 분석을 수행할 수 있는 프로그램 동적 분석 장치 및 그 방법을 제공하는 것이다.
본 발명이 해결하고자 하는 과제는 이상에서 언급한 과제(들)로 제한되지 않으며, 언급되지 않은 또 다른 과제(들)은 아래의 기재로부터 당업자에게 명확하게 이해될 수 있을 것이다.
상기한 과제를 해결하기 위하여, 본 발명의 일 실시예에 따른 프로그램 동적 분석 장치는, 바이너리 프로그램을 동적 분석하여 콜 트레이스(call trace)를 획득하는 동적 분석부, 상기 콜 트레이스를 기반으로 상기 바이너리 프로그램의 테인트(taint)에 대한 정적 분석을 수행하여 의존 그래프를 생성하는 정적 분석부, 상기 의존 그래프를 기반으로 상기 바이너리 프로그램을 동적 역방향 분석을 수행하여, 상기 바이너리 프로그램의 입력과 관련 여부에 대한 결과를 출력하는 동적 역방향 분석부를 포함한다.
바람직하게는, 상기 정적 분석부는, 상기 바이너리 프로그램의 실행을 통한 테인트 분석을 수행하여, 상기 바이너리 프로그램에 대하여 크래시(crash)를 발생시킨 명령어들 각각에 의해 영향을 받는 모든 명령어를 정적 분석하여 해당 크래시의 위험도를 분석할 수 있다.
바람직하게는, 상기 정적 분석부는, 상기 다수의 크래시들을 발생시킨 명령어들 각각에 대하여 상기 명령어들의 도달지점들을 식별하고, 상기 도달지점들 중 해당 명령어가 실제로 사용되는 지점을 찾아낸 후, 그 결과를 의존 그래프로 생성하며, 상기 의존 그래프로부터 프로그램의 제어권을 옮길 수 있는 명령어를 식별한 후, 상기 크래시를 발생시킨 명령어의 공격 가능성을 분석할 수 있다.
바람직하게는, 상기 정적 분석부는, 오염된 데이터가 쓰인 지점의 주소를 입력하고 그 지점이 있는 함수부터 함수 내 분석(Intraprocedural analysis)을 수행하는 함수내 분석모듈, 현재 분석 지점의 함수 내부에 시스템콜이 있는지에 대해 확인하여, 프로그램의 입력과 관련이 있는지 확인하는 함수 단위 분석(Interprocedural analysis)을 수행하는 함수 단위 분석모듈을 포함할 수 있다.
바람직하게는, 상기 함수내 분석모듈은, 크래시가 일어난 지점의 명령어를 오염된 명령어의 집합에 넣은 후 분석을 시작하고, 상기 명령어에 영향을 준(use) 명령어를 찾는 과정을 반복하는 역테인트 분석을 수행할 수 있다.
바람직하게는, 상기 함수간 분석모듈은, 현재 분석 지점의 함수 내부에 시스템콜이 있는지에 대해 확인하여, 프로그램의 입력과 관련이 있는지 확인하고, 상기 확인결과 관련이 있는 경우 상기 콜 트레이스를 바탕으로 해당 함수를 호출한 함수(caller function)을 모두 찾고, 상기 Caller 함수에서 callee함수의 호출 지점을 찾은 후, callee 함수의 입력을 넣어주는 지점을 모두 찾아 그 지점에 대해 역테인트 분석을 수행할 수 있다.
바람직하게는, 상기 동적 역방향 분석부는, 레지스터 값 및 메모리 정보에 기초하여, 상기 의존 그래프를 가지치기하고, 상기 가지치기된 의존 그래프를 동적 역방향 분석을 수행할 수 있다.
상기한 과제를 해결하기 위하여, 본 발명의 일 실시예에 따른 프로그램 동적 분석 방법은, 바이너리 프로그램을 동적 분석하여 콜 트레이스(call trace)를 획득하는 단계, 상기 콜 트레이스를 기반으로 상기 바이너리 프로그램의 테인트(taint)에 대한 정적 분석을 수행하여 의존 그래프를 생성하는 단계, 상기 의존 그래프를 기반으로 상기 바이너리 프로그램을 동적 역방향 분석을 수행하여, 상기 바이너리 프로그램의 입력과 관련 여부에 대한 결과를 출력하는 단계를 포함한다.
바람직하게는, 상기 의존 그래프를 생성하는 단계는, 오염된 데이터가 쓰인 지점의 주소를 입력하고 그 지점이 있는 함수부터 함수 내 분석(Intraprocedural analysis)을 수행하는 단계, 현재 분석 지점의 함수 내부에 시스템콜이 있는지에 대해 확인하여, 프로그램의 입력과 관련이 있는지 확인하는 함수 단위 분석(Interprocedural analysis)을 수행하는 단계를 포함할 수 있다.
본 발명에 따르면, 프로그램 실행 명령 트레이스의 크기를 줄이는 방법으로 동적 분석을 수행함으로써, 동적 분석의 속도를 개선할 수 있다.
또한, 프로그램을 동적 분석하기 전에 정적 분석을 통하여 분석할 명령어를 추출하기 때문에 동적 분석할 명령어가 줄어들게 되어 보다 빠르게 동적 분석을 수행할 수 있다. 이처럼, 동적 분석 시간을 줄여줌으로써, 보다 빠르게 취약점이나 악성코드에 대처할 수 있다.
본 발명의 효과들은 이상에서 언급한 효과들로 제한되지 않으며, 언급되지 않은 또 다른 효과들은 아래의 기재로부터 통상의 기술자에게 명확하게 이해될 수 있을 것이다.
도 1은 본 발명의 일 실시예에 따른 프로그램 동적 분석 장치를 설명하기 위한 도면이다.
도 2는 도 1에 도시된 동적 역방향 분석부를 세분화한 블록도이다.
도 3은 본 발명의 일 실시예에 따른 Reaching-Definition 분석을 설명하기 위한 예시도이다.
도 4는 본 발명의 일 실시예에 따른 함수 내 분석(Intraprocedural analysis)을 설명하기 위한 알고리즘이다.
도 5는 본 발명의 일 실시예에 따른 함수 단위 분석을 설명하기 위한 예시도이다.
도 6은 본 발명의 일 실시예에 따른 함수 단위 분석(Interprocedural analysis)을 설명하기 위한 예시도이다.
도 7은 본 발명의 일 실시예에 따른 정적 분석과 동적 분석에 이용되는 의존 그래프를 설명하기 위한 예시도이다.
도 8 및 도 9는 본 발명의 일 실시예에 따른 프로그램 동적 분석 방법을 설명하기 위한 순서도이다.
본 발명은 다양한 변경을 가할 수 있고 여러 가지 실시예를 가질 수 있는 바, 특정 실시예들을 도면에 예시하고 상세하게 설명하고자 한다. 그러나 이는 본 발명을 특정한 실시 형태에 한정하려는 것이 아니며, 본 발명의 사상 및 기술 범위에 포함되는 모든 변경, 균등물 내지 대체물을 포함하는 것으로 이해되어야 한다. 각 도면을 설명하면서 유사한 참조부호를 유사한 구성요소에 대해 사용하였다.
제1, 제2, A, B 등의 용어는 다양한 구성요소들을 설명하는데 사용될 수 있지만, 상기 구성요소들은 상기 용어들에 의해 한정되어서는 안 된다. 상기 용어들은 하나의 구성요소를 다른 구성요소로부터 구별하는 목적으로만 사용된다. 예를 들어, 본 발명의 권리 범위를 벗어나지 않으면서 제1 구성요소는 제2 구성요소로 명명될 수 있고, 유사하게 제2 구성요소도 제1 구성요소로 명명될 수 있다. 및/또는 이라는 용어는 복수의 관련된 기재된 항목들의 조합 또는 복수의 관련된 기재된 항목들 중의 어느 항목을 포함한다.
어떤 구성요소가 다른 구성요소에 "연결되어" 있다거나 "접속되어" 있다고 언급된 때에는, 그 다른 구성요소에 직접적으로 연결되어 있거나 또는 접속되어 있을 수도 있지만, 중간에 다른 구성요소가 존재할 수도 있다고 이해되어야 할 것이다. 반면에, 어떤 구성요소가 다른 구성요소에 "직접 연결되어" 있다거나 "직접 접속되어" 있다고 언급된 때에는, 중간에 다른 구성요소가 존재하지 않는 것으로 이해되어야 할 것이다.
본 출원에서 사용한 용어는 단지 특정한 실시예를 설명하기 위해 사용된 것으로, 본 발명을 한정하려는 의도가 아니다. 단수의 표현은 문맥상 명백하게 다르게 뜻하지 않는 한, 복수의 표현을 포함한다. 본 출원에서, "포함하다" 또는 "가지다" 등의 용어는 명세서상에 기재된 특징, 숫자, 단계, 동작, 구성요소, 부품 또는 이들을 조합한 것이 존재함을 지정하려는 것이지, 하나 또는 그 이상의 다른 특징들이나 숫자, 단계, 동작, 구성요소, 부품 또는 이들을 조합한 것들의 존재 또는 부가 가능성을 미리 배제하지 않는 것으로 이해되어야 한다.
다르게 정의되지 않는 한, 기술적이거나 과학적인 용어를 포함해서 여기서 사용되는 모든 용어들은 본 발명이 속하는 기술분야에서 통상의 지식을 가진 자에 의해 일반적으로 이해되는 것과 동일한 의미를 가지고 있다. 일반적으로 사용되는 사전에 정의되어 있는 것과 같은 용어들은 관련 기술의 문맥상 가지는 의미와 일치하는 의미를 가지는 것으로 해석되어야 하며, 본 출원에서 명백하게 정의하지 않는 한, 이상적이거나 과도하게 형식적인 의미로 해석되지 않는다.
이하에서는 본 발명에 따른 바람직한 실시예를 첨부된 도면을 참조하여 상세하게 설명한다.
도 1은 본 발명의 일 실시예에 따른 프로그램 동적 분석 장치를 설명하기 위한 도면, 도 2는 도 1에 도시된 동적 역방향 분석부를 세분화한 블록도, 도 3은 본 발명의 일 실시예에 따른 Reaching-Definition 분석을 설명하기 위한 예시도, 도 4는 본 발명의 일 실시예에 따른 함수 내 분석(Intraprocedural analysis)을 설명하기 위한 알고리즘, 도 5는 본 발명의 일 실시예에 따른 함수 단위 분석을 설명하기 위한 예시도, 도 6은 본 발명의 일 실시예에 따른 함수 단위 분석(Interprocedural analysis)을 설명하기 위한 예시도, 도 7은 본 발명의 일 실시예에 따른 정적 분석과 동적 분석에 이용되는 의존 그래프를 설명하기 위한 예시도이다.
도 1을 참조하면, 본 발명의 일 실시예에 따른 프로그램 동적 분석 장치(100)는 동적 분석부(110), 정적 분석부(120), 동적 역방향 분석부(130)를 포함한다.
동적 분석부(110)는 바이너리 프로그램을 동적 분석하여 콜 트레이스(call trace)를 획득한다. 동적 분석은 프로그램을 실행함으로써 프로그램을 분석하는 것으로, 바이너리 코드의 실행 경로 탐색에 대한 동적 분석일 수 있다. 콜 트레이스는 함수들의 동적 콜 그래프를 의미하는 것으로, 함수들의 동적 콜 그래프는 프로그램의 실행 동안 프로그램의 프로파일링을 위하여 이용되는 개요(abstraction)를 나타낸다. 프로파일링은 프로그램 동작(behavior)을 이해하고 프로그램 및 프로그램들의 소스들에서의 오류를 검출하고, 프로그램의 성능 분석에 필요하다. 프로그램서 모든 함수 콜을 트레이싱하는 정확한 동적 콜 그래프를 획득하기 위해서는 프로그램의 모든 함수들의 사용(instrumentation)이 요구되며 이용될 수 있다.
정적 분석부(120)는 동적 분석부(110)에서 획득된 콜 트레이스를 기반으로 바이너리 프로그램의 테인트 소스(taint source)에 대한 정적 분석을 수행하여 의존 그래프를 생성한다. 여기서, 테인트 소스는 바이너리 프로그램에서 크래시를 발생시킨 명령어일 수 있다.
바이너리 프로그램은 함수들로 구성되고, 각 함수들은 명령어들로 구성되므로, 프로그램을 동적 분석하기 전에 분석에 필요한 명령어만을 추출할 필요가 있다. 다시 말하면, 바이너리 프로그램을 동적으로 역방향 분석을 할 때, 명령어 트레이스를 추출하여 분석을 한다. 이때, 트레이스의 크기가 크면 클수록 분석에 필요한 시간 역시 많이 필요하다. 실제 상용 프로그램은 프로그램의 코드의 양이 많기 때문에 트레이스의 크기 또한 커지고 분석에 필요한 시간도 오래 걸리게 된다. 프로그램 분석이 오래 걸린다면, 악성코드에 대한 대처가 늦거나 프로그램의 취약점 패치가 느려질 수 있다.
이에, 정적 분석부(120)는 정적 분석을 통해 분석에 필요한 명령어만을 추출하여, 의존 그래프를 생성한다. 즉, 정적 분석부(120)는 크래시를 발생시킨 명령어들 각각에 대하여 각 명령어들의 도달지점들(Reaching Definition)을 식별하고, 식별된 도달지점들 중 해당 명령어가 실제로 사용되는 지점(Def-Use Chaining)을 찾아내어 의존 그래프로 생성한다. 이때, 정적 분석부(120)는 정적 분석 기법인 리칭-데프(Reaching definition) 분석을 이용할 수 있다. Reaching-Definition 분석은 변수를 정의하는 명령어가 어디까지 영향을 줄 수 있는가, 즉 어디까지 도달하는가를 알아내는 것이 목적이다. 따라서, 정적 분석부(120)는 Reaching-Definition 분석을 통해 각 인스트럭션(instruction)에 도달 가능한 인스트럭션(instruction)이 어떤 것이 있는지 추출하고, 이 결과를 이용하여 데프-유즈 체이닝(Def-use chaining) 분석을 할 수 있다.
한편, 테인트 분석은 특정 데이터가 어떻게 전파되는지를 알기 위해 사용된다. 일반적인 실행 경로를 따라 데이터의 흐름을 분석하게 된다. 하지만, 정적 테인트 분석에서는 모든 실행 경로에 대해 만족하는 분석이 이루어져야 한다. 즉, 반복문이나 조건문 같은 분기가 발생할 경우, 모든 경로를 만족시키는 분석이 이루어져야 한다. 도 3의 CFG는 c언어로 작성된 if문으로 분기를 가지는 프로그램이다. 1번 명령어의 변수 a를 테인트된 데이터라고 할 때, a는 6번 명령어에서 변수 r로 퍼지게 된다. 반대로 7번 명령어에서는 변수 r은 a에 영향을 받지 않는다. 정적 분석에서는 조건문의 분기가 6으로 가게 될지 7로 가게 될지 모르기 때문에 안전한 분석을 위해서 8번 명령어의 지점에서 r은 테인트 되었다고 해야 한다. 여기서 Reaching Definition은 모든 경로에 대해 만족시키는 분석결과를 얻을 수 있기에 이에 대해 적합한 분석이다. Reaching Definition 분석의 결과는 각 베이직 블록의 In과 Out으로 나타나게 된다. Reaching Definitnion은 예제와 같이 6번과 7번의 정의가 8번에서 모두 도달한다고 분석한다. 따라서 보수적으로 분석해야만 하는 정적 테인트 분석에서는 적합한 방법이다.
이것은 역방향 분석 시에도 유효하게 된다. 변수 r에 대해서 추적할 때, 4의 r은 변수 a 또는 b의 영향을 받게 된다. 정방향 분석과 같이, a 또는 b 둘 중 하나만 추적하는 것이 아닌 a와 b 모두 추적해야 한다. 이러한 분석은 오버 테인트(over taint)가 될 수 있지만, 취약점을 놓치면 안 되기 때문에 보수적으로 분석이 이루어져야한다. 그런 후, 정적 분석부(120)는 Reaching Definition을 바탕으로 Use-Def 체인 분석을 하게 된다. 즉, 정적 분석부(120)는 리칭-데프(Reaching definition) 분석 결과를 이용하여 데프-유즈 체이닝(Def-use chaining) 분석을 할 수 있다. 예컨대, 입력 데이터(Taint Source, 크래시 포인트)를 시작으로, 데프-유즈 체이닝(Def-use chaining)은 어떤 명령어 i1에 도달 가능한 정의(Definition)들 중에서 i1에서 사용(Use)하는 경우에 그 관계를 그래프로 반영한다. 결과적으로 크래시에 영향을 받은 모든 명령어들의 관계가 분석되어 데프-유즈 그래프가 완성된다. 데프-유즈 그래프에 포함된 노드(vertex)는 크래시 포인트의 영향을 받은 인스트럭션(instructions)일 수 있다.
정적 분석부(120)는 의존 그래프가 생성되면, 의존 그래프로부터 프로그램의 제어권을 옮길 수 있는 명령어를 식별하여, 크래시를 발생시킨 명령어의 공격 가능성을 분석한다.
상술한 바와 같이 정적 분석부(120)는 동적 분석부(120)에서 획득된 콜 트레이스에 대해 정적 분석을 수행하여, 바이너리 프로그램의 입력과 관련 여부에 대한 결과를 출력한다.
즉, 정적 분석부(120)는 취약한 지점의 주소와 취약한 주소까지의 동적 call trace를 입력 받으면, 오염된 데이터가 쓰인 지점의 주소를 입력하고 그 지점이 있는 함수부터 함수 내 분석(Intraprocedural analysis)을 수행한다. 여기서, 함수 내 분석은 Reaching Definition과 Use-Def chaining을 기반으로 한 역테인트 분석을 실시하는 것을 의미할 수 있다. 역테인트 분석은 오염된 데이터가 어느 프로그램 지점까지 영향을 주는 지에 대해 프로그램 실행의 역방향으로 분석한다. 함수내 분석이 완료되면, 정적 분석부(120)는 함수 단위 분석(Interprocedural analysis)을 수행한다. 즉, 현재 분석 지점의 함수 내부에 read()와 같은 시스템콜이 있는지에 대해 확인하여, 프로그램의 입력과 관련이 있는지 확인한다. 만약 있다면 분석은 종료하게 되고, 없으면 현재 분석하고 있는 함수를 호출한 함수(Caller)를 찾아 함수 간 분석(Interprocedural analysis)을 하게 된다. 이때 함수 간 분석에서는 실제 실행을 통해 얻은 call trace를 바탕으로 분석을 하게 된다. Call trace는 함수 간 분석을 할 때 취약점을 유발할 수 있는 지점에 대해 분석할 때 실제 실행된 함수만 분석하게 해줌으로써 분석의 범위를 좁혀준다. 만약 함수 인자로부터 영향을 받았다면, 해당 함수의 호출 함수를 찾고 호출 함수에 대해 함수 내 분석을 수행한다. 함수내 분석 수행을 마치면, 마찬가지로 프로그램의 입력과의 관계성 분석과 함수 간 분석을 반복한다. 만약 함수의 인자와 관련이 없다면 분석을 종료하게 된다. 그리고 그 데이터가 함수의 입력에 영향을 준다면, 해당 함수를 호출하는 함수에 대해 역테인트 분석을 실시한다. 만약, read()와 같은 시스템콜의 결과에 영향을 받는다면 입력과 연관이 있는 것으로 판단한다.
이러한, 정적 분석부(120)는 함수내 분석모듈(122), 함수 단위 분석모듈(124)을 포함한다.
함수내 분석모듈(122)은 오염된 데이터가 쓰인 지점의 주소를 입력하고 그 지점이 있는 함수부터 함수 내 분석(Intraprocedural analysis)을 수행한다. 여기서, 함수내 분석은 크래시가 일어난 지점의 명령어를 오염된 명령어의 집합에 넣은 후 분석을 시작하고, 상기 명령어에 영향을 준(use) 명령어를 찾는 과정을 반복하는 역테인트 분석을 수행한다.
함수 단위 분석모듈(124)은 현재 분석 지점의 함수 내부에 시스템콜이 있는지에 대해 확인하여, 프로그램의 입력과 관련이 있는지 확인하는 함수 단위 분석(Interprocedural analysis)을 수행한다. 즉, 함수 단위 분석모듈(124)은 역테인트 분석의 결과가 함수의 입력과 관련이 있는지를 확인하고, 그 확인결과 관련이 있는 경우 콜 트레이스를 바탕으로 해당 함수를 호출한 함수(caller function)를 모두 찾고, Caller 함수에서 callee함수의 호출 지점을 찾으며, callee 함수의 입력을 넣어주는 지점을 모두 찾고 이 지점에 대해 역테인트 분석을 수행한다.
구체적으로, 정적 분석은 동적 분석에 비해 정보가 부족하기 때문에 분석의 결과가 정교하지 않다. 특히 CFG에서 간접 점프에 관한 정보가 없고, call sensitivity 때문에 정교하지 않은 분석이 이루어지게 된다. 함수 단위 분석모듈은 실제 call trace를 통하여 간접 점프 정보를 얻고, 실제 취약점과 관련된 경로만을 분석할 수 있게 해준다. 함수 단위 분석모듈은 함수 단위 분석을 위해서 동적 분석부에서 얻은 call trace를 이용한다. Call trace를 이용함으로써, 간접 점프 정보와 실제 취약점이 발생한 실행 경로만을 분석할 수 있다.
함수 단위 분석(Interprocedural Analysis)는 오염된 데이터의 원출처를 알기 위해서 반드시 필요하다. 프로그램은 많은 함수들로 구성된다. 입력과 관련된 시스템콜은 프로그램의 초기에 있을 가능성이 크지만, 개발자가 관찰하고자 하는 데이터는 프로그램 어디에도 존재할 수 있다. 따라서 오염된 데이터의 원출처를 알기 위해서 함수 단위 분석은 선택이 아닌 필수이다.
함수 단위 분석은 도 6에 도시된 알고리즘대로 분석을 한다. 먼저, 크래시가 일어난 함수 내에서 역테인트 분석을 한다. 역테인트 분석의 결과가 함수의 입력과 관련이 있는지를 확인한다. 관련이 있다면 4번처럼 call graph를 바탕으로 이 함수를 호출한 함수(caller function)을 모두 찾는다. 이때 call graph는 동적으로 얻은 call graph일 수 있다. Caller 함수에서 callee함수의 호출 지점을 찾고, callee함수의 임력을 넣어주는 지점을 모두 찾고 이 지점에 대해 역테인트 분석을 실시한다. 역테인트 분석 후, 도 6에 정의된 상황에 따라 분석을 한다. 만약 함수의 입력과 관련이 없다면 분석을 멈추게 된다.
도 3은 정적 call graph가 있고 ‘crashfunc’함수에서 크래시가 발생한 예제이다. ‘crashfunc’ 함수는 func4와 func5에서 호출한다. 이때 동적으로 얻은 call graph에서 ‘func4’만을 실행했다고 할 때 ‘func4’에 대해 분석을 한다고 가정하면, ‘crashfunc’ 함수의 인자는 ‘func4’ 함수 내에서 ‘eax’레지스터와 ‘ecx’레지스터의 영향을 받는다. 그리고 이 레지스터들은 ‘ebp-4’와 ‘ebp-8’이 가리키는 주소가 가지는 값으로 영향을 받고 이 주소들은 ‘func4’함수의 인자들이기 때문에, ‘func4’를 호출한 ‘func3’에 대해서도 같은 분석이 이루어진다.
함수 단위 분석 시 외부 라이브러리 함수 호출에 대해서도 고려해야 한다. 정적 분석에서는 외부 라이브러리에 대한 정보가 부족하기 때문에 함수 내에서 오염된 데이터가 어떻게 퍼지는지에 대해 알 수 없다. 따라서 외부 라이브러리 함수 호출에 대해서 보수적으로 분석해야하기 때문에, 외부 함수 호출이 있을 경우, 해당 함수의 인자들이 모두 오염된 것으로 판단한다.
이처럼, 정적 분석부(120)는 프로그램을 동적 분석하기 전에 정적 분석을 통해 분석에 필요할 명령어를 추출하기 때문에, 동적 분석할 명령어가 줄어들게 되어 보다 빠르게 동적 분석을 수행할 수 있다.
동적 역방향 분석부(130)는 정적 분석부(120)에서 생성된 의존 그래프를 기반으로 바이너리 프로그램을 동적 역방향 분석을 수행하여, 바이너리 프로그램의 입력과 관련 여부에 대한 결과를 출력한다.
동적 분석 장치(100)는 정적분석이 이루어진 후에 정적분석의 결과를 바탕으로 다시 한 번 동적분석을 수행한다. 이는 정적분석은 동적분석에 비해 정보가 분석을 하기 위한 정보가 적기 때문이다. 예컨대, 레지스터가 가리키는 메모리 정보, 시스템콜 등의 정보가 적기 때문에 분석을 할 때 이러한 부분들 때문에 부정확한 분석이 이루어질 수 있다. 하여 정적 분석 후에 동적분석을 다시 하게 된다. 그러나, 정적분석의 결과에서 취약점이 없다고 판단된 경우, 동적 분석을 하지 않는다.
동적 역방향 분석부(140)는 정적분석에서 얻은 의존 그래프를 기반으로 분석을 하게 되는데, 이 의존 그래프는 정적분석에서 생성된 의존 그래프를 도 7과 같이 가지치기하여 생성된 그래프일 수 있다. 도 7의 (a)는 정적분석에서 얻은 Use-Def 그래프(의존 그래프)로, 빨간색은 실제로는 Use-Def 관계가 아니지만 정적분석에서 이와 같이 생성된다. (b)는 (a)를 바탕으로 동적분석을 한 그래프로, 동적분석에서는 빨간색과 같은 잘못된 Use-Def 관계를 제거한다. 정적분석에서는 메모리값과 같은 정확한 레지스터의 값을 모르기 때문에 분석의 안전성을 위하여 실제로는 use-def관계가 아니지만 use-def 관계로 정의하는 경우가 있다. 동적분석에서는 정확한 레지스터의 값과 메모리 정보를 알고 있기 때문에 이러한 것들에 대해서 가지치기가 가능하다.
이렇게 함으로써 정적분석의 부정확함과 동적분석의 분석시간이 많이 든다는 단점을 완화시키는 분석이 가능하다.
한편, 프로그램의 동적 분석은 프로그램의 취약점 분석과 악성코드 분석 등 보안 분야에서 널리 활용된다. 그중에서 동적 역방향 분석은 프로그램의 특정 지점이 프로그램의 입력과 관계가 있는지 파악하기 위해 사용한다. 하지만, 동적 분석은 프로그램을 실행시켜야 하기 때문에 시간이 오래 걸린다는 단점이 있다. 분석이 오래 걸리면 취약점의 패치나 악성코드에 대한 대처가 제때 되지 않을 수 있다.
이에, 프로그램 동적 분석 장치(100)는 동적 역방향 분석을 수행하여 분석 시간을 줄이고, 이로 인해 보다 빠르게 취약점이나 악성코드에 대처할 수 있게 해준다.
도 8 및 도 9는 본 발명의 일 실시예에 따른 프로그램 동적 분석 방법을 설명하기 위한 순서도이다.
도 8 및 9를 참조하면, 동적 분석 장치는 바이너리 프로그램을 동적 분석하여 콜 트레이스(call trace)를 획득한다(S810).
단계 S810의 수행 후, 동적 분석 장치는 콜 트레이스를 기반으로 바이너리 프로그램의 테인트(taint)에 대한 정적 분석을 수행하여 의존 그래프를 생성한다(S820). 이때, 동적 분석 장치는 크래시를 발생시킨 명령어들 각각에 대하여 명령어들의 도달지점들을 식별하고, 도달지점들 중 해당 명령어가 실제로 사용되는 지점을 찾아낸 후, 그 결과를 의존 그래프로 생성한다.
단계 S820 수행 후, 동적 분석 장치는 크래시가 일어난 지점의 명령어를 오염된 명령어의 집합에 넣은 후, 오염된 데이터가 쓰인 지점의 주소를 입력하고 그 지점이 있는 함수부터 함수 내 분석(Intraprocedural analysis)을 수행한다(S830). 즉. 동적 분석장치는 크래시가 일어난 함수 내에서 역테인트 분석을 한다.
단계 S830이 수행되면, 동적 분석 장치는 역테인트 분석의 결과가 프로그램의 입력과 관계가 있는지를 판단한다(S840). 즉, 동적 분석 장치는 현재 분석 지점의 함수 내부에 read()와 같은 시스템콜이 있는지에 대해 확인하여, 프로그램의 입력과 관련이 있는지 확인한다.
단계 S840의 판단결과 관련이 있다면, 동적 분석 장치는 크래시의 위험도를 분석한다(S850). 즉, 프로그램의 입력과 관련이 있다면, 해당 크래시를 공격 가능한 것으로 결정한다. 이처럼 공격 가능성이 있는 것으로 판단되면, 동적 분석 장치는 의존 그래프를 기반으로 바이너리 프로그램을 동적 역방향 분석을 수행하여, 상기 바이너리 프로그램의 입력과 관련 여부에 대한 결과를 출력한다.
만약, 단계 S840의 판단결과 관련이 없으면, 동적 분석 장치는 함수간 분석을 수행하고(S860), 단계 S840을 수행한다. 즉, 프로그램 입력과 관련이 없으면, 현재 분석하고 있는 함수를 호출한 함수(Caller)를 찾아 함수 간 분석(Interprocedural analysis)을 하게 된다. 이때 함수 간 분석에서는 실제 실행을 통해 얻은 call trace를 바탕으로 분석을 하게 된다. Call trace는 함수 간 분석을 할 때 취약점을 유발할 수 있는 지점에 대해 분석할 때 실제 실행된 함수만 분석하게 해줌으로써 분석의 범위를 좁혀준다. 만약 함수 인자로부터 영향을 받았다면, 해당 함수의 호출 함수를 찾고 호출 함수에 대해 함수 내 분석을 수행한다. 함수내 분석을 수행을 마치면, 마찬가지로 프로그램의 입력과의 관계성 분석과 함수 간 분석을 반복한다. 만약 함수의 인자와 관련이 없다면 분석을 종료하게 된다. 그리고 그 데이터가 함수의 입력에 영향을 준다면, 해당 함수를 호출하는 함수에 대해 역테인트 분석을 실시한다. 만약, read()와 같은 시스템콜의 결과에 영향을 받는다면 입력과 연관이 있는 것으로 판단한다.
이제까지 본 발명에 대하여 그 바람직한 실시예들을 중심으로 살펴보았다. 본 발명이 속하는 기술 분야에서 통상의 지식을 가진 자는 본 발명이 본 발명의 본질적인 특성에서 벗어나지 않는 범위에서 변형된 형태로 구현될 수 있음을 이해할 수 있을 것이다. 그러므로 개시된 실시예들은 한정적인 관점이 아니라 설명적인 관점에서 고려되어야 한다. 본 발명의 범위는 전술한 설명이 아니라 특허청구범위에 나타나 있으며, 그와 동등한 범위 내에 있는 모든 차이점은 본 발명에 포함된 것으로 해석되어야 할 것이다.
100 : 동적 분석 장치
110 : 동적 분석부
120 : 정적 분석부
130 : 동적 역방향 분석부

Claims (9)

  1. 바이너리 프로그램을 동적 분석하여 콜 트레이스(call trace)를 획득하는 동적 분석부;
    상기 콜 트레이스를 기반으로 상기 바이너리 프로그램의 테인트(taint)에 대한 정적 분석을 수행하여 의존 그래프를 생성하는 정적 분석부; 및
    상기 의존 그래프를 기반으로 상기 바이너리 프로그램을 동적 역방향 분석을 수행하여, 상기 바이너리 프로그램의 입력과 관련 여부에 대한 결과를 출력하는 동적 역방향 분석부
    를 포함하는 프로그램 동적 분석 장치.
  2. 제1항에 있어서,
    상기 정적 분석부는,
    상기 바이너리 프로그램의 실행을 통한 테인트 분석을 수행하여, 상기 바이너리 프로그램에 대하여 크래시(crash)를 발생시킨 명령어들 각각에 의해 영향을 받는 모든 명령어를 정적 분석하여 해당 크래시의 위험도를 분석하는 것을 특징으로 하는 프로그램 동적 분석 장치.
  3. 제2항에 있어서,
    상기 정적 분석부는,
    상기 다수의 크래시들을 발생시킨 명령어들 각각에 대하여 상기 명령어들의 도달지점들을 식별하고, 상기 도달지점들 중 해당 명령어가 실제로 사용되는 지점을 찾아낸 후, 그 결과를 의존 그래프로 생성하며, 상기 의존 그래프로부터 프로그램의 제어권을 옮길 수 있는 명령어를 식별한 후, 상기 크래시를 발생시킨 명령어의 공격 가능성을 분석하는 것을 특징으로 하는 프로그램 동적 분석 장치.
  4. 제1항에 있어서,
    상기 정적 분석부는,
    오염된 데이터가 쓰인 지점의 주소를 입력하고 그 지점이 있는 함수부터 함수 내 분석(Intraprocedural analysis)을 수행하는 함수내 분석모듈; 및
    현재 분석 지점의 함수 내부에 시스템콜이 있는지에 대해 확인하여, 프로그램의 입력과 관련이 있는지 확인하는 함수 단위 분석(Interprocedural analysis)을 수행하는 함수 단위 분석모듈을 포함하는 것을 특징으로 하는 프로그램 동적 분석 장치.
  5. 제4항에 있어서,
    상기 함수내 분석모듈은,
    크래시가 일어난 지점의 명령어를 오염된 명령어의 집합에 넣은 후 분석을 시작하고, 상기 명령어에 영향을 준(use) 명령어를 찾는 과정을 반복하는 역테인트 분석을 수행하는 것을 특징으로 하는 프로그램 동적 분석 장치.
  6. 제4항에 있어서,
    상기 함수간 분석모듈은,
    현재 분석 지점의 함수 내부에 시스템콜이 있는지에 대해 확인하여, 프로그램의 입력과 관련이 있는지 확인하고, 상기 확인결과 관련이 있는 경우 상기 콜 트레이스를 바탕으로 해당 함수를 호출한 함수(caller function)을 모두 찾고, 상기 Caller 함수에서 callee함수의 호출 지점을 찾은 후, callee 함수의 입력을 넣어주는 지점을 모두 찾아 그 지점에 대해 역테인트 분석을 수행하는 것을 특징으로 하는 프로그램 동적 분석 장치.
  7. 제1항에 있어서,
    상기 동적 역방향 분석부는,
    레지스터 값 및 메모리 정보에 기초하여, 상기 의존 그래프를 가지치기하고, 상기 가지치기된 의존 그래프를 동적 역방향 분석을 수행하는 것을 특징으로 하는 프로그램 동적 분석 장치.
  8. 바이너리 프로그램을 동적 분석하여 콜 트레이스(call trace)를 획득하는 단계;
    상기 콜 트레이스를 기반으로 상기 바이너리 프로그램의 테인트(taint)에 대한 정적 분석을 수행하여 의존 그래프를 생성하는 단계; 및
    상기 의존 그래프를 기반으로 상기 바이너리 프로그램을 동적 역방향 분석을 수행하여, 상기 바이너리 프로그램의 입력과 관련 여부에 대한 결과를 출력하는 단계
    를 포함하는 프로그램 동적 분석 방법.
  9. 제8항에 있어서,
    상기 의존 그래프를 생성하는 단계는,
    오염된 데이터가 쓰인 지점의 주소를 입력하고 그 지점이 있는 함수부터 함수 내 분석(Intraprocedural analysis)을 수행하는 단계; 및
    현재 분석 지점의 함수 내부에 시스템콜이 있는지에 대해 확인하여, 프로그램의 입력과 관련이 있는지 확인하는 함수 단위 분석(Interprocedural analysis)을 수행하는 단계를 포함하는 것을 특징으로 하는 프로그램 동적 분석 방법.
KR1020180169833A 2017-12-26 2018-12-26 프로그램 동적 분석 장치 및 그 방법 KR102195906B1 (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
KR20170179696 2017-12-26
KR1020170179696 2017-12-26

Publications (2)

Publication Number Publication Date
KR20190078545A true KR20190078545A (ko) 2019-07-04
KR102195906B1 KR102195906B1 (ko) 2020-12-29

Family

ID=67259743

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020180169833A KR102195906B1 (ko) 2017-12-26 2018-12-26 프로그램 동적 분석 장치 및 그 방법

Country Status (1)

Country Link
KR (1) KR102195906B1 (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR102200666B1 (ko) * 2019-12-31 2021-01-12 충남대학교 산학협력단 안드로이드 미디어프레임워크 취약점과 심각도 분석 시스템 및 방법

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20140013309A1 (en) * 2013-05-21 2014-01-09 Concurix Corporation Interactive Graph for Navigating Application Code
KR101482073B1 (ko) 2013-05-24 2015-01-14 한국과학기술원 스팸 댓글 차단 시스템 및 방법

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20140013309A1 (en) * 2013-05-21 2014-01-09 Concurix Corporation Interactive Graph for Navigating Application Code
KR101482073B1 (ko) 2013-05-24 2015-01-14 한국과학기술원 스팸 댓글 차단 시스템 및 방법

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR102200666B1 (ko) * 2019-12-31 2021-01-12 충남대학교 산학협력단 안드로이드 미디어프레임워크 취약점과 심각도 분석 시스템 및 방법

Also Published As

Publication number Publication date
KR102195906B1 (ko) 2020-12-29

Similar Documents

Publication Publication Date Title
CN109002721B (zh) 一种信息安全漏洞的挖掘分析方法
KR100926115B1 (ko) 특정 이벤트/조건에서 동작하는 윈도우용 악성 코드탐지를 위한 프로그램 자동 분석 장치 및 방법
CN110287693B (zh) 基于符号执行路径剪枝的缓冲区溢出漏洞自动检测方法
CN109101815B (zh) 一种恶意软件检测方法及相关设备
Zhang et al. IntPatch: Automatically fix integer-overflow-to-buffer-overflow vulnerability at compile-time
US20240121261A1 (en) Automated Security Analysis of Software Libraries
US20230028595A1 (en) Analysis function imparting device, analysis function imparting method, and analysis function imparting program
US20080307397A1 (en) Program Analysis by Partial Emulation
US9286039B2 (en) Operating system support for contracts
CN111859380A (zh) Android App漏洞的零误报检测方法
US20120297173A1 (en) Debugger system, method and computer program product for debugging instructions
Ovasapyan et al. Application of taint analysis to study the safety of software of the Internet of Things devices based on the ARM architecture
KR20190078545A (ko) 프로그램 동적 분석 장치 및 그 방법
KR20180129623A (ko) 연관된 다중 파일 정적 분석 장치
Cho et al. Evaluating code coverage for kernel fuzzers via function call graph
US9710360B2 (en) Optimizing error parsing in an integrated development environment
US10460108B1 (en) Method and system to identify and rectify input dependency based evasion in dynamic analysis
KR20180076550A (ko) 다중 함수 정적 분석 장치 및 방법
US9600284B2 (en) Computer program instruction analysis
KR102421394B1 (ko) 하드웨어와 소프트웨어 기반 트레이싱을 이용한 악성코드 탐지 장치 및 방법
KR102097672B1 (ko) 프로그램 버그 발생 인자 결정 장치 및 그 방법
Ashouri et al. Hybrid taint flow analysis in Scala
Inayoshi et al. Plug and analyze: Usable dynamic taint tracker for Android apps
Tan et al. Jsfox: integrating static and dynamic type analysis of javascript programs
CN117828600A (zh) Android个人信息违规收集行为动态检测方法

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant