지난 포스팅에서는 문서형 악성코드 전반에 대한 개념과 동향에 대해 알아보았고, 이번 포스팅에서는 다양한 형태의 문서형 악성코드 중 국내에서 가장 많이 사용되고 있는 한글 문서를 이용한 악성코드에 대해 살펴보려 합니다. 한글 문서(HWP)는 국내 정부 기관 및 기업 그리고 일반 사용자들도 많이 사용하는 전자 문서 형태의 하나입니다. 이러한 이유로 인해 정상적인 한글 문서로 위장한 악성코드는 주로 국내에서 발견되고, 공격 대상이 불특정 다수가 아닌 정부 및 공공기관, 학교, 금융 등 주요시설과 중요 데이터를 보유한 조직을 노리는 특징이 있으며, 이로 인해 공격이 성공할 경우 불특정 다수보다 사회적 이슈 및 파급력이 더 클 수밖에 없습니다.
다른 문서형 악성코드에 비해 다소 늦게 출현한 한글 문서형 악성코드는 2010년 이후 본격화되었고, 공격 형태는 타 문서형 악성코드와 마찬가지로 당시 사회적 이슈를 매개체로 이용하는데, 특히 한글 문서형 악성코드는 정부 및 공공기관 등 국가 중요 기반 시설을 담당하는 조직을 주요 공격 대상으로 하기 때문에 대북 관계와 관련한 사회적 이슈 또는 일반인이 관심을 갖을만한 문서의 제목 및 내용으로 위장하고 이메일에 첨부되어 유포되고 있습니다. 이러한 공격 형태는 공격 기술의 변화에 따라 달라지는데, 이전의 문서형 악성코드 유포 방법으로 자주 사용되던 공격 방식은 실행 파일인 PE(Portable Executable) 파일을 바이너리 형태로 전자 문서 파일에 직접 삽입하는 방식이었으나, 최근에는 문서 파일의 자체적인 정상 기능 및 취약점을 이용하여 공격하는 방식으로 변화하는 추세를 보이고 있습니다. 이러한 변화는 기존 공격 방법보다 백신 프로그램이 놓치기 쉽다는 문제를 야기합니다. 또한 한글 워드프로세서 응용 프로그램을 통해 실행되는 한글 문서형 악성코드는 실행 파일 자체가 아니기 때문에 백신 프로그램의 탐지 정책을 쉽게 우회할 수 있는 특징이 있습니다. 따라서 한글 문서형 악성코드 탐지는 일반적인 악성코드를 탐지하는 실행 파일 탐지 방식 및 분석 방법과는 달리 한글 전자 문서를 분해하고 악성 인자를 추출하는 것이 선행되어야 합니다.
한글 문서 포맷
한글 문서는 크게 스토리지(Storage)와 스트림(Stream)으로 구성된 복합 파일(Compound) 구조로 구성됩니다. 이 복합 파일 구조를 우리가 사용하는 운영체제의 파일 시스템 형태로 생각하면 쉽게 이해가 갈텐데, 스토리지는 폴더로, 스트림은 파일 개념과 유사하며, 하나의 스트림에는 바이너리 및 데이터가 저장되는 형태를 가지고 있습니다.
한글 포맷은 Root Entry(파일 내에 존재하는 모든 스트림 및 스토리지를 포함하는 최상위 폴더)를 참조하여 데이터를 얻고 각 스토리지의 특성에 따라 레코드 구조 여부나 압축 여부가 결정되며, 파일의 크기를 최소화하기 위해 zlib 라이브러리를 사용하여 압축합니다. FileHeader 스트림에는 한글 문서 파일임을 증명하기 위해 파일 인식 정보가 저장되고, DocInfo 스트림에는 문서에 사용되는 글꼴, 글자 및 문단 속성, 탭 등이 저장됩니다. DocOptions 스트림에는 연결 문서, 배포용 문서, 전사 서명 관련 정보들이, DocHistory 스트림에는 문서 이력 정보 데이터들이 저장됩니다. 미리보기 텍스트인 PrvText 스트림에는 텍스트가 유니코드 문자열로 저장되고, 미리보기 이미지인 PrvImage 스트림에는 이미지들이 BMP 및 GIF 형식으로 저장되는 포맷을 사용합니다. 보다 자세한 스토리지 및 스트림 정보는 [표 1]과 같습니다.
설명 | 세부정보 | 압축/암호화 |
FileHeader (파일 인식 정보) |
한글 문서 파일 증명 | |
DocInfo (문서 정보) |
문서 내 공통으로 사용되는 정보 | √ |
BodyText (본문) |
HWPTAG_PARA_TEXT(문단 텍스트) 태그에 비정상적인 값 삽입 가능 (배포용 문서의 경우 ViewText 사용) |
√ |
HwpSummaryInformation (문서 요약) |
문서의 제목, 작성자, 날짜 정보 확인 가능 | |
BinData (바이너리 데이터) |
비정상적인 스트림 확인 가능 (포스트스크립트 & OLE) |
√ |
PrvText (미리보기 텍스트) |
문서 본문 내용 확인 가능 | |
PrvImage (미리보기 이미지) |
BMP & GIF 포맷 형식으로 이미지 저장 | |
DocOptions (문서 옵션) |
연결 문서, DRM, 전자 서명 등의 정보 저장 | |
Scripts (스크립트) |
비정상적인 자바스크립트 확인 가능 | |
XML Template (XML 템플릿) |
문서의 XML 템플릿 정보 저장 | |
DocHistory (문서 이력 관리) |
문서의 이력정보 저장 | √ |
나를 숨겨줘~~! (한글 문서의 악성 스토리지)
한글 문서는 자바스크립트를 사용한 매크로 작성 및 편집, 파일 삽입 및 보기, 객체 연결 삽입, 배포용 문서와 같이 다양한 기능을 제공하는데 공격자는 이 기능들을 악용하여 공격을 시도합니다. 이 기능들을 악용하여 악성 행위를 하는 한글 문서형 악성코드를 탐지하고 분석하기 위해서는 한글 문서의 어떤 스토리지에 악성코드 및 악성 스크립트 등이 삽입될 수 있는지에 대한 식별이 필요합니다.
설명 | 구별 이름 | |
바이너리 데이터 (BinData) |
BinData – BinaryData0 – BinaryData1 – … |
|
스크립트 (Scripts) |
Scripts – JScriptVersion – DefaultJScript – … |
|
본문 (BodyText) |
BodyText – Section0 – Section1 – … |
한글 문서에는 [표 2]에 나와 있듯이 총 세 개의 스토리지에 악성코드 및 악성 스크립트가 삽입될 수 있습니다. 첫 번째로 살펴볼 스토리지는 바이너리 데이터들이 저장되는 ‘BinData’입니다. BinData 스토리지 하위에는 EPS(Encapsulated PostScript) 파일 및 OLE(Object Linking and Embedding) 개체들이 저장되는 곳입니다. 이 BinData에 저장된 스트림에서 비정상적인(악의적인) 스트림을 확인할 수 있으며, 스트림 형태는 삽입한 악성 EPS 및 OLE 스트림의 사이즈를 줄이기 위해 zlib으로 압축하여 *.EPS, *.PS, *.OLE 형식으로 존재하게 됩니다.
두 번째로 살펴볼 스토리지는 ‘Scripts’입니다. 한글 문서는 매크로 작성 및 편집 언어로 자바스크립트 언어를 사용하는데 Scripts 스토리지에는 스크립트 코드인 JScriptVersion와 DefaultJScript들이 저장됩니다. JScriptVersion 스트림에는 스크립트 버전이 DefaultJScript 스트림에는 스크립트 헤더, 소스, Pre 소스, Post 소스가 저장됩니다. 두 개의 스트림은 압축 및 암호화를 모두 지원하지 않으며, ‘Scripts’ 스토리지에는 비정상적인 자바스크립트 코드가 삽입될 수 있어 자바스크립트를 이용하여 악성 행위를 수행합니다.
마지막으로는 문서 본문에서 사용되는 문단, 표, 그리기 개체 등의 내용들이 저장되는 ‘BodyText’ 스토리지입니다. BodyText 스토리지는 본문의 구역에 따라 [표 2]와 같이 ‘Section[숫자]’로 구분되며 숫자는 각 구역의 번호를 의미합니다. BodyText 스토리지 내 문단 텍스트를 의미하는 HWPTAG_PARA_TEXT 태그에 비정상적인 값이 삽입될 수 있으며, 이를 통해 실제 악의적인 행위를 수행하는 쉘코드가 삽입된 것으로 판단합니다. 공격자는 악성 행위를 수행하는 스크립트 및 쉘코드 등이 노출되지 않게끔 XOR 인코딩, 더미 코드 삽입 등을 통해 난독화하여 탐지 및 분석을 어렵게 하는 우회 공격 기술을 사용합니다.
나의 숨바꼭질 형태는? (한글 문서의 스토리지를 악용한 공격 방법)
앞서 한글 전자 문서 포맷과 악성 행위를 식별할 수 있는 스토리지들에 대해 살펴보았고, 지금부터는 식별된 스토리지를 바탕으로 어떻게 악성코드(악성 스크립트)가 저장되며, 활동(공격 방법)하는지에 대해 알아보도록 하겠습니다.
① 매크로(JavaScript)
한글 문서는 자바스크립트를 사용하여 매크로를 작성하거나 편집하는데, 매크로 기능은 반복적인 작업에서 사용자가 편의를 위해 키보드 및 마우스 동작을 특정 단축키에 기록하여 사용합니다. 이러한 매크로 기능을 이용한 [그림 1]은 한글 문서에 포함된 매크로 코드로 BASE64로 인코딩되어 있으며, 매크로 스크립트가 실행되면 BASE64 디코딩을 통해 파워쉘을 실행하여 악성 행위를 수행하도록 작성된 코드입니다. 매크로를 악용한 공격 방식은 [그림 1]과 같이 다른 악성코드를 다운로드 받을 수 있는 웹 주소에 연결되거나 또는 실제로 사용자 PC에 감염시킬 실행 파일 등을 매크로 코드 내에 임베디드 되어 동작하게 됩니다. 매크로를 이용한 공격은 한글 전자 문서의 정상 기능을 악용한 방식이며, 과거에 자주 사용하던 공격 방식으로 최근에는 자주 사용되고 있지 않는 특징이 있습니다.

② 포스트스크립트(PostScript)
한글 문서에서는 각종 고화질 벡터 이미지를 표현할 수 있는 EPS 파일을 삽입하거나 볼 수 있는 기능을 제공합니다. EPS 파일은 어도비(Adobe)에서 만든 포스트스크립트(PostScript) 언어를 사용하여 그래픽 이미지를 표현한 파일로 사용자 눈에 보이지 않을 정도의 아주 작은 크기로 삽입되어 존재합니다. 문서에 삽입된 EPS 파일을 이용하여 화면에 이미지를 표현하기 위해서 한글 문서는 ‘고스트스크립트(Ghostscript)’ 라는 인터프리터를 사용하게 됩니다. 고스트스크립트는 한글 프로그램 설치 시 한글 프로그램 경로에 함께 포함되어 설치됩니다. 고스트스크립트에 의해 EPS 파일이 처리되는 과정에서 고스트스크립트의 취약점(8.6 또는 8.71이 취약 버전)으로 인해 악성코드가 실행되게 됩니다. 이러한 문제로 2017년 2월 한글과컴퓨터사에서는 EPS 파일 처리 과정에서 실행되는 악성코드 문제점을 해결하기 위해 보안 패치를 제공했으며, 최신 업데이트가 완료된 한글 워드프로세서에서는 더이상 EPS를 이용한 악성행위가 발생하지 않습니다. 그럼에도 불구하고 아직까지 업데이트를 하지 않고 사용하는 사용자가 많이 존재하기 때문에 공격자는 지속적으로 고스트스크립트를 이용하여 한글 문서형 악성코드를 제작하여 배포하고 있습니다.

③ 객체 연결 삽입(OLE)
객체 연결 삽입(OLE, Object Linking Embedding)이란 마이크로 소프트사에서 개발한 기술로 문서와 외부 개체에 대한 연결과 삽입을 도와주는 연결규약을 말합니다. 한글 문서에서는 ‘자료 연결’ 기능으로 제공되는데 자료 연결이 가능한 대상은 한글 문서, 웹 주소, 전자 우편 주소, 외부 어플리케이션이 있습니다. OLE 개체는 문서 전체 영역 및 아주 작은 크기로 설정(투명하게)되는 특징 때문에 사용자가 문서를 편집하기 위해 이 정상을 가장한 OLE 이미지 파일 묶음 개체를 클릭하면 악성코드 및 악성스크립트가 실행됩니다. 이렇게 OLE 개체 특성상 식별이 매우 어렵고, 문서 형태에서 별다른 특이점이 눈에 나타나지 않기 때문에 공격 방법에 있어 공격자가 매우 선호하는 방법입니다. 객체 연결 삽입을 악용한 샘플인 [그림 4]같은 경우 OLE 개체에 포함되어 있는 악성 스크립트를 임시 디렉토리(%temp%)에 생성하여 하이퍼링크로 연결되어 있습니다. 생성된 vbs 파일은 자동으로 실행되지는 않지만 자료 연결이 되어 있는 본문을 사용자가 클릭하는 경우 생성된 vbs 파일이 실행되어 악성 행위를 수행합니다. OLE 개체는 한컴 오피스의 정상 기능으로 최신 버전의 한글 문서는 기본적으로 문서 열람시 연결 문서의 링크 실행을 방지하기 위해 보안 위험 안내 메시지를 출력하는 등의 한글 문서의 보안을 유지하고 있습니다만 부주의한 사용자에게는 여전히 매우 위험한 위험임에 틀림이 없습니다.

④ 배포용 문서
배포용 문서란 일반적인 한글 문서와 달리 수정 및 편집이 불가능하게 만든 읽기 전용 문서로 주로 공공기관에서 중요한 이슈를 안내할 때 사용하는 배포용 공문 형태를 말합니다. 공격자는 이러한 특징을 이용하여 마치 기관에서 작성한 문서인 것처럼 위장하여 한글 문서형 악성코드를 유포합니다. 일반 한글 전자 문서와는 다르게 배포용 문서는 [그림 5]처럼 ViewText 스토리지가 존재하고 스토리지 하위에 본문의 스트림을 암호화하며, 암복호화용 키 값이 포함되는 특징을 가지고 있습니다.

배포용 한글 전자 문서의 데이터를 복호화하는 방법도 일반 한글 전자 문서와는 다른 특징이 갖고 있습니다. 배포용 문서가 데이터를 복호화하는 방법은 ① 복호화과정에 필요한 Seed 찾기 ② 특정 패턴을 지닌 난수 배열 생성 ③ 해시코드 추출 ④ 해시코드로 복호화 순서로 구성됩니다. 위와 같은 방법으로 암호화된 본문 스트림을 복호화하고, zlib로 디컴프레스 과정을 거치면 본문 스트림의 내용을 확인할 수 있습니다. 배포용 문서에는 쉘코드가 임베디드되며, 복호화 과정을 거친 후 디컴프레스 과정을 거쳐 실제로 악성 행위를 하는 쉘코드가 동작하게 됩니다.
구분 | 일반 문서 | 배포용 문서 |
본문 스트림 | BodyText – Section0 – Section1 – … |
ViewText – Section0 – Section1 – … |
암호화 여부 | X | O |
나는 말이야~~~^^ (한글 문서형 악성코드의 최근 동향)
지금까지 한글 전자 문서를 대상으로 문서의 포맷 구조 및 악성 행위를 식별할 수 있는 스토리지와 각각의 스토리지들이 어떻게 공격에 이용되는지에 대해 살펴보았습니다. 공격자는 매크로, 포스트스크립트, 객체 연결 삽입, 배포용 문서 총 4가지의 방법을 사용하였으며, 매크로와 객체 연결 삽입은 한글 전자 문서의 정상 기능을 이용한 공격, 포스트스크립트와 배포용 문서는 한글 전자 문서의 취약점을 이용한 공격으로 [표 3]과 같이 분류할 수 있습니다.
분류 | 취약점 사용 유무 | |
매크로(JavaScript) | 정상 기능 | |
포스트스크립트(PostScript) | 취약점 – CVE-2015-2545 – CVE-2017-8291 |
|
객체 연결 삽입(OLE) | 정상 기능 | |
배포용 문서 | 취약점 |
최근 5년간 한글 문서형 악성코드를 이용한 주요 공격 방식은 [표 4]와 같으며, 공격자는 포스트스크립트(EPS)와 객체 연결 삽입(OLE)을 가장 많이 사용한 것으로 파악되었습니다. 또한 공격 시기에 사회적으로 이슈가될 만한 주제를 이용하여 파일 제목 및 내용으로 이용하는 것을 알 수 있습니다.
2017 | 2018 | 2019 | 2020 | 2021 | |
공격 방식 |
포스트스크립트(EPS) 객체 연결 삽입(OLE) |
||||
파일명 | ● 5170101_17년_북한_신년사_분석 ● 북한은 국제법상 국가인가 ● 입사지원서(곽정민) |
● PC 보안 점검표 및 매뉴얼 ● 미북 정상회담 전망 및 대비 ● 2018년도 국정감사계획서-수정(안) |
● KINU 전문가 자문 요청사항 ● 회장님 개명 ● 제안설명서 |
● 온라인 학술대회 한시적 지원 관련 Q&A ● 붙임 1_참가신청서 ● 북한의 회색지대 전략과 대응방안 |
● 신종_코로나바이러스_관련_소상공인_지원_종합안내 ● 질의서-12월-15일 |
글을 마치며
공격자들은 과거에 주로 문서 내 실행 파일을 삽입하거나 매크로 기능을 악용한 공격을 선호하였지만, 최근에는 한글 문서 파일의 자체적인 취약점 및 문서의 정상 기능을 악용하는 방식으로 공격이 다변화되고 있음을 알 수 있습니다. 또한 이번 포스팅에서 다룬 악성코드 숨김 및 공격 방법 이외에도 다양한 방법과 형태로 제작된 한글 문서형 악성코드가 존재할 수 있기 때문에 항시 최신 버전 한글 워드프로세서를 사용해야 하고, 출처가 불분명한 이메일에 첨부된 전자 문서 파일은 열람하지 않도록 각별히 유의해야 하겠습니다. 다음 포스팅에서는 한글 문서형 악성코드를 탐지하고 분석하는 방법에 대해 살펴보고자 하오니 많은 관심 부탁드립니다.
참고 문헌
[1]JEONG, Young-Seob, et al. “Malware Detection of Hangul Word Processor Files Using Spatial Pyramid Average Pooling.” Sensors, 2020.
[2]JEONG, Young-Seob; WOO, Jiyoung; KANG, Ah Reum. “Malware Detection on Byte Streams of Hangul Word Processor Files.” 2019.
[3]https://www.fsec.or.kr/user/bbs/fsec/163/344/bbsDataView/1139.do?page=1&column=&search=&searchSDate=&searchEDate=&bbsDataCategory=
[4]https://www.hancom.com/etc/hwpDownload.do
[5]https://blog.alyac.co.kr/3435
[6]https://blog.alyac.co.kr/3451
[7]https://rninche01.tistory.com/entry/HWP-%ED%95%9C%EA%B8%80-%EB%AC%B8%EC%84%9C%ED%98%95-%EC%95%85%EC%84%B1%EC%BD%94%EB%93%9C
[8]https://jeongzzang.com/165
[9]https://asec.ahnlab.com/ko/1181/
[10]https://www.ahnlab.com/kr/site/securityinfo/asec/asecView.do?seq=29342&tab=Scrap&groupCode=VNI001