지난 2015 5 12일 한글 프로그램 최신 패치버전에서 동작하는 제로데이 취약점 파일이 접수되어 사용자의 각별한 주의가 요구된다.

취약점이 발생하는 프로그램은 한글2007, 2010, 2014 버전이 모두 해당되며 2015 3 31일 업데이트 된 최신 패치가 적용된 상태에서도 동작하도록 제작되었다. 취약점 발생 이후에는 다운로더 기능의 악성파일을 생성하며 주기적으로 특정 사이트로 접속을 시도한다.

V3 에서는 취약점 한글 파일을 "HWP/Exploit"(V3: 2015.05.12.02) 으로, 취약점 발생 이후 생성하는 악성파일을 "Win-Trojan/Hwdoor.107620"(V3: 2015.05.12.02) 로 진단한다.

취약점 피해를 예방하기 위해 아래의 한글과컴퓨터에서 제공한 2015.05.21 일자 보안 업데이트를 다운로드 받아 설치하거나, 자동 업데이트를 통해 한글 최신버전으로 업데이트하는 작업이 필요하다.

-       http://www.hancom.com/downLoad.downPU.do?mcd=001

 

취약점 발생원인은 한글의 본문에 해당하는 'HWPTAG_PARA_TEXT' 레코드에 사용된 확장 컨트롤(0x03) 조작을 통해 공격자가 설정한 주소로 분기를 통해 발생하며, 아래의 [그림-1]은 취약점 한글문서의 Section별 구조를 나타낸다.

[그림-1] 취약점 파일의 섹션구조

취약점 한글파일은 [그림-1]과 같이 총 15개의 섹션을 갖고 있으며, "Section0"는 정상적인 문자열 정보와 취약점을 발생 시키는 'HWPTAG_PARA_TEXT' 레코드가 존재한다. "Section1~Section14"의 경우, 모두 동일한 데이터를 갖고 있으며, "Heap Spray + ShellCode" 삽입을 위한 'HWPTAG_PARA_TEXT' 레코드가 존재한다.

   본 취약점은 [그림-2]와 같이 "Section0" 본문 내 특정 아랍어 문자를 처리하는 과정에서 발생하였으며, 0x988 오프셋의 "0x0634"는 유니코드(Unicode) 에서 해당 아랍어 범위에 해당된다.

[그림-2] 파일 내 취약점 발생영역

한글은 문서 내 문자열이 유니코드 (Unicode) 형태로 구성되며 한 글자당 2바이트 크기를 갖는다. 따라서 'HWPTAG_PARA_TEXT' 버퍼 내에서 특정 문자열이 참조되는 위치는 (문자열개수 * 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바이트 가상주소 값을 갖는다.

[그림-5] 제어문자 컨트롤 형식

[그림-6]과 같이 제어문자 "03" 레코드에서 참조하는 가상주소 항목에 "0x0D0C0D0C" 값 이 설정되어 있으며 해당 주소번지의 4바이트 값을 쉘코드 분기에 사용한다. 정상 한글파일의 경우 Extended형 레코드의 가상주소 영역은 NULL로 초기화되어 있으며 한글 실행 후 자동으로 주소 값이 설정되는 구조이다.

[그림-6] 취약점 발생구간

[그림-7]과 같이 "0x0D0C0D0C" 주소의 메모리에는 "Section1~Section14" 에 의해 채워진 SledCode가 존재하며, "0x0D0C0D0C" 주소에 저장된 "0x0B0C0B04" 주소로 분기가 발생한다

[그림-7] "03" 제어문자 레코드의 가상주소 조합 부분

[그림-8] 가상주소에서 참조하는 "0x0D0C0D0C" 주소번지

[그림-9]와 같이 공격자가 설정한 주소로 분기하기 위해 "CALL EAX" 명령어를 수행한다.

[그림-9] "0x0B0C0B04" SledCode 영역으로 분기하는 구간

"CALL EAX" 명령에 의해 분기한 "0x0B0C0B04" 메모리 영역에는 [그림-10]과 같이 HeapSpray SledCode가 존재하며 NOP 명령을 수행하다가 유효 쉘코드를 실행한다.

 

[그림-10] "0x0B0C0B04" 메모리 이후 유효 쉘코드

취약점 발생 이후  %Temp% 경로에 "smss.exe" 파일을 생성하며, 해당 악성코드는 다운로드 기능을 수행한다. ("smss.exe" 파일은 V3에서 "Win-Trojan/Hwdoor.107620" 로 진단)

[그림-11] 악성파일 생성

생성된 "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) 명을 통해 생성되며, 분석당시 실제로 파일이 다운로드되지는 않음 - 특정 호스트에서는 실제 파일 다운로드가 이루어졌을 것으로 추정 됨)

다운로드가 성공 시 해당 파일을 디코딩하여 [그림-12]와 같이 %AppData% 폴더에 "wuaudt.exe" 파일로 생성 및 실행한다.

[그림-12] 다운로드 파일 "wuaudt.exe"

 

악성코드 감염을 막기 위해서는 항상 한글 프로그램 및 백신 프로그램을 최신 업데이트 상태로 유지하는 것이 필요하다. 또한, 취약점 한글 문서파일은 특정인에게 이메일의 첨부파일 형태로 유포된 것으로 확인되었으므로 불명확한 발신인 혹은 확인되지 않은 첨부파일의 경우, 실행 전에 보안에 문제가 없는지 확인하는 과정이 필요하다.

 

 

Creative Commons License
Creative Commons License
Posted by a0_zest