연재 순서
Creative Commons License

첫번째 글: PDF 파일 구조 분석

두번째 글: PDF 취약점과 진단 방안

세번째 글: 악성 PDF 파일 진단

1. 취약점과 진단 방안

(1) 위험한 작업(Action)

<그림 1-1> 공격에 활용될 수 있는 작업들(Actions)

위 그림의 작업(Action)들은 파일 핸들에 대한 직접 또는 간접적인 액세스를 허용하므로 URL호출 또는 파일 쓰기와 같은 위험한 기능에 악용될 가능성이 있다. 예를 들어 Page Object의 /AA(Addition Actions) Entry는 GotoE Entry를 호출할 수 있어 다른 PDF의 악성 content에 접근하여 악성 행위를 수행시킬 수 있다. JavaScript 코드의 경우 JavaScript 엔진상의 취약점을 이용해 공격을 수행할 수 있으므로 삽입되는 JavaScript에 대한 악성 여부 파악이 필요하다. 많은 공격들이 위 그림과 같이 정상적인 작업들을 활용하여 수행된다. 때문에 <그림 1-1>에서 확인할 수 있는 작업들과 이러한 작업들을 호출할 수 있는 Object들을 목록화하여 문서 내 등장 여부를 확인해야 하고, 악성, 정상 여부를 가려내기 위한 기준을 잡아야 한다.

<표 1-1>은 <그림 1-1>을 바탕으로 파일에 직접 또는 간접적으로 액세스 할 수 있는 Action과 그러한 Action을 호출할 수 있는 Object들을 목록화 한 것이다.

<표 1-1> 취약한 작업(Action) 목록

(2) Denial of Service

Denial of Service(DoS)은 PDF 응용 프로그램을 처리하는 과정에서 사용 가능한 자원을 고갈시키거나 충돌을 발생시켜 서비스를 이용하지 못하도록 만든다. PDF 파일을 이용한 DoS공격은 두 가지 유형으로 나눌 수 있다.

하나는 Infinite-loop를 이용한 공격이고 다른 하나는 압축을 이용한 공격으로 압축 폭탄이라고 불린다. Infinite-loop는 /GoTo /Next와 같은 다음 행동을 지정하는 작업을 통해 loop를 생성하거나 /JS 타입의 Object에서 JavaScript 코드의 반복문을 활용하여 공격이 수행된다.

다음 예시는 각각 JavaScript, Outline-Next작업을 이용한 dos공격이다.

<그림 1-2> Denial of Service (Outline-Next) 예시

Outline은 PDF에 개요 목록을 표시해주는 기능으로 예시 코드에서는 Root Object(1 0 object)에서 Outline의 정보를 담고 있는 8 0 object를 참조하여 표현한다. Outline은 계층 구조를 가지며 Dictionary Key인 First와 Last를 통해 자신의 직계 하위 계층의 첫 번째와 마지막 번째를 가리킨다. 해당 코드에서는 최상위 Outline인 5 0 object가 하위 계층으로 6 0 object, 7 0 object를 가지며 6 0 object가 첫 번째이고 7 0 object가 마지막 번째가 된다. 같은 수준의 계층에서는 링크되는 순서에 따라 화면에 출력되는데 이때 7 0 object가 다음 항목으로 6 0 object를 참조하면서 Infinite-loop가 발생하여 DoS공격이 이뤄진다.

<그림 1-3> Denial of Service (JavaScript) 예시

JavaScript를 이용한 DoS는 PDF에 JavaScript가 허용된다는 점을 악용한 공격이다. 위 예시에서 5 0 object의 Dictionary Key인 S의 value값 /JavaScript로 OpenAction에서 JavaScript를 참조함을 알 수 있고, Dictionary Key인 /JS의 value값 6 0 R을 통해 JavaScript 코드가 6 0 object를 참조함을 알 수 있다. 참조된 코드는 변수 x에 문자열 A를 넣고 x=x+x 작업을 for(;;)문을 통하여 무한 반복하는 내용으로 변수 x의 크기를 계속 늘려가며 메모리 부족을 유도하는 DoS 공격이다.

해당 취약점을 이용하는 악성 PDF 여부를 진단할 수 있는 방법은 다음과 같다.

<표 1-2> DoS Exploit 진단 방안 (Infinite-loop)

압축 폭탄 공격은 PDF파일 내의 stream을 flatedecode와 같은 다양한 encoding알고리즘으로 압축할 수 있다는 점을 이용한다. 이러한 압축 알고리즘을 중첩으로 사용하면 매우 큰 용량의 stream을 적은 용량으로 압축 할 수 있다. 사용자가 stream의 내용을 확인하기 위해 압축을 해제하면 자원 부족으로 인한 서비스 중지가 발생한다. 이러한 공격은 주로 바이러스 검사 프로그램을 겨냥하며, 검사 프로그램이 PDF의 악성여부를 진단하는 과정에서 DoS공격이 수행되어 프로그램의 서비스가 중지된다.

다음 예시는 flatedecode encoding 중첩을 통한 압축 폭탄 공격이다.

<그림 1-4> Denial of Service (압축 폭탄) 예시

예시에서는 Root Object -> Pages(2 0 obj) -> Page(3 0 obj) -> Contents(4 0 obj)순으로 참조하며 마지막 4 0 objstream을 담고 있는 obj로 Dictionary Key인 FilterLength값을 가지며 이를 통해 stream의 길이가 20872911이고 ASCIIHexDecodeFlateDecode를 이용하여 encoding되었음을 알 수 있다. 길이 1당 1byte를 의미하며 예시의 문서는 encoding된 하나의 stream만으로 20,383KB의 크기를 가졌다. 이외에도 압축폭탄 공격은 여러 번의 encoding이 수행된다는 것과 극적인 압축을 위해 stream내에 반복적인 문자열이 많이 등장한다는 특징을 가진다.

해당 취약점을 이용하는 악성 PDF 여부를 진단할 수 있는 방법은 다음과 같다.

<표 1-3> DoS Exploit 진단 방안 (압축 폭탄)

분석가가 이러한 PDF를 분석하기 위해 필요한 기능은 다음과 같다.

(1) Object간의 참조 관계를 확인하는 기능
(2) 사용된 JavaScript 코드만을 추출하여 확인하는 기능
(3) 문서 내의 stream 부분만 추출하여 세부 정보(길이, encoding방식)와 함께 확인할 수 있는 기능

(3) Information Disclosure

Information Disclosure는 공격자의 서버에 자동으로 연결되어 PDF 문서 양식데이터, 로컬 파일 또는 NTLM 자격 증명과 같은 민감한 데이터가 공격자에게 유출되는 공격이다. 다음 예시는 로컬 파일을 외부 서버에 전송하는 유형이다.

<그림 1-5> Information Disclosure 예시

예시 코드에서 Root Object는 1 0 object로 문서가 열렸을 때의 동작인 OpenAction object (5 0 obj)을 참조하고, OpenAction object는 S, F, Next라는 이름의 Dictionary Key를 갖는다. S의 value값인 ImportData는 데이터를 가져오는 작업이 수행됨을 알 린다. F의 value는 Dictionary data type으로 다시 Key인 F를 가지며, 해당 키의 value 값으로 가져올 데이터의 경로 값을 저장한다. Next는 이어서 참조할 Action Object (6 0 obj)을 가리키며, Action Object(6 0 obj)는 S, F라는 이름의 Dictionary Key를 가진다. S의 value값인 SubmitForm은 데이터를 제출하는 작업이 수행됨을 알리고, F의 value값은 Dictionary data type으로 다시 F, V, FS라는 이름의 Key값을 갖는다. 이 중, F의 value값이 데이터를 전달받는 서버의 주소를 갖는다.

해당 취약점은 PDF파일의 정상 기능을 이용한 것으로 악용 여부를 진단할 수 있는 방법은 다음과 같다.

<표 1-4> Information Disclosure유형의 Exploit 진단방안

분석가가 이러한 PDF파일을 분석하기 위해 필요한 기능은 다음과 같다

(1) PDF에서 접근하는 파일에 대한 세부적인 정보를 확인할 수 있는 기능
(ex. 파일명, 경로, 파일 형식, 수정한 날짜 등)

(4) Data Manipulation

Data Manipulation은 PDF파일의 기능을 이용하여 양식 데이터를 자동으로 수정하거나, 희생자의 로컬 파일에 쓰기 작업을 하거나, PDF Reader 프로그램에 따라 다른 콘텐츠가 표시되도록 만든다. 다음은 로컬 파일에 쓰기 작업을 수행하는 예시이다

<그림 1-6> Data Manipulation 예시

예시 코드에서 Root Object인 1 0 object/AcroForm으로 대화형 양식 필드를 정의하였고, /AcroForm의 필드는 /Annots [6 0 R, 7 0 R, <<…Dictionary…>>]로 3개의 Annotation 정보를 가진다.

6 0 object의 Dictionary Key인 V는 Object의 필드 유형에 따라 다른 유형의 value값을 가지며 해당 Object는 텍스트 유형이기 때문에 value값으로 문자열 text to write의 Widget을 띄운다.

7 0 object는 생성하는 Widget에서 사용자가 버튼 클릭을 할 경우 5 0 object를 참조하여 Dictionary Key인 F의 value값으로 지정된 경로에 쓰기작업을 수행하며, 쓰여지는 데이터는 PDF문서양식에 맞춰 작성된다.

Dictionary Data type으로 배열 내에서 바로 정의된 마지막 Annotation은 Link type의 Annotation으로 문서의 다른 곳 또는 수행할 작업에 대한 하이퍼텍스트 링크를 나타낸다. 위 코드에서는 Link가 활성화되었을 때 5 0 obj를 참조하여 Data Manipulation이 수행되도록 하고 있다.

해당 취약점은 PDF의 정상적인 작업이 악의적 의도에 의해 사용될 경우 발생하며, 이 경우 주로 파일에 대한 덮어쓰기 작업이 사용자와의 상호작용 없이 곧바로 일어남을 이용한다.

악성 여부를 진단할 수 있는 방법은 다음과 같다.

<표 1-5> Data Manipulation유형의 Exploit 진단방안

분석가가 이러한 PDF를 분석하기 위해 추가적으로 필요한 기능은 다음과 같다.

(1) PDF에서 쓰기작업을 수행하려는 파일에 대한 세부 정보를 확인할 수 있는 기능

(5) Code Execution

Code Execution은 희생자의 컴퓨터에 공격자가 제어하고자 하는 코드를 실행시키는 것을 목표로 한다. 공격자는 PDF파일의 Launch 작업과 같이, 로컬 경로, 네트워크 공유, URL 또는 PDF 문서 자체에 포함된 파일을 실행시킬 수 있는 기능들을 활용한다. 이 기능을 이용해 사전에 숨겨둔 악성파일을 동작 시킴으로써 악성행위가 이뤄질 수 있다. 다음은 PDF파일을 실행시킴으로써 명령 프롬프트 프로그램이 동작되는 예시이다.

<그림 1-7> Code Execution 예시

예시의 코드는 PDF 파일이 Open 될 때와 Page가 Open 될 때 각각 한번씩 5 0 object를 참조하여 cmd.exe를 실행시키는 /Launch 작업을 수행한다. 이러한 작업은 정상적인 PDF의 기능이지만, 의도에 따라 악의적으로 사용될 수 있다. 해당 취약점의 악용 여부를 진단할 수 있는 방법은 다음과 같다.

<표 1-6> Code Execution 유형의 Exploit 진단 방안

이러한 경우 프로그램의 악성여부 탐지가 필요하며, 바이러스 탐지 엔진을 따로 개발하여 탐지가 진행되어야 할 것 같다.

분석가가 이러한 PDF를 분석하기 위해 필요한 기능은 다음과 같다.

(1) Launch 작업에서 접근하려는 프로그램 정보를 확인할 수 있는 기능
(2) 프로그램을 바이러스 탐지 엔진과 연동하여 진단할 수 있는 기능

(6) Shadow Attack

Shadow Attack은 서명된 PDF를 대상으로 서명 유효성을 유지한 채 콘텐츠를 숨기거나 바꾸는 공격이다. Hide형태의 Shadow Attack을 수행하는데 사용할 수 있는 취약점은 2가지이다.

첫 번째는 서명된 PDF가 콘텐츠 제거에 대한 경고 알람을 발생시키지 않는 경우가 있다는 것이다. 다수의 Reader 프로그램들이 서명된 PDF 파일에 새 콘텐츠 추가, 삭제될 경우 경고 알람을 발생시킨다. 그러나 낮은 버전의 일부 Reader 프로그램들은 콘텐츠 제거에 대해서 경고 알람을 발생시키지 않았다.

두 번째는 서명된 PDF가 증분 업데이트 될 때 MetaData와 Annotation와 같이 Reader 프로그램에서 무해한 것으로 판단하는 몇 가지 기능이 존재한다는 것이다.

<그림 1-8> Shadow Attack – Hide 유형 예시

<그림 1-8>은 공격자가 악의적인 문구를 은닉한 PDF를 생성하고 서명을 받은 경우이다. 서명이 완료된 PDF에 대해서 공격자는 PDF의 메타 데이터를 수정하여 증분 업데이트 유도한 후, 악의적인 문구를 덮고 있던 image파일에 대한 Object인 8 0 obj의 offset 주소를 메타데이터 정보를 가리키던 6 1 obj의 offset주소와 동일하게 수정해줌으로써 서명의 유효성을 유지한 채 콘텐츠를 숨길 수 있다. 해당 취약점의 악용 여부를 진단할 수 있는 방법은 다음과 같다.

<표 1-7> Shadow Attack (hide) 유형 Exploit 진단 방안

분석가가 이러한 PDF를 분석하기 위해 필요한 기능은 다음과 같다.

(1) 증분 업데이트 이력과 변경, 추가된 Object에 대한 내용을 확인하는 기능
(2) xref table 정보를 통합하여 출력해주는 기능

2. 마무리

지금까지 우리는 PDF 취약점에 대한 다양한 형태에 대해서 살펴보았다. 다음에는 PDF 취약점을 이용한 악성 PDF 파일을 진단하는 방법에 대해서 살펴보기로 한다.

크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 국제 라이선스에 따라 이용할 수 있습니다.
Hyeok-Jae Lee's profile image

Hyeok-Jae Lee

2021-05-18 09:00

Read more posts by this author