최근 인기리에 종영된 ‘이상한 변호사 우영우’라는 드라마 속 한 장면에서 우영우 변호사의 골치를 아프게 한 해킹 사건이 등장하였습니다.
‘이상한 변호사 우영우’ 15화 에피소드에서 온라인 쇼핑몰 ‘라온’의 데이터베이스 관리자 PC가 해킹되어 약 4,000만명의 고객 개인정보가 유출되었는데, 이는 이메일에 첨부된 MS-OFFICE의 워드 문서 파일을 무심코 열어본 것이 사건의 발단이 되었습니다 [1].
드라마 속에서 쇼핑몰 라온의 보안담당자는 자신의 동생이 보낸것으로 보이는 이메일을 받게 되며, 보안담당자는 의심 없이 이메일에 첨부된 워드 문서를 열어보고 자신이 관리하고 있는 고객의 개인정보가 유출된 것을 알게 되자 회사의 대표에게 “스피어 피싱에 당한 것 같습니다.”라고 말하는 장면이 나옵니다.
‘피싱’이라는 키워드는 한 번쯤 들어봤을 수도 있겠지만, ‘스피어 피싱’이라는 말은 조금 생소할 수 있습니다. 불특정 다수의 개인정보를 유출하는 ‘피싱’과는 달리 특정인의 정보를 캐내기 위한 피싱 공격을 ‘스피어 피싱’이라고 부릅니다. 드라마 속에서 해커는 보안담당자 PC 내에 키로거를 설치해 키보드로 입력한 로그인 정보, 메신저 대화 등의 정보를 수집하게 되며, 지인의 메일을 해킹해 오랜 시간 글을 쓰는 패턴을 확인하거나, 지인의 이메일 주소와 비슷한 계정을 만들어 송부하는 방식인 스피어 피싱 공격 기법으로 고객의 개인정보를 탈취하였습니다.
실제로 최근의 사이버 위협은 드라마에서 사용된 것처럼 .doc를 비롯하여 pdf, hwp, xls 등의 전자 문서 파일을 활용하는 공격 기법이 증가하는 추세인데, 이러한 전자 문서 중 해커가 자주 사용하는 MS 워드형 악성코드를 탐지하기 위해서는 PE(Portable Executable)형 악성코드를 탐지하는 분석 방법과는 달리 영역을 식별하여 분석한 후 악성 인자를 찾아내는 것이 효과적입니다.
본 포스팅에서는 MS 워드 문서의 포맷 구조와 특징에 대해서 알아보고 MS 워드 문서형 악성코드가 어떻게 동작하는지 살펴보도록 하겠습니다.
– MS 워드의 문서 포맷 구조와 특징 –
MS 워드는 버전 별로 문서 구조가 다르기 때문에 각각 따로 영역을 분리하고 이를 구분하여 포맷을 정의해야 합니다. MS 워드의 구조는 크게 2가지로 나뉘게 됩니다. doc 확장자를 사용하는 MS 워드의 경우에는 OLE 파일 구조를 사용하며, docx 확장자는 OpenXML 형식으로 구성됩니다.
MS 워드의 OLE 파일 구조는 마이크로소프트의 자체적인 파일 형식으로 텍스트, 오디오, 동영상 등 서로 다른 데이터 형식을 포함할 수 있습니다. 이러한 파일 형식은 한 문서 파일에서 편집할 수 있는 환경을 제공하며 이러한 특성은 OLE(Object Linking Embedding)이라고 부릅니다.
OLE 구조는 FAT 파일 시스템과도 유사하며, 스토리지(Storage)와 스트림(Stream)의 계층 구조로 구성됩니다. 윈도우 OS를 예시로 들었을 때 스토리지는 디렉터리(폴더)에 해당하며, 스트림은 파일과 유사합니다. MS 워드 파일 구조는 [그림 1]과 같은 구조로 이루어져 있으며, 파일 헤더 정보, 문서 정보, 본문, 삽입 객체, 이미지 데이터, 문서 속성, 매크로 정보, 전자 서명 정보 등이 저장됩니다. OLE 포맷의 MS 워드 파일을 구성하기 위한 필수 구성 요소는 [그림 1]에서 빨간색으로 표신된 부분으로 표시된 WordDocument, 1Table/0Table, Data, DocumentSummaryInformation, CompObj와 같습니다.

[그림 1] OLE형식의 MS 워드 문서 구조
[표 1] OLE 형식의 MS 워드 문서 구조별 설명
필수 구성 요소 | 설명 |
WordDocument | WordDocument 스트림의 내용은 .doc 파일을 Word 문서로 식별하는 코드를 포함하고 있으며 본문의 내용 포함 |
1Table/0Table | WordDocument 스트림이 .doc 파일을 Word 문서로 식별하는 과정에서 오프셋에 존재하는 FIB 내에 base.fWhichtblStm이 1로 설정되어 있으면 1Table을 참조하고 그렇지 않으면 0Table을 참조 |
Data | Data 스트림에는 사전에 정의된 구조가 따로 존재하지 않으며 다른 구조에서 해당 스트림에 대한 참조가 없다면 크게 사용되지 않는 부분 |
CompObj | MS 워드 파일의 버전 정보 포함 예) .doc 형식의 MS 워드 일 경우 ‘Microsoft Word 97-2003 MSWordDoc Word.Document’ |
OpenXML 포맷의 MS 워드 문서는 문서별로 다양한 디렉터리 구조를 가질 수 있으며, 기본적으로 ZIP 압축 기술을 사용하여 문서를 작성하고 파일을 저장할 수 있습니다. ZIP 형태로 압축해제 및 영역 분리된 OpenXML 형식의 MS 워드 구조 및 설명은 [그림 2]와 같습니다.

[그림 2] OpenXML형식의 MS 워드 문서 구조
[표 2] OpenXML 형식의 MS 워드 문서 구조별 설명
OpenXML 파일 구성 요소 | 설명 |
Content_Types.xml | OpenXML 포맷 파일에 필수적으로 포함되는 이 파일은 특정 파일 확장명에 대한 기본값 제공 |
/_rels | 모든 패키지는 다른 파트들과 패키지 밖의 리소스들 사이의 관계를 정의 |
/doc/Props/core.xml | Office Open XML 문서의 메타데이터 등 핵심 속성이 포함 |
/word/documents.xml | 본문을 구성하는 텍스트와 이를 오피스 문서 내에서 표현하기 위한 각 본문 속성에 맞는 XML, Object 참조에 대한 내용을 담음 |
/word/embeddings/oleObject.bin | 다른 포맷의 파일을 삽입하여 참조하기 위해 포함되며, 다양한 형식의 raw binary 파일을 참조 |
/word/vbaProject.bin | vbaProject.bin은 내장된 프로그래밍 언어인 VBA로 작성된 스크립트로서 문서에 포함됨 |
MS 워드의 구조는 해커가 어떤 공격 기법을 사용하느냐에 따라 본문에 내용이 추가되거나, 새로운 구성 요소가 생성되는 등 구조가 변경되어 위협 인자가 포함되는 영역이 각각 다르게 생성됩니다. 이러한 특징 때문에 PE 구조의 exe 악성코드를 탐지할 수 있는 분석 방법과는 달리 버전별로 구분하여 영역을 분리하고 분리된 영역 내에서 위협 인자를 찾아낸 후 이를 추출하는 과정이 필요합니다.
약 450개 MS 워드 문서형 악성코드를 분석해보면 [표 1]과 같이 VBA 스크립트를 활용한 매크로 공격, Oleobject 삽입을 통한 공격, DDE 스크립트, Steam & Storage 등의 순으로 나타나며, 그 중 매크로, Oleobject, DDE에 대해 구체적으로 살펴보도록 하겠습니다.
[표 3] 수집된 MS 워드 문서형 악성코드 현황
분류 | 현황 |
Macro | 246 |
Oleobject | 171 |
DDE | 18 |
Stream & Storage | 14 |
ETC | 4 |
– MS 워드의 정상 기능들을 이용한 악성 행위 –
앞서 MS 워드 문서 포맷과 구조에 대해서 살펴보았고, 지금부터는 MS 워드 문서 내의 어떤 요소를 가지고 악성 스크립트를 은닉시키고 공격하는지를 알아보겠습니다.
1) VBA 스크립트를 활용한 매크로 악성코드
MS 워드 문서 내에서 생성된 매크로 스크립트는 문서 버전별로 다른 형태를 띠게 되며, 가장 큰 비중을 차지하고 있는 공격 기법의 하나입니다. [그림 3]은 ‘이상한 변호사 우영우’ 드라마 중 한 장면으로, 화면에 ‘콘텐츠 사용’이라는 보안 경고가 나타나는 것을 보면 VBA 스크립트를 활용한 매크로 문서형 악성코드임을 알 수 있습니다.

[그림 3] 드라마 중 문서형 악성코드 실행 장면[자료=넷플릭스]
매크로 스크립트가 포함된 워드 문서를 실행하게 될 경우 [그림 4]와 같이 ‘보안 경고 매크로를 사용할 수 없도록 설정했습니다.‘ 라는 보안 경고 문구를 볼 수 있는데, 드라마에서 연출된 매크로 악성코드 워드 문서 실행 장면과 동일하다는 것을 알 수 있습니다.

[그림 4] 매크로가 포함된 MS 워드 파일 실행 시 나타나는 경고문
공격자는 문서 내에 “문서를 보시려면 도구바의 ‘콘텐츠 사용’을 클릭하세요”라는 이미지를 본문에 삽입하여 해당 버튼의 클릭을 유도하였으며, 보안담당자는 문서 내용을 보기 위해 ‘콘텐츠 사용’ 버튼을 별생각 없이 클릭하게 됩니다. 너무 늦은 시간이 되어 보안담당자는 노트북을 끄고 회사를 나섰고, 나중에야 동생이 이메일을 보낸 적이 없다는 사실을 알게 됐지만 이미 해커가 제작한 워드 악성코드 내의 매크로 스크립트가 실행된 후였습니다.
이처럼 매크로 스크립트 기법을 기반으로 한 워드 악성코드가 큰 비중을 차지하고 있는 이유는 특정 문구나 행위에 대한 반복적인 기능을 빠르고 효율적으로 사용할 수 있게 편의 기능으로 추가된 매크로 기능을 VBA(Visual Basic for Application)를 통해 사용자가 직접 원하는 기능을 소스 코드로 작성하여 사용할 수 있기 때문입니다. [그림 5]와 같이 OLE 형식의 워드 문서에서는 _VBA_PROJECT라는 스토리지 내에 스트림으로 존재하며, OpenXML 형식의 워드에서는 .vbaProject.bin 형태의 바이너리 파일로 존재합니다.

[그림 5] MS 워드 문서 구조 내 매크로 포함 영역
생성된 매크로 바이너리 파일은 Run-Length 기법을 통해 압축 및 난독화됩니다[2]. 난독화를 해제하면 정상 MS 워드 파일과 악성 MS 워드 파일에서 사용되는 메소드가 다르다는 것을 확인 할 수 있습니다. 정상 MS 워드 파일의 경우에는 [그림 6]과 같이 MS의 의도에 맞게 특정 문구나 행위에 대해 반복적인 기능을 빠르고 효율적으로 사용할 수 있는 표준 기능 및 메소드가 사용됩니다.

[그림 6] 특정 문구나 행위 대한 반복적인 기능을 수행하는 매크로 스크립트
하지만, MS 워드 문서형 악성코드 같은 경우에는 [그림 7]과 같이 자동 실행 함수(Document_Open), 프로시저 호출(Call), 특정 파일 실행(ShellExecuteA), URL을 통한 파일 다운로드(URLDownloadToFileA) 등의 악성 행위를 수행하는 특정 메소드가 사용됨을 확인 할 수 있습니다. 정상적인 행위의 매크로와 악성 행위를 수행하는 매크로를 구분하기 위해서는 스크립트 내에서 사용되는 메소드에 대해 명확한 식별 및 확인이 필요합니다.

[그림 7] 악의적인 목적을 가진 VBA 매크로 스크립트
MS 워드 매크로 악성코드를 분석해본 결과 악성 행위에 사용되는 VBA 스크립트 메소드는 대부분 특정되어 있으며, 악성 행위에 사용되는 VBA 스크립트 위협 인자는 [표 4]와 같이 정의할 수 있습니다.
[표 4] 악성 행위에 사용되는 VBA 스크립트 메소드
메소드 | 설명 |
Environ | 운영체제 환경 변수의 값을 반환 |
Write, Put, Output, Print # | 파일에 데이터 쓰기 |
Binary | 바이너리 파일을 읽거나 데이터를 추가 |
Shell, vbNormal, vbNormalFocus, vbHide, vbMinimizedFocussvbMaximized, Wscript.shell, run | 파일 또는 시스템 명령 실행 가능 |
PowerShell | 윈도우 시스템 커맨드 실행 |
CreateObject | Oleobject 생성 |
URLDownloadToFileA, Mxsml2.XMLHTTP, Microsoft.XMLHTTP, MSXML2.serverXMLHTTP, User-Agent | URL을 통해 파일 다운로드 |
New-Object System.Net.Webclient, DownloadFile | Window PowerShell 명령을 이용하여 인터넷에서 파일 다운로드 |
Mkdir | 디렉토리 생성 |
Application.Visible, ShowWindow, SW_HIDE | 어플리케이션 숨김 |
2) Oleobject 객체 삽입을 활용한 악성코드
MS 워드는 문서 내부에 다른 문서 파일이나 PDF, 이미지 파일, 실행 파일 등 32가지의 파일을 삽입할 수 있으며[2], 삽입된 파일을 객체라고 칭하며 이를 외부 Oleobject 객체 삽입이라고 부릅니다. 해커는 MS 워드 문서 내에서 다른 OLE 객체를 참조할 때 문서 내에서 파일이 실행되는 것을 악용하여 악성코드 실행과 같은 비정상 행위를 할 수 있습니다.
외부 Oleobject 객체는 참조하고 있는 Oleobject 객체의 고유 스트림 정보와 함께 저장합니다. OLE 구조의 MS 워드의 경우에는 [그림 8]과 같이 ObjectPool 스토리지의 하위에 스트림 형태로 삽입되며, OpenXML 구조의 경우에는 [word] -> [embeddings] -> oleObject1.bin 형태의 바이너리 파일로 포함됩니다.

[그림 8] MS 워드 문서 구조 내 Oleobject 포함 영역
Oleobject는 MS 워드 내 기능 중 개체 추가 기능을 통해 비교적 쉽게 삽입될 수 있습니다. Oleobject 개체 삽입 과정 및 방법은 [그림 9]와 같으며 [삽입] -> [개체] -> [Package] -> [패키지 만들기] 내에서 Oleobject 삽입의 과정을 거치게 되면 워드 본문 내에 삽입한 Oleobject 객체가 보입니다.

[그림 9] MS 워드 문서 내 Oleobject 삽입 과정
공격자는 이러한 기능을 이용해서 문서 파일 내에서 다른 OLE 객체를 참조할 때 발생하는 취약점을 이용하여 악성코드 실행과 같은 비정상 행위를 할 수 있습니다. [그림 9]에서는 .txt 형식의 파일을 삽입하여 Oleobject 삽입의 예시를 보여드렸지만, [그림 10]과 같이 난독화된 Javascript 코드가 포함된 경우도 존재하는데 공격자가 삽입하는 OLE 객체에 따라 자바스크립트 코드, 쉘 스크립트 실행, ROP 체인, 레지스트리 값을 수정을 하거나 ROP 체인, 힙 스프레이 등의 공격 기법을 통해 PC 관리자와 동일한 권한을 획득할 수 있습니다.

[그림 10] Oleobject 형태로 삽입된 난독화된 자바스크립트 코드
3) DDE(Dynamic Data Exchange) 기능을 활용한 악성코드
DDE란 ‘Dynamic Data Exchange’의 약어로 윈도우 응용 프로그램 간의 동일한 데이터를 공유하도록 허용하는 방법 중 하나입니다. MS 오피스 문서, Visual Basic 등 다양한 응용 프로그램에서 사용되고 있으며, 해당 기능을 활용하여 다른 파일을 실행시킬 수 있어 이 기능을 악용하여 악성코드를 다운받거나 실행시키도록 하는 행위가 가능합니다.
DDE를 이용한 악용 사례 중 상당 부분이 MS 워드를 사용하며 MS 워드 내에서 DDE 기능을 사용하는 방법은 [그림 11]을 참조하면 되며, 순서는 [삽입] -> [빠른 문서 요소 내 필드 버튼] -> [ = (Formula)] -> [‘!수식의 끝이 잘못되었습니다’ 마우스 우클릭] -> 필드 코드 토글 -> [악성 행위를 수행하는 DDE 스크립트 삽입]으로 이루어집니다.

[그림 11] MS 워드 문서 내 DDE 스크립트 삽입 과정
[그림 12]에서 보여지는 예시 스크립트는 ‘DDEAUTO C:\\windows\\system32\\cmd “/k calc.exe”’와 같으며, 이는 CMD 명령 프롬프트를 이용해 계산기를 실행시키는 스크립트입니다. 예시는 매우 간단한 코드이지만 필드 코드를 계산기 실행이 아닌 Powershell을 이용할 경우, DDE는 악용될 소지가 더욱 커지게 됩니다.

[그림 12] 윈도우 OS에 내장된 계산기를 실행시키는 DDE 스크립트
실제로 DDE를 악용한 문서를 배포할 때는 백신에서 탐지하지 못하도록 DDE 스크립트를 난독화 시키는 경우가 많습니다. MS에서는 이러한 문제점이 있는데도 불구하고 DDE를 없애지 않는 이유는 사전에 DDE 코드를 실행하기 전에 경고 메시지를 띄워주는 부분이 있기 때문에 따로 패치를 진행하지 않는 것으로 보여집니다. 이 때문에 사용자의 주의가 요구되는 문서형 악성코드 공격 기법 중 하나라고 말할 수 있습니다.
– 글을 마치며 –
지금까지 MS 워드 문서의 포맷 구조 및 악성 행위에 사용되는 위협 인자가 포함된 구조, 공격방식 등 공격자가 MS 워드 문서를 통해 어떻게 공격하는지 살펴보았습니다.
MS 워드뿐만 아니라 대부분의 문서형 악성코드는 사람의 심리를 이용한 사회공학 기법을 사용한다는 큰 특징을 가지고 있으며, ‘피싱’의 형태로 무작위 불특정 다수를 대상으로 개인정보를 탈취할 수 있지만 ‘스피어 피싱’의 형태로 특정 대상의 정보를 타겟으로 하는 고도화되고 정교한 공격이 가능하기 때문에 사용자들의 주의가 많이 요구됩니다.
더욱이, 최근의 MS 워드 문서형 악성코드는 MS 오피스의 정상 기능을 악용하는 문제로 인해 안티바이러스의 탐지 및 분석을 우회할 수 있어 더욱 사용자들의 주의가 필요합니다.
MS 워드 문서형 악성코드 공격에 최대한 노출되지 않기 위해서는 문서가 실행될 때 출력되는 경고문이 있다면 항상 한번 더 확인하는 습관을 가져야 하며, 출처가 불분명한 이메일 또는 문서 파일이 메일 내에 첨부되어있다면 보낸이주소 확인과 메일 전송 여부를 확인 후 문서를 열람하는 것이 공격을 예방할 수 있는 좋은 방법입니다.
다음 포스팅에서는 MS 워드 포맷 내에서 추출된 위협 인자를 기반으로 MS 워드 문서형 악성코드를 상세히 분석하고 탐지하는 방법에 대해 살펴보고자 합니다.
[1] https://www.boannews.com/media/view.asp?idx=109166
[2] SungHye Cho, SangJin Lee “A Research of Anomaly Detection Method in MS Office Document”, KTCCS, 2017.
[3] Deokkyu Lee, Sang Jin Lee “A Study of Office Open XML Document-Based Malicious Code Analysis and Detection Methods,” KIISC, 2020.
[4] Kyeong Cheol Yang, Su Yeon Lee, Won Hyung Park, Kwang Cheol Park, Jong In Lim “A Study on the Analysis and Detection Method for Protecting Malware Spreading via E-mail,”KIISC, 2009.

손승호 연구원은 사이버보안학과 졸업 및 한국정보기술연구원 차세대 보안리더 양성 프로그램 5기 교육 수료생이다. 현재 KAIST 사이버보안연구센터 악성코드분석 팀원으로 악성코드 분석 프로그램 개발 및 연구를 진행하고 있다.