Microsoft Word - SecuLetter_ExploitAnalysis_CVE _Ver0.1

Similar documents
JVM 메모리구조

PowerPoint 프레젠테이션

슬라이드 1

슬라이드 1

Microsoft PowerPoint - chap06-2pointer.ppt

JAVA PROGRAMMING 실습 05. 객체의 활용

PowerPoint Presentation

JAVA PROGRAMMING 실습 08.다형성

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

11장 포인터

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - ch07 - 포인터 pm0415

설계란 무엇인가?

금오공대 컴퓨터공학전공 강의자료

KNK_C_05_Pointers_Arrays_structures_summary_v02

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

취약점분석보고서 [Photodex ProShow Producer v ] RedAlert Team 안상환

JAVA PROGRAMMING 실습 02. 표준 입출력

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

금오공대 컴퓨터공학전공 강의자료

17장 클래스와 메소드

설계란 무엇인가?

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint - 제11장 포인터(강의)

< FBFF9B0A320BEC7BCBAC4DAB5E520C0BAB4D0BBE7C0CCC6AE20C5BDC1F620B5BFC7E220BAB8B0EDBCAD283131BFF E302028C8A8C6E4C0CCC1F620BEF7B

JAVA PROGRAMMING 실습 09. 예외처리

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

PowerPoint Template

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Research & Technique Apache Tomcat RCE 취약점 (CVE ) 취약점개요 지난 4월 15일전세계적으로가장많이사용되는웹애플리케이션서버인 Apache Tomcat에서 RCE 취약점이공개되었다. CVE 취약점은 W

Chapter 4. LISTS

gnu-lee-oop-kor-lec06-3-chap7

Design Issues

Lab 3. 실습문제 (Single linked list)_해답.hwp

목 차 1. 개 요 배경 요약 정보 대상시스템 원리 공격 기법 및 기본 개념 Heap Spray Font 공 격..

슬라이드 1

Microsoft PowerPoint - 제11장 포인터

chap 5: Trees

< 목차 > 1. 악성코드은닉동향요약 1 2. 홈페이지은닉형악성코드통계 2 - 유포지탐지 국가별현황 2 - 대량경유지가탐지된유포지 TOP 악성코드유형별비율 4 - 악성코드취약점유형별비율 4 - 악성코드수집및분석결과 5 - 경유지탐지 업종별비율 9 3. 악성코

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

11장 포인터

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

PowerPoint 프레젠테이션

Microsoft PowerPoint - web-part03-ch20-XMLHttpRequest기본.pptx

XSS Attack - Real-World XSS Attacks, Chaining XSS and Other Attacks, Payloads for XSS Attacks

PowerPoint Presentation

Data Structure

DBMS & SQL Server Installation Database Laboratory

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

Microsoft PowerPoint - Chap12-OOP.ppt

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

작성자 : 김성박\(삼성 SDS 멀티캠퍼스 전임강사\)

슬라이드 1

슬라이드 1

PowerPoint 프레젠테이션

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

C++ Programming

Microsoft PowerPoint - chap06-1Array.ppt

Adobe Flash 취약점 분석 (CVE )

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Microsoft Word - FunctionCall

슬라이드 1

PowerPoint Presentation

ThisJava ..

JAVA PROGRAMMING 실습 05. 객체의 활용

Microsoft PowerPoint - chap10-함수의활용.pptx

ActFax 4.31 Local Privilege Escalation Exploit

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

쉽게 풀어쓴 C 프로그래밍

커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서

Microsoft PowerPoint - e pptx

Microsoft PowerPoint - chap06-5 [호환 모드]

슬라이드 1

PowerPoint Presentation

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

제11장 프로세스와 쓰레드

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - 11주차_Android_GoogleMap.ppt [호환 모드]

API 매뉴얼

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

IRISCard Anywhere 5

SOFTBASE XFRAME DEVELOPMENT GUIDE SERIES HTML 연동가이드 서울특별시구로구구로 3 동한신 IT 타워 1215 호 Phone Fax Co

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

PowerPoint Presentation

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요

untitled

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

<4D F736F F D20BEBEBCA520C4DAB5F920BFACBDC0202D20B8D6C6BC20BEB2B7B9B5E5BFCD20C0CCBAA5C6AE2E646F6378>

BMP 파일 처리

Microsoft PowerPoint - Lect04.pptx

Chapter #01 Subject

Transcription:

Use-After-Free in Adobe Flash Player CVE-2018-4878 2018. 04. 09 시큐레터주식회사

01 개요 지난 2018 년 1월 31일 KrCERT/CC 는 Adobe 플래시플레이어의제로데이취약점을악용한악성코드유포와관련하여보안공지를발표했습니다. 해당취약점은플래시플레이어 28.0.0.161 버전과이전버전에발생하는 Use- After-Free 취약점으로 Primetime SDK 의미디어플레이어 DrmManager 관련메소드가리스너객체를처리하는과정에서 Dangling Pointer 가만들어집니다. 공격자는 Dangling Pointer 를이용하여임의의메모리에접근하여데이터를변조할수있습니다. CVE Reference CVE-2018-4878 Ref1. https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2018-4878 취약점발생모듈 Flash32_28_0_0_137.ocx (Flash Player Version 28.0.0.137) 취약점발생버전 Adobe Systems Flash Player Desktop Runtime 28.0.0.137 버전과이전버전 Adobe Systems Flash Player for Google Chrome 28.0.0.137 버전과이전버전 Adobe Systems Flash Player for Microsoft Edge and Internet Explorer 11 28.0.0.137 버전과이전버전 취약점이발생하는메소드 DRM Manager 객체의 acquirelicense(), acquirepreviewlicense(), authenticate(), createmetadatafrombytes(), initialize(), joinlicensedomain(), leavelicensedomain(), returnlicense(), setauthenticationtoken(), storelicensebytes() 메소드 취약점이발생하는파라미터 취약점이발생하는메소드의 listener 파라미터 02 Exploit 동작원리상세분석 분석환경 Windwos 732Bit Adobe Systems Flash Player Desktop Runtime 28.0.0.137

취약점발생원인 DRM Manager 의취약한메서드는리스너로전달받은객체를처리하는과정에서전달받은주소에대해서메모리해제여부를검증하지않고해당위치에있는다른객체가해제 ( 삭제 ) 되며 Danglin Pointer 를만들어 Use-After-Free 취약점을발생시킵니다. 취약점상세분석 그림. 1 분석샘플액션스크립트구조및메인스크립트 위그림은본문서에사용한샘플 PoC 파일입니다. BinaryData 에있는데이터는계산기를실행하기위한쉘코드데이터를갖고있습니다. MainExp 는먼저실행하는메인스크립트로 ByteArray 타입의변수 data14 에계산기를실행하는 ShellcodByte 데이터의주소를저장합니다. UAFGenerator 메소드를실행하여 CVE-2018-4878 취약점을동작시킵니다. Use-After-Free 취약점이발생하는과정

그림. 2 Use-After-Free 취약점동작과정 Use-After-Free 취약점이발생하는과정의순서를살펴보겠습니다. 취약점동작에주요한스크립트코드의실행순 서로정리했습니다. 분석은위흐름으로진행하도록하겠습니다.

그림. 3 UAFGernerator 스크립트구조 Ues-After-Free 취약점을발생시키는 UAFGenerator 함수는크게세부분으로이해할수있습니다. UAF 취약점을일으키기위해 DRM Manager 의취약한메소드를실행하는 method_2() 와강제적으로가비지콜렉터를실행하고 Dangling Pointer 를만드는 Try Catch 구문그리고 UAF 취약점이제대로동작했는가를체크하고 Dangling Pointer 를이용해서데이터를변조하는부분입니다. 그림. 4 취약점동작시키는 method_2 메소드 method_2() 의기능은리스너객체를매개변수로하는 DrmManager 의취약한함수를호출하고리스너로지정한객 체를가리키는포인터를해제합니다. 주요코드는아래와같습니다. 55: 리스너로사용할 DRM_obj() 객체인스턴스를만들고변수로선언한 var_16 에인스턴스주소를저장합니다. 56: MediaPlayer 객체의 drmmanager.initialize 메소드를호출하는데변수 var_16 을리스너로지정합니다. 57: var_16(drm_obj 객체의주소 ) 을 Null 로저장하면서 var_16 을 free ( 객체해제 ) 한효과를발생합니다.

그림. 5 DRM_obj 객체클래스 위과정에서변수 var_16 에저장되는 DRM_obj 객체의클래스는위그림과같이 Unsigned Int 타입의데이터를배 열인덱스에담고있습니다. method_2 는 var_16 을 drmmanager.initialize 메소드의리스너로지정하고다음명령으로 var_16 이 null 로초기화 됩니다. 이때리스너객체는메모리에남아있고리스너객체를가리키는포인터인 var_16 만삭제됩니다. 그림. 6 DRM_obj 객체인스턴스가저장될주소지정 this.var_16 에 DRM_obj 객체를저장하기위해먼저 DRM_obj() 메소드를호출하여객체를인스턴스화합니다. 이때 스택에저장된인자값을확인하면인스턴스가저장될주소가저장되어있는것을확인할수있습니다. 그림. 7 저장된 DRM_obj 객체데이터

지정된주소를확인해보면 DRM_obj() 객체의인스턴스가위그림과같이메모리에저장되어있는것을확인할수 있습니다. 그림. 8 DRM_obj 객체인스턴스를가리키는주소지정 이후 this.var_16 변수 (0x07AC2174 번지 ) 에 DRM_obj 객체의인스턴스주소 (0x07A6E100) 를저장합니다. 그림. 9 var_16 에저장된 DRM_obj 객체인스턴스주소 위그림과같이 this.var_16 변수에인스턴스를가리키는포인터가저장되는것을확인할수있습니다. 그림. 10 DrmManager 객체의취약한메소드호출다음으로 DrmManager 의취약한매소드 ( 분석대상샘플은 initialize 메소드 ) 를호출하는데전달되는매개변수를살펴보면 var_16 의주소 ( 객체인스턴스를가리키는포인터 ) 를전달하는것이아닌인스턴스화된객채의주소를전달합니다.

그림. 11 DRM_obj 객체인스턴스를지정하는리스너와 var_16 위그림과같이하나의객체를가리키는포인터를매개변수로하여리스너객체가포인터를가리키는것이아닌리 스너객체자체를매개변수로하여취약한메소드를실행합니다. 그림. 12 var_16 해제 다음명령을통해 var_16 변수에저장된 DRM_obj 인스턴스의주소를삭제합니다. 여기서는객체의포인터인 var_16 만삭제하기때문에인스턴스화된객체는메모리에남아있습니다. 그림. 13 삭제된 DRM_obj 객체

사라진 var_16 변수가가리키는객체인스턴스를삭제하기위해강제로가비지콜렉터동작시킵니다. 가비지콜렉터는개발자가의도해서실행하는것이아닌메모리관리를위해 AVM2(Actionscript Virtual Machine) 에서실행합니다. 하지만여기서사용된 Try Catch 코드는비공식적으로가비지콜렉터를강제로동작시킬수있습니다. 강제로가비지콜렉터가동작하면 DM_obj 객체인스턴스데이터를삭제합니다. 이제 DrmManager.initialize() 메소드의매개변수로사용한리스너가가리키는위치는어떤데이터도없는빈공간을가리키게됩니다 그림. 14 새로생성된 var_13 이후 catch 문으로인해 var_13 변수에 DRM_obj() 객체의인스턴스주소가저장됩니다. 여기서인스턴스주소는기존의 var_16 과동일한주소에저장됩니다. 여기서 var_16 의위치와 var_13 은다른위치에객체인스턴스의주소를저장합니다. var_16 의위치는 0x07AC2174 였고 var_13 의위치는 0x07AC217C 입니다. 그림. 15 var_16 과동일한위치에생성된 var_13 DRM_obj 객체인스턴스 위그림과같이 DrmManager.Initialize() 메소드의리스너객체로지정된메모리에동일한 DRM_obj 객체가저장되어 있습니다.

그림. 16 ondrmerror 메소드호출 DrmManager.Initialize() 메소드의실행결과미디어의 DRM 정보를확인할수없기때문에 DRMError 이벤트를처리하며 DrmManager.Initialize() 메소드에지정한리스너객체를해제합니다. 위그림에서 ondrmerror 메소드호출시스택에저장된인자값에리스너로지정한주소인 0x07A6E100 번지가저장되어있습니다. 그림. 17 ondrmerror 메소드호출이후해제 ( 삭제 ) 된 DRM_obj 객체 ondrmerror 메소드가실행되면 var_13 이가리키는메모리의객체데이터가삭제되는것을확인할수있습니다. 하 지만변수 var_13(0x07ac217c) 은아래그림과같이여전히남아있는것을확인할수있습니다. 그림. 18 this 포인터에남아있는 var_13 포인터메모리관리자는효율적인메모리관리를위해이전에사용했던메모리공간크기와같거나조금작은데이터를저장해야하는경우기존의메모리를재사용하는경향 ( 메모리재할당 ) 이있습니다. 하지만데이터가있거나참조하는포인터가있는경우다른메모리공간을찾아데이터를할당합니다. 이번취약점은먼저생성된 DRM_obj 객체인스턴스의포인터를 Null 로지정하여객체를해제한효과를발생시키고강제로가비지콜렉터를호출하여해제된객체를삭제합니다. 동일한크기의객체를인스턴스화하는과정에서기존의메모리주소에동일한주소에객체인스턴스가저장되고 var_13 이이를가리킵니다. DRMError Event 이후리스너로지정된메모리영역을해제하고삭제하는과정에서 Var_13 이가리키는객체데이터가삭제되어 var_13 이 Dangling Pointer 가됩니다. 결과적으로변수 var_13(drm_obj 객체를가리키는주소 ) 은남아있지만해당위치의객체는해제되고해당주소에

는다른데이터가저장될수있습니다. 때문에저장된데이터를 var_13 포인터로접근하여보안검사를우회하여데 이터를변조할수있는환경이만들어집니다. 이후 Timer EventListener 를이용해서 Tiem Event 를발생시켜 method_1 을호출합니다. method_1 은위그림과같 이 Dangling Pointer 인 var_13 의첫번째배열인 a1 에저장된값을비교하여기존의데이터와다른경우다음단계로 넘어가도록설계되있습니다. 다음단계는 flash25 메소드에서실행됩니다 그림. 19 메모리변조를위한 flash25 메소드 flash25 메소드의코드는위와같습니다. 복잡해보기는코드지만핵심기능은 ByteArray 타입의 Mem_Arr 객체인스턴스를생성하고인스턴스의주소를 var_17 에저장합니다. 이때 Mem_Arr 객체를지정하는주소는기존의 var_13 이가리키는주소인 0x07A6E100 번지입니다. 때문에변수 var_13 으로 var_17 에저장된인스턴스데이터를변조할수있습니다. 정상적인과정으로 ByteArray 의속성을변경하는경우적절한검사를통해서비정상적인값을필터링하지만지금은 Dangling Pointer 인 var_13 으로접근하여직접적으로값을변조할수있습니다. ByteArray 의 m_buffer 구조체의의주소와배열의시작주소를 0x00000000 으로배열의길이를 0xFFFFFFFF 로변경하여프로세스메모리전체에접근할수있게됩니다. 메모리접근권한을변경하면 Primit.flash20() 메소드를호출하며다음단계를진행합니다.

그림. 20 변수 var_17 에저장하는 Mem_Arr 객체인스턴스의주소 ByteArray 타입의 Mem_Arr 객체를인스턴스화하여메모리에저장하고이를가리키는포인터를 this.var_17(0x7ac2180) 변수에저장합니다. 그림. 21 this 포인터에저장된 var_13 과 var_17 this 포인터에저장된같은위치를가리키는포인터가두개있는것을확인할수있습니다. 이로인하여 var_17 이가 리키는 Mem_Arr 객체를 Var_13 포인터로직접변조할수있습니다. 그림. 22 메모리에저장된 Mem_Arr 객체인스턴스 저장된 Mem_Arr 객체데이터를살펴보면위와같습니다. 이렇게 Mem_Arr 객체를인스턴스화하고나면 var_17 에 Mem_Arr 의인스턴스주소를정합니다.

그림. 23 메모리에저장되는 Mem_Arr 클래스 실제 Mem_Arr 클래스는위그림과같습니다. ByteArray 타입으로각배열인덱스에 Unsinged int 데이터를갖고있 습니다. a1 부터 a11 은뒤에서사용할 m_buffer 구조체데이터를담기위한공간을확보하는역할을수행합니다. 그림. 24 var_13 을이용한 Mem_Arr 객체인스턴스정보변경 위코드에서 var_13.a14 속성의값을변경합니다. 변경하는값은 Mem_Arr 객체의 m_buffer 구조체의주소를가리 키고있습니다. ByteArray 클래스에서 m_buffer 는배열의시작주소와길이와같은정보를갖고있는구조체입니다. 그림. 25 Mem_Arr 의 m_buffer 포인터가지정된위치의 m_buffer 구조체 변경전의 Mem_Arr 객체의데이터는위그림과같이메모리의어떤주소를가리키고그곳에 m_buffer 구조체정 보가저장되어있는것을확인할수있습니다.

그림. 26 m_buffer 구조체포인터변경 변경된데이터는 m_buffer 구조체에대한포인터로이후지정한 m_buffer 주소에구조체데이터를저장합니다. 그림. 27 var_13 을이용한 m_buffer 구조체데이터변경 var_13 포인터를이용해 Mem_Arr 객체에접근하여 m_buffer 구조체를직접변경합니다. 이때속성에값을대입하 는과정에서적절성여부를검사하지만 Dangling Pointer 를이용하여메모리에직접적으로값을대입한는경우적절 성여부에대한검사를하지않습니다. 그림. 28 변경된 m_buffer 구조체데이터 외그림과같이 Dangling Pointer 인 var_13 을이용해 Mem_Arr 의 m_buffer 구조체값을변경합니다.

그림. 29 ByteArray 클래스의 m_buffer 구조체 ByteArray 의 m_buffer 구조체를변조하여배열의시작주소를 0x00000000 으로하고길이를 0xFFFFFFFF 로변조하여프로세스의전체메모리에접근가능한 R/W 권한을얻을수있습니다이를이용하면 ASLR 과 DEP 를우회할수있으며메모리에로드되어있는쉘코드를찾아실행시킬수있습니다. 분석샘플은쉘코드객체인스턴스를찾아이를실행하기위해 VirtualProtect 함수를호출하여메모리에실행권한을부여하고쉘코드를실행합니다. 03 결론 본문서의분석샘플은미디어의저작권정보관련해서사용하는 DrmManager 관련메소드의취약점으로 Use- After-Free 취약점을동작시켜 Dangling Pointer 를만듭니다. 이를통해 ByteArray 의 m_buffer 구조체의배열시작주소와길이를변조하여프로세스전체메모리에대한 R/W 접근권한을얻어와프로세스의실행흐름을제어할수있었습니다. 이후메모리에로드될쉘코드객체를찾아객체메모리에실행권한을부여하고쉘코드를실행합니다. 공격자는취약점으로만들어진 Dangling Pointer 를이용하여다양한방식으로원하는코드를실행할수있습니다. 브라우저는보안상의문제로인해애플을비롯하여구글, MS IE, Edge 에이르기까지기본설정으로플래시플레이 어를사용하지않도록했습니다. 하지만 SWF 파일은문서파일에포함되어사용자에의해실행될수있습니다. 문 서파일은브라우저에비해실행에제약이많이않기때문에보다쉽게악성코드를실행시킬수있습니다.