▷ 작성자 : indra (indra@a3security.com)
▷ 편집자 : indra (indra@a3security.com)
Winamp =< 5.541 Overflow 취약점 보안 권고안
By indra@a3security.com
(A.K.A 1ndr4)
I. 취약점 개요 연구 대상 Winamp 5.541 버전의 Skin 오버플로우 취약점 문서 작성일 문서 버전 V0.1 벤더 Winamp 벤더 URL http://www.winamp.com
1. 요 약
Winamp는 Windows OS에서 동영상 및 음원 파일을 재생할 수 있게 해 주는 소프트웨어로,
1. 적용 대상 시스템
- Winamp 5.541 버전을 포함한 하위 버전 |
1. 분석 내용
공개된
다음 그림은 PoC Code를 이용하여 생성한 Skin파일의 일부 내용이다.
위 그림과 같이 Skin파일은 바이너리 파일로 만들어져 있으며, 해당 파일은 “MAKI Script” 라는 스크립트 언어를 컴파일 하여 얻어낸 결과물이다.
MAKI Script와 Compiler에 대해서는 다음의 URL을 참조할 수 있다.
MAKI Script - http://dev.winamp.com/wiki/Modern_Skin:_Skin_Scripting
MAKI Script Compiler - http://forums.winamp.com/showthread.php?threadid=168310
MAKI Script는 Syntax가 C/C++과 매우 흡사한 형태를 지니고 있다.
다음 그림은 MAKI Script의 예제 코드를 나타낸 화면이다.
[그림 2] MAKI Script의 예제코드
dkrdml 파일에서 “getRuntimeVersion” 문자열 뒤에 문자열의 종료를 뜻하는 NUL 문자가 삽입되어 있지 않은 채 “\x41” 문자가 나열되어 있다. 이것은 명백히 의도적인Overflow를 일으키려는 시도로 생각할 수 있다.
다음의 프로그램은 컴파일 된 MAKI Script를 Pseudo-Code로 재 구현 할 수 있다.
MAKI De-Compiler - http://www.rengels.de/maki_decompiler/
다음 그림은 PoC Code에서 생성된 악의적인 Skin파일을 De-Compile 한 화면이다.
[그림 3] 악의적인 Skin파일을 De-Compile 한 화면
본래의 PoC Code는 “getRuntimeVersion” 문자열 뒤에 문자열 종료 코드가 존재하지 않는 형태로, De-Compile이 되지 않아 공격코드 부분을 지우고 De-Compile 한 화면이다. De-Compile 된 형태를 보아 어느 부분에서 취약점이 존재하는지 알 수 있다.
공개된 PoC Code를 분석해 보면 공격에 필요한 Payload는 다음과 같이 구성되었다는 것을 알 수 있다.
[ 314 bytes ] => “AAAA…”
[ 4bytes ] => 0x414112EB /* JMP 0x12 */
[ 4bytes ] => 0x14F01011 /* Common Module Routine (Return Address) */
[ 8bytes ] => 0x90909090… /* NOP */
[ 4bytes ] => 0x120199F8 /* JMP ESP */
[ 12bytes ] => 0x90909090… /* NOP */
[ 338 bytes ] => SHELLCODE
[ 128 bytes ] => “AAAA…”
>>> --snip--
위와 같은 Payload를 참조하며, OllyDBG를 이용해 로드 한 Winamp에 PoC Code를 적용하여 보았다.
아래의 그림은 실행된 PoC Code에 의해 SEH 값이 변경된 화면이다.
[그림 4] PoC Code 실행에 의해 SEH값이 변경 된 화면
위 그림에서 SEH는 0x14F01011, Pointer to next SEH는 0x414112EB로 변경되었다. SEH는 Structured Exception Handler의 약자로, 예외처리 핸들러를 의미한다. 해당 SEH핸들러를 변조할 수 있다면, 고의적으로 Exception 에러를 발생시켜 원하는 데이터 영역을 실행 할 수 있다.
다음 그림은 Exception 에러가 발생 한 화면이다.
[그림 5] Exception 에러가 발생 한 화면
위 그림에서 실행되는 코드는 PUSH DWORD PTR DS:[EDI+4] 이나 EDI 레지스터의 값이 0x00000000로 되어 있다. 코드는 DS:[0x00000004] 에 접근을 시도하지만, 접근할 수 없는 메모리 영역이므로 이에 의해 Exception 에러가 발생하게 된다.
다음 그림은 고의적인 Exception 에러에 의해 실행되는 상황을 캡쳐 한 화면이다.
[그림 6] Exception 핸들러에 의해 shellcode가 실행되는 화면
위 코드의 동작을 조금 더 자세히 살펴보면 현재 실행되고 있는 주소는 0x7C9332A6이며, ECX 레지스터에 저장되어 있는 주소에 대해 CALL 명령을 실행한다. ECX 레지스터에는 0x14F01011 주소가 저장되어 있으며, 0x14F01011 주소는 POP을 두 번 실행하여 ESP 레지스터에서 (32bit OS 기준) 0x08 만큼을 Subtraction 한 후, return 한다. 이 후, Next SEH로 잡혀 있는 0x00B4B354 주소로 이동하여 해당 영역의 코드를 실행하는데 0x00B4B354 영역에는 Encoding 된 shellcode를 Decoding 하여 수행하는 코드가 존재한다.
참고로 0x14F01011 주소에 대해 정리하면 해당 주소는 aacPlusDecoder.w5s라는 Winamp의 시스템 파일에 맵핑되는 주소로, Winamp에 종속성을 가지는 주소라는 점을 기억해야 한다.
aacPlusDecoder.w5s 파일의 0x14F01011 에 해당하는 코드 영역은 static 하게 정의되어 있고, 이러한 내용은 Winamp가 설치되어 있는 모든 환경에서 동일한 코드 영역의 주소로 동일한 코드의 실행을 보장한다는 것을 의미한다. 따라서 위 코드를 이용하여 코드의 흐름을 변경하고, shellcode를 실행 할 수 있다는 것은 exploit 주석 문에도 쓰여진 것처럼 플랫폼 및 Service Pack, Language Pack 등에 구애 받지 않고 Universal 하게 shellcode를 실행 할 수 있다는 것을 증명할 수 있다.
다음 그림은 위 취약점을 공격하고 공개되어 있는 Reverse Shellcode를 이용하여 Connect-Back을 수행 한 화면이다.
[그림 7] 취약점으로 공격당한 PC의 관리권한을 Connect-Back으로 연결 한 화면
2. 위험 분석
현재 공개된 exploit은 Universal shellcode의 실행을 가능하게 하기 때문에 플랫폼 등의 환경에 관계없이 취약점에 노출될 경우 공격의 실패 가능성이 없으며 공격자의 의지대로 권한을 빼앗기거나 기밀자료가 유출될 수 있는 가능성이 높다.
III. 대응 방안
1. 보안 대책
가. 공식 패치
본 취약점과 관련하여 현재 winamp 공식 홈페이지에서 배포되고 있으며, 패치된 버전은 5.551 버전이다.
Winamp 공식 홈페이지 : http://www.winamp.com