최신의 보안패치를 적용하고, 보안 프로그램들을 최신 버전으로 유지하더라도 웹 서핑을 하는 것만으로도 PC에 트로잔이 설치될 수가 있다. 바로 제로데이 취약점을 이용한 공격으로 가능한 일이다. 이 연재는 제로데이에 대한 정확한 이해와 분석을 통해 제로데이 공격을 어떻게 예방할 수 있는지에 대해 알아보는데 목적이 있다. 이번호에서는 제로데이 공격에 대해 직접 확인하고, 분석하는 방법에 대해서 알아보며, 최근에 발생되었던 제로데이 공격을 분석해 제로데이 공격에 대한 이해를 높이도록 한다.
최근의 표적형 제로데이 공격들의 경우 대중에 많이 알려진 공격들이 아니기 때문에, 분석을 위해서는 공격에 대한 샘플 확보와 정보수집이 무엇보다도 중요하다. 샘플 확보의 경우, 일반인들이 쉽게 공격 샘플을 확보할만한 방법이 뚜렷하지는 않다. 그러나 일부 폭넓게 알려진 제로데이 공격의 경우, 인터넷상에서 공격 코드 샘플을 쉽게 구할 수 있는 경우도 있으므로 이를 이용하여 분석할 수도 있다. 또한, 자체적으로 허니팟 등을 구현하여 신종 공격 샘플을 수집하는 방안도 고려할 수 있다.
올해의 경우, 과거 어떠한 때보다도 제로데이 공격이 활발하게 이루어진 덕에 많은 기업과 단체에서도 관련된 정보를 제공중에 있지만, 아직까지는 많은 정보들을 얻기가 쉽지만은 않다. 다행스럽게도 필자가 글을 쓰고 있는 지금, 해외 유명 보안업체인 eEye 에서도 제로데이와 관련된 정보를 제공하는 페이지를 오픈했다는 반가운 소식이 들려왔다. 제로데이와 관련된 유용한 정보를 무료로 제한없이 볼 수 있으므로, 한번쯤 살펴보는 것을 권장한다.
분석환경 구축
명확하게 알려지지 않은 제로데이 취약점을 이용한 악성코드를 분석하기 위해서는 그만큼의 준비가 필요하다. 이하의 내용은 비단 제로데이 공격을 분석하기 위한 것만이 아닌, 일반적인 악성 프로그램을 분석하는 경우에도 동일하게 적용되는 것이다. 다만, 제로데이 공격의 경우 공격의 실체를 잘 알지 못하며, 일반적인 안티바이러스 프로그램을 이용하여 쉽게 치료하기 어려운 경우가 많기 때문에 더욱 더 주의를 기울여야만 한다.
첫번째는 제로데이 공격 코드가 동작할 수 있는 환경을 구축하는 것이다. 제한적인 환경에서만 동작되고 있는 일부 제로데이 공격 코드를 분석하기 위해서는, 공격 코드가 동작가능한 환경을 구축하는 것이 필요하다. 다양한 환경에서 테스트를 진행하는 것으로 취약점에 대하여 보다 자세히 파악하는 것이 가능해진다.
두번째로는 분석 중 제로데이 공격에 의해 실제 피해를 입는 것을 방지하기 위한 별도의 테스트 장비가 필요하다. 원활한 분석을 위해 주요작업에 사용되지 않는 테스트 장비를 이용하거나 VMWARE 류의 가상 머신을 이용해 실제 피해없이 분석을 할 수 있도록 한다.
세번째로는 제로데이 공격상황을 모니터링 할 수 있는 모니터링 상태 도구들의 준비가 필요하다. 모니터링 도구들을 이용하면 실시간으로 파일과 네트워크의 상태확인이 가능하여 악성코드의 행동을 파악하는데 많은 도움이 된다. 대표적인 모니터링 도구로는 실시간으로 프로세스 상태 확인이 가능한 Process Explorer와 파일 접근확인이 가능한 Filemon 등이 있다.
일부 악성코드들의 경우, 루트킷 방식을 이용하여 손쉽게 확인이 불가능한 경우가 있다. 이러한 경우, 루트킷을 탐지할 수 있는 프로그램을 이용해야만 한다. IceSword 와 같은 루트킷 탐지가 가능한 도구를 이용하여 악성 프로그램의 숨겨진 프로세스와 파일을 확인할 수 있다.
네번째로는 악성 프로그램을 분석할 수 있는 디스어셈블러, PE실행 파일 분석도구, 디버거 등이 필요하다. 디스어셈블러는 기계어 코드로 구성된 악성 프로그램을 어셈블리어 코드로 변환 시켜 분석을 할 수 있도록 한다. 대표적인 프로그램으로는 IDA Pro 와 W32DASM 등이 있으며, 현재에는 가장 성능이 뛰어난 것으로 알려진 IDA Pro가 많이 사용되고 있다. PE 실행 파일 분석도구는 윈도우즈 실행 파일 포맷인 PE에 맞게 파일을 분석하여, 관련된 정보를 열람하고 편집할 수 있도록 도와주는 툴이다. 툴에 따라 파일의 Packing 여부를 판별하는 기능을 제공하기도 한다. PeID, PeExplorer, LordPE 등의 다양한 툴이 존재한다.
마지막으로 프로그램을 실행한 상태에서 분석을 가능하게 하는 디버거로는 Ollydbg와 Softice, Windbg 등이 사용된다. 일반적으로 사용법이 간단한 Ollydbg가 많이 사용되고 있다.
MS Word 제로데이 분석
Microsoft Office 관련 제로데이 취약점들은 주로 오피스 헤더나 특정 데이터 필드의 값을 임의로 조작하여 메모리 오류를 일으켜 비정상적인 동작을 수행하는 방법이 대다수를 차지하고 있다. 공격 코드 작성과 취약성 분석에는 오피스 파일 포맷에 대한 이해와 프로그램 분석능력이 필요하다. 오피스 파일 포맷은 Microsoft에서 공개한 바가 없지만, 다행스럽게도 OpenOffice와 같은 프로젝트에 의해 일부 오피스 파일 구조의 파악이 가능하다. 오피스 파일 포맷은 각각의 버전과 프로그램에 따라 조금씩 차이가 존재할 수 있으며, 여러 다양한 구조체에 의해 구성된다.
프로그램내에 취약 코드가 존재하는 경우 Size 필드와 Data 필드를 조작하는 것만으로도, Memory Corruptin을 유발 가능하다. 그러나 해당 내용을 무작정 변경하는 경우 문서가 정상적으로 열람되지 않을 수가 있어, 취약점이 있더라도 실제 공격이 진행되지 않을 수도 있다. 때문에 단순한 오버플로우 취약점 공격에 비해 공격의 난이도가 높은 편이다.
또한, 실제로 제로데이 공격에 이용되는 취약점은 이보다 더욱 복잡한 경우가 대부분이다. 실제 제로데이 공격에 이용되어 MS06-027 로 패치된 취약점의 경우, 일반적으로 오버플로우 발생을 위해 인위적으로 길게 이루어진 문자열을 찾을 수 없다. 단지 특정 헤더 부분의 몇 바이트만을 조작하는 것으로서 메모리의 값 변조가 이루어지고 있기 때문이다. <그림 5>에서는 실제 공격에 사용되었던 파일의 조작된 부분을 나타내고 있다.
해당내용을 조작하게 되면, 아래의 코드에서와 같이 참고되는 메모리 번지를 임의로 수정 가능하게 되므로 공격자가 원하는 코드의 실행이 가능하다.
301AC0EB . 40 INC EAX
301AC0EC . 40 INC EAX
; [EAX+8] = 00125b68 공격자가 파일 내에 삽입한 스택 주소 값
301AC0ED . 8378 08 00 CMP DWORD PTR DS:[E AX+8],0
; 공격자가 임의로 지정한 값이 존재하므로 점프하지 않는다.
301AC0F1 . 74 09 JE SHORT WINWORD. 301AC0FC; 00125b68 [파일에 있는 값] 을 EAX 에 저장
301AC0F3 . 8B40 08 MOV EAX,DWORD PTR DS:[EAX+8]
; 공격자가 임의로 삽입한 00125b68 을 주소로 하여, 그 값을 ECX에 저장
301AC0F6 . 8B08 MOV ECX,DWORD PTR DS:[EAX]
301AC0F8 . 50 PUSH EAX
; 메모리 번지 00125b68 + 0x14 번지에 위치한 값을 참고로 하여 호출
301AC0F9 . FF51 14 CALL DWORD PTR DS:[ECX+14]
단지 해당 4바이트를 조작한 것만으로 어떻게 레지스터의 값을 변조하고, 실행 흐름마저 임의로 변조 가능하였을까. 그것은 해당내용이 메모리에 인위적으로 기록가능하도록 Length 부분을 공격자가 임의로 변조하였기 때문이다.
다음 <그림 6>에서 제로데이 검사를 위해 Sourcefire VRT 에서 제작한 doccheck를 이용한 결과를 보이고 있다. 정상적인 변조되지 않은 문서와 공격을 위해 변조된 문서의 결과가 다르게 나온 것을 볼 수가 있다.
Length 부분은 오피스 파일의 헤더 부분에 위치하고 있다. 그러나 악용되는 것을 방지하기 위해 해당 Length 값 변조에 대해서는 이 글에서는 자세히 다루지 않도록 하며 독자들의 과제로 남기도록 하겠다.
Internet Explorer 제로데이 분석
Internet Explorer의 제로데이는 공격 코드의 공개로 인하여 비교적 많이 알려졌으며, 그 공격기법이 간단한 MS06-055 VML(벡터 표시 언어) 취약성에 대해서 알아보도록 한다. VML 은 웹상에서 고화질 벡터 그래픽을 처리하기 위한 XML 기반 언어로서, ‘Fill Method’ 의 인자값에 과도하게 긴 문자열이 입력되는 경우, 전형적인 스택 오버플로우가 발생되는 취약점을 가지고 있다.
.text:597BED04 mov edx, [ecx+8]
; 문자열 시작 오프셋
.text:597BED07 mov ebx, [ecx]
.text:597BED09 mov dx, [ebx+edx*2]
.text:597BED0D test dx, dx
.text:597BED10 jz short loc_597BED2F
.text:597BED12 cmp dx, 20h
.text:597BED16 jnz short loc_597BED1E
.text:597BED18 test esi, esi
.text:597BED1A jg short loc_597BED33
.text:597BED1C jmp short loc_597BED24
.text:597BED1E loc_597BED1E:
; 스택에 입력 문자열 저장
.text:597BED1E mov [edi], dx
.text:597BED21 inc esi
.text:597BED22 inc edi
.text:597BED23 inc edi
.text:597BED24
.text:597BED24 loc_597BED24:
; 카운터 증가
.text:597BED24 inc dword ptr [ecx+8]
.text:597BED27 mov edx, [ecx+8]
; 문자열 길이 비교 후 아직 복사가 완료되지 않은 경우 반복 수행
.text:597BED2A cmp edx, [ecx+4]
.text:597BED2D jl short loc_597BED04
초기에 공개된 공격 코드는 다음과 같이 단순한 스택 오버플로우를 공격하는 코드로 구성 되어졌다. 해당 공격 코드의 경우, Windows XP SP2 이상의 버전에서는 정상적인 공격이 되지 않는데, 이는 다음과 같은 이유 때문이다.
·Windows XP SP2 의 경우, 스택 내에서 악의적인 명령이 실행되지 않도록 하는 스택 실행 방지기술(DEP)을 가지고 있기 때문에, 오버플로우가 발생되더라도 스택내에 존재하는 공격자의 공격 코드가 실행되지 않을 수 있다.
·Windows XP SP2 의 경우, 오버플로우 공격에 대비하기 위해 주요 DLL 들이 /GS 옵션으로 컴파일 되어져, 오버플로우 여부를 검사하고 있다. 스택 오버플로우가 발생되는 경우, 리턴 어드레스 앞에 위치한 Security Cookie 값의 변조로 인해 프로그램이 비정상 종료된다.
; 함수 시작부분에서 EBP-4 의 위치에 Security Cookie 값 저장
.text:597BED46 mov edi, edi
.text:597BED48 push ebp
.text:597BED49 mov ebp, esp
.text:597BED4B sub esp, 214h
.text:597BED51 mov eax, ___security_cookie
.text:597BED56 and dword ptr [ecx], 0
.text:597BED59 mov [ebp+var_4], eax
....
; 함수 종료 이전 Security Cookie 값 변조여부 검사
text:597BEDDF mov ecx, [ebp+var_4]
.text:597BEDE2 call @__security_check_cookie@4 ; __security_check_cookie(x)
.text:597BEDE7 eave
.text:597BEDE8 retn 8
그러나 해당 문제점들은 다음과 같은 기법으로 인하여 쉽게 우회가 가능하다.
ㆍ스택 실행 방지기술은 Heap 영역에 공격 코드를 채워넣는 Heap Spraying 기법을 이용하여 쉽게 우회가 가능하다.
ㆍ스택 하단에 위치하고 있는 SEH를 변조시킨 후, 인위적으로 Access Violation 예외를 발생시켜, SEH 예외 구문을 실행하도록 하여, Security Cookie 검사를 우회한다.
Heap Spraying 기법은 최근의 IE 공격에서 계속적으로 이용되고 있는 것으로써, 힙 영역에 공격과 관련된 데이터를 가득 채워넣음으로써 어느 위치에 떨어지더라도 공격 코드가 수행되도록 하는 장점을 가지고 있다.
또한, 인위적으로 Access Violation을 일으켜 예외를 발생시키는 경우 함수의 시작 부분과 끝에 존재하는 Security Cookie 검사없이, SEH 예외처리 구문을 실행하도록 한다. SEH의 Pointer 위치는 스택 내에 존재하므로, 공격자가 스택 오버플로우를 발생시키는 경우, SEH 역시 변조되어 원하는 위치로의 점프를 가능하게 한다.
실제적으로 발생된 제로데이 공격 코드는 해당방식을 이용하여, 최신의 OS에서도 쉽게 악성 프로그램의 전파가 가능하였다. 이상과 같이 최근 가장 이슈화가 되었던 제로데이를 분석해 보았다. 분석내용을 보면 알 수 있듯이, 제로데이 공격이라고 해서 모두 고난이도의 취약점을 이용하고 있는 것은 아니다.
보안성의 강화로 인하여 점점 손쉽게 찾을 수 있는 취약점은 줄어들고 있는 추세지만, 아직까지도 조금만 눈을 돌리면 새로운 취약점이 발견될 수 있는 가능성이 존재한다. 현재까지는 제로데이의 분석 결과물과 취약성을 찾는 연구자는 국내에서는 거의 찾아보기가 힘든 실정이다. 앞으로는 국내의 보다 많은 사람들이 선의의 목적으로 제로데이를 분석하고, 신규 취약점을 찾는데 힘을 써 더욱더 안전한 사이버 세상을 만들 수 있기를 바란다.
<글: 최민성 윈스테크넷 연구원>
[월간 정보보호21c 통권 제77호(info@boannews.com)]
<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>
댓글