Pawn Storm 익스플로잇과 유사한 새로운 Flash 취약점 “CVE-2016-4117”

게시일: 2016-05-19 l 작성자: Moony Li (Threat Analyst)

Adobe는 지난 5월 10일(미국 시간), Adobe Flash Player에 존재하는 심각한 취약성 ‘CVE-2016-4117’을 포함한 보안 권고 ‘APSA16-02’를 공개했습니다. Adobe에 따르면, 해당 취약점은 이미 공격에 이용되고 있습니다. 이 취약점을 가진 Adobe Flash Player가 설치된 PC를 공격할 경우, 시스템에서 충돌 임의 코드가 실행되고, 공격자가 PC를 제어할 수 있게 됩니다. Adobe는 12일, 취약점 패치를 제공하였습니다.

트렌드마이크로는 이번 취약점 ‘CVE-2016-4117’ 관련 정보를 보고하려 합니다.


‘CVE-2016-4117’ 분석

간단히 말해, 문제의 취약점은 Adobe Primetime SDK 의 일부인 DeleteRangeTimelineOperation 클래스에 존재 타입 체크(type check) 취약점입니다.

DeleteRangeTimelineOperation 기본 클래스의 Placement 속성에 영역 밖 메모리 참조로 새로운Placement 클래스에 의해 제어된 오프셋으로 액세스 또는 실행될 수 있습니다. 공격자는 Boolean 또는 Integer 형을 사용하여 임의 코드를 실행하는 악성 SWF 파일을 설계합니다.

하단은 Adobe에서 개발자에게 제공하는 Library.swf에서 얻은 DeleteRangeTimelineOperation과 Placement 클래스에 대한 자세한 선언입니다.

[API(“712”)] //API version greater than SWF27/AIR16/FP16
[native(cls=”PSDKDeleteRangeTimelineOperationClass”, instance=”PSDKDeleteRangeTimelineOperationObject”, methods=”auto”)]

public class DeleteRangeTimelineOperation implements TimelineOperation
{
public function DeleteRangeTimelineOperation(placement:Placement)
{
this.ctor(placement);
}

private native function ctor(placement:Placement):void;
final public native function get isValid():Boolean;
final public native function get placement():Placement;
final public native function set placement(placement:Placement):void;
}

}//package com.adobe.tvsdk.mediacore.timeline.operations

그림1. Adobe 라이브러리 DeleteRangeTimelineOperation 클래스 선언

[API(“712”)] //API version greater than SWF27/AIR16/FP16
[native(cls=”PSDKPlacementClass”, instance=”PSDKPlacementObject”, methods=”auto”)]

public class Placement
{
public static const UNKNOWN_DURATION:Number = -1;
public static const UNKNOWN_POSITION:Number = -1;
public function Placement(_arg_1:int=0, time:Number=-1, duration:Number=-1, mode:int=0)

{
this.ctor(_arg_1, time, duration, mode);
}

private native function ctor(_arg_1:int=0, _arg_2:Number=-1, _arg_3:Number=-1, _arg_4:int=0):void;
final public native function compareTo(otherPlacement:Placement):int;
final public native function get isValid():Boolean;
final public native function get type():int;
final public native function get time():Number;
final public native function get duration():Number;
final public native function get mode():int;
final public native function get range():TimeRange;
}

}//package com.adobe.tvsdk.mediacore.timeline

그림2. Adobe 라이브러리 Placement 클래스 선언

당사는 업데이트 공개 이전의 Adobe Flash Player(버전 21.0.0.213)에서 해당 취약점을 확인했습니다. 그림3은 아웃 오브 바운더리(out-of-boundary) 액세스를 일으키는 취약점의 슈도코드입니다.

int __thiscall sub_1035F480(int this_DeleteRangeTimelineOperation, int a2)

{

this_DeleteRangeTimelineOperation1 = this_DeleteRangeTimelineOperation;

varPlacement = sub_10787840(aThis, (int)”placement”);

varPlacement_1 = varPlacement;

varControlledIndex = sub_107C84E0(
*(_DWORD *)(*(_DWORD *)(*(_DWORD *)(this_DeleteRangeTimelineOperation1 + 12) + 8) + 4),
*(_DWORD *)(*(_DWORD *)(*(_DWORD *)(this_DeleteRangeTimelineOperation1 + 12) + 8) + 20),
&varPlacement_1);

obj = *(_DWORD *)(this_DeleteRangeTimelineOperation1 + 0xC);
varControlledObj = *(_DWORD *)(*(_DWORD *)(obj + 8) + 4 * (varControlledIndex >> 3) + 0x3C);
v24 = (*(int (**)(void))(*(_DWORD *)obj + 8))();
v14 = alloca(v13 & 4);
v15 = (*(int (__cdecl **)(int, _DWORD, int *))(*(_DWORD *)(varControlledObj + 8) + 8))(varControlledObj, 0, &v24);


}

그림3. 취약점 슈도코드(pseudocode)

DeleteRangeTimelineOperation::Placement가 참조되면 sub_1035F480이 호출됩니다. varControlledIndex는 파생 클래스 Placement의 오프셋으로, 보정 값에서 값(N)은 파생 클래스의 Placement 속성 이전의 N 객체를 선언함으로써 쉽게 제어됩니다. varControlledObj는 varControlledIndex에 의해 제어되고, 결국 함수 주소(* (int (__cdecl **) (int, _DWORD int *)) (* (_ DWORD *) (varControlledObj + 8) +8 ))가 잘못 실행됩니다.

0:006> t

eax=00000078 ebx=0d79e7f0 ecx=0a4e52e0 edx=0a3c3460 esi=08f05ea8 edi=00000000
eip=0932f51b esp=020be67c ebp=020be6ac iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00040206
Flash32_21_0_0_213!DllUnregisterServer+0x14ff98:
0932f51b 8b74823c mov esi,dword ptr [edx+eax*4+3Ch] ds:0023:0a3c367c=00000000
//get wrong esi== varControlledObj,
// where eax == varControlledIndex == 00000078 == N

그림4. 취약점 슈도코드

그림4의 어셈블리 코드는 어떻게 varcontrolledObj가 varControlledIndex에 의해 제어되는 것을 보여줍니다.

0:006> t

eax=0a4e52e1 ebx=0d79e7f0 ecx=00000004 edx=0a3c3460 esi=00000000 edi=00000000
eip=0932f533 esp=020be67c ebp=020be6ac iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00040202
Flash32_21_0_0_213!DllUnregisterServer+0x14ffb0:
0932f533 8b4608 mov eax,dword ptr [esi+8] ds:0023:00000008=????????
//crash here, esi == varControlledObj ==0

그림5. 취약점 슈도코드

그림5의 슈도코드는 (*(int (__cdecl **)(int, _DWORD, int *))(*(_DWORD *)(varControlledObj + 8) + 8)) 를 가져올 때 어떻게 액세스 위반이 발생하는지 보여줍니다.

흥미로운 점은 이번 취약점 ’CVE-2016-4117’이, 2015년 10월에 보고된 표적형 사이버 공격 캔페인 ‘Pawn Storm’ 작전에 ㅅ용된 ‘CVE-2015-7645’와 유사하다는 점입니다. ‘CVE-2015-7645’는 IExternalize 인터페이스의 형태 오해(type confusion)에 의해 발생되었으며, 유사한 방법으로 유발됩니다. 이번 포스트의 그림4와 ‘CVE-2015-7645’ 관련 포스트의 그림4에 나온 분해 코드는 매우 유사하다는 것을 알 수 있습니다.

이러한 유사 취약점은 Flash Player의 ActionScript Virtual Machine(AVM)의 원시 코드의 추가적인형태 오해 취약점 가능성을 나타냅니다. 이런 취약점 설계 그리고 코드는 또 다른 방법으로 재사용될 수 있습니다.

트렌드마이크로의 대책

트렌드마이크로는 사용자들이 최대한 신속히 Adobe Flash Player의 버전을 최신 버전인 21.0.0.242로 업데이트 할 것을 권장합니다.

당사의 네트워크 동작 모니터링 솔루션인 Deep Discovery의 샌드박스와 Script Analyzer엔진은 엔진 또는 패턴 업데이트 없이 위협을 감지할 수 있습니다.

서버용 종합 보안 제품 Deep Security를 이용하는 고객은 다음의 DPI룰을 적용하여 취약점으로부터 보호받을 수 있습니다.

• 1007638 - Adobe Flash Player Type Confusion Overflow Vulnerability (CVE-2016-4117) 참고기사:

원문: New Flash Vulnerability CVE-2016-4117 Shares Similarities With Older Pawn Storm Exploit