구글 애드센스 게재 기념 새로운 포스트 시리즈를 작성하려 합니다.
이름하야 보안 정적 소스코드 분석기 만들기!!!
어디까지 진행될지는 모르겠지만 Java를 대상으로 틈날 때마다 조금씩 작성해 보겠습니다.
Static Analysis vs Dynamic Analysis
Static Analysis는 대상 프로그램의 실행 없이 프로그램을 분석하는 것을 의미합니다. Dynamic Analysis는 반대로 프로그램을 실행하면서 프로그램을 분석하는 것이 되겠죠.
전자의 경우 코드 작성 후 리팩토링을 한다거나, 코드 작성 중에 에러를 수정하는 등이 포함되고 후자의 경우 리버싱이나 퍼징 등이 포함됩니다.
사실 이건 이거다라고 정확하게 구분짓기가 모호하기 때문에 의미 정도만 알고 있는 것이 좋습니다. ^^;
두 방법은 서로 장단점을 가지고 있습니다.
예를 들어 Dynamic Analysis의 경우 어떤 값이 입력되었을 때의 출력 값이 명확하기 때문에 출력되는 값을 기반으로 여러가지 테스트를 할 수 있지만 실행되지 않는 코드에 대한 테스트는 불가능합니다.
반면 Static Analysis의 경우 코드로만 판단해야 하기 때문에 출력 값을 기반으로 하는 테스트가 어렵지만, 대신 빠르고 폭 넓은 테스트가 가능합니다.
이런 장단점이 있기 때문에 어느 방식이 더 좋다라고는 말할 수 없습니다.
Static Analysis의 경우 단점을 극복하기 위해 Symbolic Execution이나 Concolic Execution 같은 분석 방법을 사용하기도 합니다.
우리가 만들어 볼 것은 Static Analysis에 기반한 Analyzer입니다.
사람 vs 기계
분석 방법과 더불어 분석하는 주체가 사람이냐 기계냐에 따라서도 장단점이 나뉘어 집니다.
아시다시피 기계의 경우 빠른 속도, 쉬지 않고 일하는 장점이 있는 반면 오탐과 과탐이 많습니다.
사람의 경우는 아무래도 퍼포먼스 이슈가 빠지지 않죠.
예를 들어 String asdf = korkf0*a_21 와 같은 문자열이 있다고 가정해봅시다.
사람이라면 문자열을 보자마자 어딘가에 사용되는 암호화 key 라던가, 패스워드가 아닌지 의심할 수 있습니다.
반면 기계의 경우 password와 유사한 단어가 매칭되는 것도 아니고, 패턴이 digit로 이루어져 있지도 않고 신용카드, 주민등록번호 패턴과도 매칭되지 않아 무시할 확률이 높습니다.
사람이 눈으로 보자마자 정보를 인식하고 판단하는 정도로 기계가 동작하려면 요즘 유행하는 AI가 제대로 발전해야 하지 않을까 싶습니다. 따라서 대부분의 Static Analyzer들은 오탐/과탐/미탐 확률이 높습니다.
Taint Analysis
앞으로 만들어 볼 Static Code Analyzer는 전통적인 Taint Analysis 방법을 사용할 겁니다.
Taint Analysis는 입력 값이 오염되었다고 가정하고 입력 값의 흐름에 포함된 모든 코드들도 역시 오염된 것으로 간주하여 분석하는 방법입니다.
이런 분석 방법을 사용하는 유명한 리버싱 툴로는 Pin이 있으며 Pin은 Taint Analysis를 적용해 Dynamic Analysis 를 합니다.
Control Flow Graph
Taint Analysis를 위해서는 입력 값이 흘러가는 길을 알고 있어야 합니다.
Control Flow Graph는 Basic Block라고 하는 Node들로 이루어진 그래프입니다. 여기서 Basic Block는 분기가 없는 코드의 흐름을 의미합니다.
예를 들어 Control Flow Graph는 아래와 같이 표현됩니다.
[http://www.drgarbage.com/control-flow-graph-factory/] 에서 발췌
위와 같이 Control Flow Graph가 완성되면 입력 값의 흐름을 추적할 수 있게 됩니다.
이제 이 배경지식을 가지고 다음 포스트에서 실제 프로그램을 만들어보도록 하겠습니다.
읽어주셔서 감사합니다.
'개발' 카테고리의 다른 글
Commands out of sync 문제 (0) | 2017.11.27 |
---|---|
따라하는 python 로또 분석(4) (0) | 2016.07.11 |
따라하는 python 로또 분석(3) (0) | 2016.07.04 |
따라하는 python 로또 분석(2) (0) | 2016.06.28 |
따라하는 python 로또 분석 (1) (0) | 2016.06.21 |