본문 바로가기

Analysis

03. CVE-2018-4878

CVE-2018-4878 취약점은 어도비 플래시 플레이어 취약점으로 2018년도에 밝혀진 취약점이다.

어도비 플래시 플레이어의 UAF(Use-After-Free) 취약성을 이용한 취약점으로써 해당 취약점을 이용해 악성코드를 실행시키는 행위 등이 가능하다.


이미 시큐레터의 상세히 분서된 보고서가 제공되고 있지만, 개인 공부 겸 해당 취약점을 분석한다.

아래는 분석 환경이다.


 OS

Windows 7 32 bit 

Flash Version 

28.1.1 


[그림 1] CVE-2018-4878




먼저 분석 대상이 된 파일은 CVE-2018-4878 취약점을 이용해 플래시 파일 내 쉘코드를 실행시키는 악성코드였다. 정확히는 RAT(Remote Access Trojan) 악성코드였으며, 감염되게 되면 감염 PC가 공격자 통제하에 놓이는 악성코드이다. 분석 대상 파일의 스크립트 구조는 아래 그림과 같다. DRM Manager의 취약한 메서드를 이용해 UAF 취약점을 발생시켜 공격을 성공시키는 형태이다.

[그림 2] 분석 대상 파일


아래 그림은 분석 대상 파일의 메인 스크립트이다.

[그림 3] 메인 스크립트


아래 그림 4에서는 쉘코드를 위한 공간을 할당하며 UAFGenerator 함수를 실행하기 위해 해당 공간도 할당한다.

[그림 4] 메인 스크립트 상세_1


아래 그림 5에서는 할당한 공간을 이용해 UAFGenerator 함수를 실행한다.

[그림 5] 메인 스크립트 상세_2


UAFGenerator 함수에서는 DRM의 취약한 부분을 실행하는 method_2()와 강제적으로 가비지 콜렉터를 실행하는 Try-Catch 구문, UAF 취약점 실행이 정상적으로 이루어 진 후에 데이터를 변조하는 부분으로 이루어진다.

[그림 6] UAF Generator 함수


method_2 함수는 CVE-2018-4878 취약점을 이용한 파일 내에서 DRM 객체에서 취약한 함수로 취약점을 발생시키는 역할을 하는 함수이다. 먼저 var_16 변수에 DRM 객체를 할당한 뒤에 var_15 변수에 drmManager,initialize 메소드를 호출하면서 매개변수로 DRM 객체가 할당된 var_16 을 지정하고 호출한다. 이후 과정에서 var_16에 null 을 저장시킴으로 객체를 free 시켜서 취약점을 발생시키는데, 이 과정에서 var_16은 포인터로써 가리키고 있던 데이터가 사라지게 된다. 가리키고 있는 데이터가 없는 포인터를 허상 포인터라고 하는데, 본 취약점은 허상 포인터를 이용한 것이다.

[그림 7] method_2() 함수


method_2 에서 사용된 DRM_obj 객체는 Unsigned int 타입의 데이터를 배열 인덱스에 갖고 있다.

[그림 8] DRM_obj


method_2 함수의 호출 이후에 강제로 가비지 콜렉터를 실행시켜서 drmManager.initialize 메소드를 호출하면서 매개변수로 사용한 var_16 이 가리키는 위치가 어떤 데이터도 없는 빈 공간을 가리키도록 만든다. 그 영향으로 매개변수로 사용되었던 var_16은 어떤 데이터도 없는 빈 공간을 가리키는 허상 포인터가 되게 된다. 이후 catch 문으로 인해 var_13에는 DRM_obj 객체의 주소가 저장되는데 컴퓨터 자체적으로 메모리를 효율적으로 사용하기 위해 이전에 사용했던 메모리 공간을 재사용하는 정책에 의해서 free 되기 전 기존의 var_16과 동일한 주소에 저장되게 된다.

[그림 9] method_2 이후


이후 drmManager.initialize의 실행 결과에서 정상적인 DRM 정보가 확인되지 않기 때문에 에러가 발생하게 되고 onDRMError 함수가 호출된다. drmManager.initialize에 지정된 리스너 객체를 해제하게 되고 var_13이 가리키는 메모리의 객체 데이터는 그 과정에서 삭제되게 된다. var_13이 가리키는 메모리의 객체 데이터는 삭제되지만 변수 var_13은 남아있게 되기 때문에 var_13은 허상 포인터로써 존재하게 된다.

[그림 10] onDRMError


UAF 취약점 발생이 정상적으로 이루지고 가비지 콜렉터도 정상적으로 실행되게 되면 이후 TimeEvent를 발생시킬 때 method_1을 매개변수로 호출함으로써 method_1을 실행한다. method_1에서는 앞에서 DRM_obj가 할당된 var_13의 첫번째 배열 데이터인 a1이 원래의 데이터와 다를 경우에 다음 실행을 하고 flash25 함수를 호출한다. 원래의 데이터와 다를 경우에 다음 실행을 이어가는 이유는 취약점이 정상적으로 발생했을 경우에 원래의 데이터가 변조되기 때문이며 취약점이 정상적으로 발생했는지의 유무를 판단하는 지표로 사용된다.

[그림 11] Timer

[그림 12] a1 비교


flash25 함수에서는 var_17 변수에 Mem_Arr 객체를 생성하고 주소를 저장한다. 그렇게 되면 효율적인 메모리 관리기법에 의해 주소는 허상 포인터인 var_13이 가리키는 주소가 된다. 때문에 허상 포인터인 var_13으로 var_17에 저장된 데이터를 변조할 수 있게 된다. 이후 공격자는 var_13으로 접근해 var_17의 메모리 값을 직접적으로 변경하며 결론적으로 Mem_Arr의 구조체 값이 변경된다. 구조체 값을 대입하는 과정에서 적절성 여부 검사가 이루어지기는 하지만 허상 포인터를 이용해 직접적으로 값을 대입하는 경우에는 적절성 여부 검사가 이루어지지 않기 때문에 공격자는 해당 구조체 값을 손쉽게 변경할 수 있고, 공격에 성공하게 된다.

[그림 13] flash25 함수

[그림 14] Mem_Arr 구조체


메모리 변조가 정상적으로 이루어지고나면 flash20 함수의 매개변수로 var_17, var_13을 지정하고 호출하며 이후에는 만들어져 있는 쉘코드가 실행되어 분석 대상 파일의 경우에는 RAT 행위를 이어간다.

[그림 15] flash25 함수 이후 과정


해당 파일을 실행하게 되면 스크립트 형태로 실행이 되고 콘텐츠는 일단 차단된다.

[그림 16] 플래시 파일 실행


차단된 콘텐츠를 해제하고 실행하게되면 플래시 취약점을 이용해 악성코드가 실행되어 PC를 감염시킨다.

[그림 17] 차단된 콘텐츠 해제


- Reference

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


반응형

'Analysis' 카테고리의 다른 글

06. LokiBot  (0) 2019.05.30
05. TrickBot  (0) 2019.05.29
04. Shamoon  (0) 2019.01.14
02. GandCrab Ransomware V5.0  (0) 2018.11.30
01. USCYBERCOM Malware Alert's APT Malware  (0) 2018.11.22