우리나라 주요 공공기관과 기업 등 국내 많은 사용자가 이용하는 '한글과컴퓨터'의 한글 워드프로세서를 대상으로 하는 악성 문서파일(*.HWP)이 꾸준히 제작 및 유포되고 있다. 안랩 분석팀은 2016년부터 2018년 말 현재까지 접수되었던 악성 한글 파일의 상당수가 EPS를 이용하여 악성 기능을 수행한 것을 확인하였다. 


여기에서 EPS(Encapsulated PostScript) 파일이란 일종의 그래픽 파일 형식으로서, 어도비(Adobe)에서 만든 포스트스크립트(PostScript) 프로그래밍 언어를 이용하여 그래픽 이미지를 표현하는 파일이다. EPS를 통해 종 고화질 벡터 이미지를 표현할 수 있어 한글 프로그램에서는 문서에 EPS 이미지를 포함하거나 볼 수 있는 기능을 제공하였다. 그러나 이러한 EPS 파일을 악의적으로 만들어서 한글 문서에 포함하게 되면 문서 파일 실행 시 악성 기능이 실행되는 문제점이 있다. 또한 EPS 파일을 이용한 한글 문서 악성 파일은 일반적인 트로이목마나 랜섬웨어처럼 불특정 다수를 대상으로 공격하는 것보다 정부나 학교 등 공공기관, 금융 관련 기업, 주요 민간 인사 등을 대상으로 타겟형 공격을 하는 유형이 더 많기 때문에 민감 정보 유출 가능성 및 피해 규모가 더 크다. 


2017년 초 한글과컴퓨터에서는 EPS 파일 처리 과정에서 악성코드가 실행되는 문제를 막기 위한 보안 업데이트를 이미 제공하였다. 이를 통해 최신 업데이트가 적용된 한글 프로그램은 EPS를 이용한 악성 한글 파일이 동작하지 않는다. 따라서 한글 프로그램을 이용하는 사용자라면 보안 업데이트를 필수적으로 하기를 강력히 권고한다. 본 글에서는 EPS 파일을 이용한 악성 한글 HWP 문서의 동작 방식을 설명하고 이를 막기 위한 사용자의 보안 조치 가이드를 안내한다. 




< 2017년 2월 23일 한컴오피스 보안 공지사항 >


  • 2017년 2월 이후 업데이트가 되어 있지 않은 한글 프로그램은 반드시 최신 업데이트를 해야 합니다. 
  • 상세한 업데이트 방법은 한글과컴퓨터 홈페이지 공지사항을 참고 바랍니다. 
  • 업데이트 이후에는 한글 프로그램 설치 경로에 *.EPS 또는 *.PS 확장자의 파일 처리를 위한 인터프리터 프로그램이 삭제됩니다. (하단 참고)


EPS 파일을 이용한 악성 한글 문서는 한글 프로그램 자체가 문제가 되는 것이 아니고, EPS 파일을 읽고 처리하는 과정에서 실행되는 하위 프로세스에서 악성 행위가 발생한다. HWP 한글 문서에 삽입된 EPS 이미지 파일은 한글 파일의 복합 파일(Compound File) 구조 상 BinData 스토리지에 zlib 으로 압축되어 *.EPS 또는 *.PS 로 존재한다. 그리고 EPS 파일은 포스트스크립트(PostScript) 코드로 만들어졌기 때문에 이를 실행하기 위해서는 별도의 인터프리터가 필요한데 한글 프로그램은 이를 위해 고스트스크립트(GhostScript) 인터프리터를 한글 프로그램 설치 경로에 포함하고 있다. 


> dir "<한글프로그램설치경로>\Bin\ImgFilters\GS"

  • gbb.exe - 한글과컴퓨터 제공 포스트스크립트 인터프리터, gsdll32.dll 로드해서 동작
  • gsdll32.dll - 고스트스크립트 인터프리터 핵심 라이브러리
  • gswin32.exe - 고스트스크립트 인터프리터 GUI 버전, gsdll32.dll 로드해서 동작
  • gswin32c.exe - 고스트스크립트 인터프리터 커맨드 버전, gsdll32.dll 로드해서 동작

EPS 파일을 포함한 한글 문서가 이미지를 로드할 때 한글 OLE 구조상 BinData 폴더(스토리지)에 있는 EPS 파일(스트림)은 임시 파일로 생성된다. 한글 프로세스는 생성된 임시 파일을 인터프리터가 전달받아 처리하도록 gbb.exe 프로세스와 gswin32c.exe 프로세스에 임시 파일 경로를 인자로 전달하여 실행한다. 따라서 프로세스 트리는 Hwp.exe 프로세스 실행 후 Child Process로 gbb.exe 프로세스와 gswin32c.exe 프로세스가 실행되는 구조를 보인다. 


악성 EPS 파일은 실행 방식 및 기능에 따라 아래와 같은 두 가지 유형으로 나뉜다. EPS를 이용한 악성 한글 파일이 처음 등장한 2016년부터 두 가지 유형은 계속 등장하였는데, 시그니처 기반의 파일 탐지가 어려운 취약점 유형이 비교적 많은 추세였다가 현재는 드로퍼 유형이 좀 더 고도화되어 다시 많아지고 있다. 


[1] EPS 취약점 익스플로잇으로 쉘코드 실행


EPS 파일 뷰어 또는 인터프리터 취약점을 익스플로잇하여 쉘코드를 실행하는 유형으로 취약점별로 그 구분이 나뉘지만, 올해 발견된 등장하는 EPS 취약점 유형은 CVE-2017-8291이 대부분이었다. CVE-2017-8291는 고스트스크립트 취약점으로 9.21 버전 이하에 동작하는데, 한글 프로그램에 포함된 고스트스크립트는 버전이 8.6 또는 8.71 로 취약 버전에 해당된다. 


스트링 패턴 기반 탐지를 우회하기 위해 포스트스크립트 코드는 보통 인코딩되어 있다. 디코딩해서 보면 메모리에서 쉘코드를 실행하기 위해 의도적으로 비정상적인 코드 구성을 한 것을 볼 수 있다. 포스트스크립트는 스택 기반의 프로그래밍 언어로서 메모리 주소에 값을 저장하고 스택을 참조해서 값을 가져오기 때문에 쉘코드 HEX 스트링을 저장한 변수를 필수적으로 포함한다. 



참고로 EPS 파일의 로드시 익스플로잇 과정을 상세히 보기 위해서는 EPS 인터프리터인 gbb.exe 또는 gswin32c.exe 프로세스를 디버깅한다. 아래는 레지스터 값을 변경하는 스택 피벗(Stack Pivoting)부분으로 위 포스트스크립트에서도 이 코드를 구현한 것을 확인할 수 있다. ESP 레지스터를 변경한 다음 RETN 을 통해 실행 흐름이 변경되고 ROP로 VirtualProtect 함수를 구성하여 쉘코드를 실행할 메모리를 재정의한다. 이 때 VirtualProtect가 호출되는 스택 구조를 보면 (1) 특정 메모리 영역(쉘코드 부분)에 0x40 실행 권한을 주고 (2) 함수 RETN 이후 의도한 쉘코드(0x13D580C)로 분기하는 부분을 확인할 수 있다. 이 쉘코드는 위에서 언급한 대로 HEX 스트링 형태로 포스트스크립트에 변수로 선언되어 있다.


[2] 정상적인 문법 패턴을 이용해 악성 파일 생성


위에서 설명한 EPS 유형은 포스트스크립트의 문법적 또는 인터프리터의 실행 과정상 결함을 이용한 것이지만, 악성 파일을 생성하는 유형은 정상적인 포스트스크립트의 실행 결과이다. 파일 객체를 생성하고 접근할 수 있는 특성을 이용하여 readhexstring, writefile 등의 명령어를 이용하여 로컬에 파일을 생성한다. 메모리에서 쉘코드를 실행하는 방식이 아닌 파일을 드롭하는 것이기 때문에 백신 제품에서 탐지될 가능성이 높으며 이 때문에 단일 파일 생성이 아닌 여러 개의 파일을 생성 및 조합하여 최종 악성 실행 파일을 생성하는 것이 최근 동작 방식이다. 




한글 프로그램의 최신 보안 업데이트 이후에는 위에서 언급한 "<한글프로그램설치경로>\Bin\ImgFilters\GS" 디렉토리 자체가 삭제된다. 이 디렉토리가 있는 시스템은 반드시 업데이트를 해야 한다. 


보안 업데이트 전

보안 업데이트 후




Posted by 분석팀