[Hot Issue] ‘최신 패치 버전’에서 동작하는 한글 제로데이 악성코드
한글 제로데이 취약점
최근 한글 프로그램의 최신 패치 버전에서 동작하는 제로데이 악성코드가 발견되어 사용자들의 각별한 주의가 요구된다. 이 악성코드는 지난 2015년 3월 31일 배포된 최신 업데이트 패치가 적용된 상태에서도 동작하도록 제작되어 충격을 주고 있다. 이번에 발견된 악성코드는 이메일 첨부문서 파일 형태로 유포됐으며, 해당 취약점이 발생하는 버전은 한글 2007, 2010, 2014이다.
안랩은 이번 취약점과 이를 악용하는 악성코드를 최초로 발견하였으며, 발견 즉시 V3 제품군 엔진을 업데이트하고 한글과컴퓨터 및 유관 기관에 취약점 분석 정보를 공유했다. 한글과컴퓨터는 지난 5월 21일, 관련 취약점을 개선한 보안패치를 배포했다. 피해를 예방하기 위해서는 해당 보안 업데이트(2015.05.21)를 다운로드하여 설치하거나 자동 업데이트 기능을 이용해 최신 버전으로 업데이트해야 한다.
지난 5월 12일, 한글 프로그램의 알려지지 않은 ‘제로데이 취약점’을 악용한 악성코드가 유포됐다. 이 악성코드는 당시 최신 버전의 한글 프로그램(2015년 3월 31일 업데이트 버전)이 설치된 환경에서도 사용자가 이메일에 첨부된 악성 한글 문서파일을 실행하면 사용자 몰래 PC에 설치되어 다운로더 기능을 가진 악성 파일을 생성하며 주기적으로 특정 웹사이트로 접속을 시도한다. 최신 제로데이 한글 취약점을 이용한 악성코드의 구조 및 동작 방식을 자세히 살펴보자.
최신 한글 취약점 상세 분석
해당 취약점은 공격자가 한글 파일의 'HWPTAG_PARA_TEXT' 레코드에 사용된 확장 컨트롤(0x03)을 조작해 임의로 설정해둔 주소로 분기하게 함으로써 발생한다. [그림 1]은 해당 한글 문서 파일의 섹션별 구조이다.
해당 한글 파일의 15개 섹션 중 "Section0"에는 정상적인 문자열 정보와 취약점을 발생시키는 'HWPTAG_PARA_TEXT' 레코드가 존재한다. 마찬가지로 "Section1~Section14"도 "Heap Spray + ShellCode" 삽입을 위한 'HWPTAG_PARA_TEXT' 레코드를 갖고 있다.
해당 취약점은 [그림 2]와 같이 "Section0" 본문 내의 특정 아랍어 문자를 처리하는 과정에서 발생하였다. 해당 아랍어의 범위는 유니코드(Unicode)로 0x988 오프셋의 0x0634에 해당된다.
한글 파일은 문서 내 문자열이 유니코드 형태로 구성되며, 한 글자당 2바이트 크기를 갖는다. 따라서 'HWPTAG_PARA_TEXT' 버퍼 내에서 특정 문자열이 참조되는 위치는 ‘문자열 개수 x 2‘ 오프셋에 해당하며, 취약점은 [그림 3]과 같이 문단 내 'HWPTAG_PARA_TEXT' 버퍼의 0xCF번 째 문자열을 참조하는 과정(0xCF * 2 = 0x19E 오프셋 영역)에서 발생한다.
[그림 3] 취약점이 발생하는 버퍼 내 오프셋 구간
[그림 4]는 'HWPTAG_PARA_TEXT' 버퍼 내 0x19E 오프셋 영역에 해당하며, "03" 제어문자 레코드의 시작으로 인식되지만 정상적인 구조에서는 레코드의 시작으로 인식되지 않는 영역이다. 이 악성 한글 파일의 경우, 해당 구간을 레코드로 인식하도록 하기 위해 0xCF 값을 버퍼 내의 오프셋 참조 번지로 사용하였다.
[그림 4] 'HWPTAG_PARA_TEXT' 버퍼 내 0x19E 오프셋 영역
문서 본문 내 'HWPTAG_PARA_TEXT' 레코드에서 "03" 제어문자는 [그림 5]와 같이 익스텐디드(extended) 컨트롤 형식으로 구성되며, 레코드 버퍼의 시작부터 6바이트 건너뛴 위치에 4바이트의 가상주소 값을 갖는다.
[표 1] 제어문자별 컨트롤 형식
[그림 5]와 같이 제어문자 “03” 레코드에서 참조하는 가상주소 항목에 "0x0D0C0D0C" 값이 설정되어 있으며 해당 주소의 4바이트 값을 셸코드 분기에 사용한다. 정상적인 한글 파일의 경우 익스텐디드(extended)형 레코드의 가상주소 영역은 NULL로 초기화되어 있으며, 한글 실행 후 자동으로 주소 값이 설정된다.
[그림 5] 취약점 발생 구간
[그림 6]과 같이 "0x0D0C0D0C" 주소의 메모리에는 "Section1~Section14"에 의해 채워진 SledCode(No-Operation Code)가 존재하며, "0x0D0C0D0C" 주소에 저장된 "0x0B0C0B04" 주소로 분기가 발생한다.
[그림 6] 제어문자 "03" 레코드의 가상주소 조합 부분
[그림 7] 가상주소에서 참조하는 "0x0D0C0D0C" 주소
[그림 8]과 같이 공격자가 설정한 주소로 분기하기 위해 "CALL EAX" 명령어를 수행한다.
"CALL EAX" 명령에 의해 분기한 "0x0B0C0B04" 메모리 영역에는 [그림 9]와 같이 힙스프레이(HeapSpray)된 SledCode가 존재하며 NOP 명령을 수행하다가 유효 셸코드를 실행한다.
취약점 발생 이후 해당 악성코드는 %Temp% 경로에 smss.exe 파일을 생성하며 다운로드 기능을 수행한다. V3 제품군은 현재 이 smss.exe 파일을 ‘Win-Trojan/Hwdoor.107620’으로 진단하고 있다.
생성된 smss.exe 파일은 실행 시점에 따라 다음 2개의 URL 중 한 곳에서 다운로드를 시도한다. 이때 다운로드 받은 파일은 %AppData% 폴더에 "~D543F5E7FB16DDC62E.TMP" 이름으로 생성된다.
http://www.n***rfun.net/img/img_[임의의숫자].jpg <목요일 실행시>
http://ig**et.com/img/img_[임의의숫자].jpg <그 외 실행시>
이때 “/img_[임의의숫자].jpg”는 감염 시스템의 호스트(host) 명을 통해 생성된다. 분석 당시에는 실제로 파일이 다운로드되지는 않았으나 특정 호스트에서는 실제로 파일 다운로드가 이루어졌을 것으로 추정된다.
다운로드 성공 시 해당 파일을 디코딩하여 [그림 11]과 같이 %AppData% 폴더에 wuaudt.exe라는 파일로 생성 및 실행한다.
[그림 11] 다운로드 파일 wuaudt.exe
V3로 진단… 최신 한글 보안 패치 적용 필요
이번 한글 파일 취약점과 이를 악용한 악성코드를 최초로 발견한 안랩은 즉시 V3 제품군에 해당 악성코드에 대한 시그니처를 업데이트했다. V3 제품군은 악성 한글 파일과 이후 생성되는 악성 파일을 각각 "HWP/Exploit"(V3: 2015.05.12.02), "Win-Trojan/Hwdoor.107620"(V3: 2015.05.12.02)으로 진단하고 있다. 또한 현재 한글과컴퓨터는 홈페이지를 통해 관련 보안 패치를 제공하고 있다(http://www.hancom.com/downLoad.downPU.do?mcd=001).
향후에도 해당 취약점을 이용한 다양한 악성코드가 나타날 수 있기 때문에 피해를 방지하기 위해서는 해당 보안 패치를 적용하고 V3 등 백신의 업데이트 및 실시간 감시 기능 사용이 반드시 필요하다. 또한 이번 악성 한글 문서파일과 같이 이메일의 첨부 파일 형태로 유포되는 악성코드에 감염되지 않기 위해서는 발신인이 불명확한 경우 첨부 파일을 실행하기 전에 백신 등을 이용해 문제가 없는지 확인하는 습관이 필요하다.@
- AhnLab분석팀 김아영 선임연구원