1. 취약점과 진단 방안
(1) 위험한 작업(Action)
위 그림의 작업(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들을 목록화 한 것이다.
(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공격이다.
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공격이 이뤄진다.
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 여부를 진단할 수 있는 방법은 다음과 같다.
압축 폭탄 공격은 PDF파일 내의 stream을 flatedecode와 같은 다양한 encoding알고리즘으로 압축할 수 있다는 점을 이용한다. 이러한 압축 알고리즘을 중첩으로 사용하면 매우 큰 용량의 stream을 적은 용량으로 압축 할 수 있다. 사용자가 stream의 내용을 확인하기 위해 압축을 해제하면 자원 부족으로 인한 서비스 중지가 발생한다. 이러한 공격은 주로 바이러스 검사 프로그램을 겨냥하며, 검사 프로그램이 PDF의 악성여부를 진단하는 과정에서 DoS공격이 수행되어 프로그램의 서비스가 중지된다.
다음 예시는 flatedecode encoding 중첩을 통한 압축 폭탄 공격이다.
예시에서는 Root Object -> Pages(2 0 obj) -> Page(3 0 obj) -> Contents(4 0 obj)
순으로 참조하며 마지막 4 0 obj
는 stream
을 담고 있는 obj
로 Dictionary Key인 Filter
와 Length
값을 가지며 이를 통해 stream
의 길이가 20872911
이고 ASCIIHexDecode
와 FlateDecode
를 이용하여 encoding되었음을 알 수 있다. 길이 1당 1byte를 의미하며 예시의 문서는 encoding된 하나의 stream
만으로 20,383KB의 크기를 가졌다. 이외에도 압축폭탄 공격은 여러 번의 encoding이 수행된다는 것과 극적인 압축을 위해 stream
내에 반복적인 문자열이 많이 등장한다는 특징을 가진다.
해당 취약점을 이용하는 악성 PDF 여부를 진단할 수 있는 방법은 다음과 같다.
분석가가 이러한 PDF를 분석하기 위해 필요한 기능은 다음과 같다.
(1) Object간의 참조 관계를 확인하는 기능
(2) 사용된 JavaScript 코드만을 추출하여 확인하는 기능
(3) 문서 내의 stream 부분만 추출하여 세부 정보(길이, encoding방식)와 함께 확인할 수 있는 기능
(3) Information Disclosure
Information Disclosure는 공격자의 서버에 자동으로 연결되어 PDF 문서 양식데이터, 로컬 파일 또는 NTLM 자격 증명과 같은 민감한 데이터가 공격자에게 유출되는 공격이다. 다음 예시는 로컬 파일을 외부 서버에 전송하는 유형이다.
예시 코드에서 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파일의 정상 기능을 이용한 것으로 악용 여부를 진단할 수 있는 방법은 다음과 같다.
분석가가 이러한 PDF파일을 분석하기 위해 필요한 기능은 다음과 같다
(1) PDF에서 접근하는 파일에 대한 세부적인 정보를 확인할 수 있는 기능
(ex. 파일명, 경로, 파일 형식, 수정한 날짜 등)
(4) Data Manipulation
Data Manipulation은 PDF파일의 기능을 이용하여 양식 데이터를 자동으로 수정하거나, 희생자의 로컬 파일에 쓰기 작업을 하거나, PDF Reader 프로그램에 따라 다른 콘텐츠가 표시되도록 만든다. 다음은 로컬 파일에 쓰기 작업을 수행하는 예시이다
예시 코드에서 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의 정상적인 작업이 악의적 의도에 의해 사용될 경우 발생하며, 이 경우 주로 파일에 대한 덮어쓰기 작업이 사용자와의 상호작용 없이 곧바로 일어남을 이용한다.
악성 여부를 진단할 수 있는 방법은 다음과 같다.
분석가가 이러한 PDF를 분석하기 위해 추가적으로 필요한 기능은 다음과 같다.
(1) PDF에서 쓰기작업을 수행하려는 파일에 대한 세부 정보를 확인할 수 있는 기능
(5) Code Execution
Code Execution은 희생자의 컴퓨터에 공격자가 제어하고자 하는 코드를 실행시키는 것을 목표로 한다. 공격자는 PDF파일의 Launch 작업과 같이, 로컬 경로, 네트워크 공유, URL 또는 PDF 문서 자체에 포함된 파일을 실행시킬 수 있는 기능들을 활용한다. 이 기능을 이용해 사전에 숨겨둔 악성파일을 동작 시킴으로써 악성행위가 이뤄질 수 있다. 다음은 PDF파일을 실행시킴으로써 명령 프롬프트 프로그램이 동작되는 예시이다.
예시의 코드는 PDF 파일이 Open 될 때와 Page가 Open 될 때 각각 한번씩 5 0 object
를 참조하여 cmd.exe
를 실행시키는 /Launch
작업을 수행한다. 이러한 작업은 정상적인 PDF의 기능이지만, 의도에 따라 악의적으로 사용될 수 있다. 해당 취약점의 악용 여부를 진단할 수 있는 방법은 다음과 같다.
이러한 경우 프로그램의 악성여부 탐지가 필요하며, 바이러스 탐지 엔진을 따로 개발하여 탐지가 진행되어야 할 것 같다.
분석가가 이러한 PDF를 분석하기 위해 필요한 기능은 다음과 같다.
(1) Launch 작업에서 접근하려는 프로그램 정보를 확인할 수 있는 기능
(2) 프로그램을 바이러스 탐지 엔진과 연동하여 진단할 수 있는 기능
(6) Shadow Attack
Shadow Attack은 서명된 PDF를 대상으로 서명 유효성을 유지한 채 콘텐츠를 숨기거나 바꾸는 공격이다. Hide형태의 Shadow Attack을 수행하는데 사용할 수 있는 취약점은 2가지이다.
첫 번째는 서명된 PDF가 콘텐츠 제거에 대한 경고 알람을 발생시키지 않는 경우가 있다는 것이다. 다수의 Reader 프로그램들이 서명된 PDF 파일에 새 콘텐츠 추가, 삭제될 경우 경고 알람을 발생시킨다. 그러나 낮은 버전의 일부 Reader 프로그램들은 콘텐츠 제거에 대해서 경고 알람을 발생시키지 않았다.
두 번째는 서명된 PDF가 증분 업데이트 될 때 MetaData와 Annotation와 같이 Reader 프로그램에서 무해한 것으로 판단하는 몇 가지 기능이 존재한다는 것이다.
<그림 1-8>은 공격자가 악의적인 문구를 은닉한 PDF를 생성하고 서명을 받은 경우이다. 서명이 완료된 PDF에 대해서 공격자는 PDF의 메타 데이터를 수정하여 증분 업데이트 유도한 후, 악의적인 문구를 덮고 있던 image파일에 대한 Object인 8 0 obj
의 offset 주소를 메타데이터 정보를 가리키던 6 1 obj
의 offset주소와 동일하게 수정해줌으로써 서명의 유효성을 유지한 채 콘텐츠를 숨길 수 있다. 해당 취약점의 악용 여부를 진단할 수 있는 방법은 다음과 같다.
분석가가 이러한 PDF를 분석하기 위해 필요한 기능은 다음과 같다.
(1) 증분 업데이트 이력과 변경, 추가된 Object에 대한 내용을 확인하는 기능
(2) xref table 정보를 통합하여 출력해주는 기능
2. 마무리
지금까지 우리는 PDF 취약점에 대한 다양한 형태에 대해서 살펴보았다. 다음에는 PDF 취약점을 이용한 악성 PDF 파일을 진단하는 방법에 대해서 살펴보기로 한다.