AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

Flash虚拟机内存管理及漏洞利用 by Hearmen@北京大学

发布者 airjd   简介 Ruby技术大会相关演讲
发布于 1441067994808  浏览 5093 关键词 网络安全 
分享到

第1页

Flash内存管理与漏洞利用

Hearmen 北京大学软件安全研究小组



第2页

AVM2 虚拟机简介 CVE-2015-0313 CVE-2015-3043 CVE-2015-5119



目录



第3页

uCVE-2015-3043



攻击演示



第4页

AVM2 虚拟机简介

uAVM2 是 目 前 使 用 的 flash player 的 核 心 , 所 有 的 ActionScript 3 代码都由AVM2来执行

u采用Jit与解释器混合执行的方式,大幅提升flash的运 行效率



第5页

ActionScript 3执行流程

AVM 2 堆栈初始化



ActionScript 3 编译器



Constant pool bytecode



常量池初始化

JIT 解释器



u《avm2overview》



机器语言



第6页

AVM2 内存管理

u使用MMgc进行内存管理

u延缓引用计数,标记/清除算法

u从操作系统中申请大量保留空间,按页交予垃圾回收机 制GC进行管理。



第7页

AVM2 内存管理



4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k



HeapBlock HeapBlock HeapBlock HeapBlock HeapBlock



第8页

FreeLists

Free[0] Free[1] Free[2] Free[3] Free[4] Free[5] ……

Free[30]



GCHeap



1 block

2 block 3 block 4 block 5 block 6 block

128 block



1 block

2 block 3 block 4 block 5 block 6 block

… block



1 block

2 block 3 block 4 block 5 block 6 block

… block



1 block

2 block 3 block 4 block 5 block 6 block

… block



第9页

CVE-2015-0313

ByteArray.Clear()



第10页

利用步骤

堆喷射,控制内存布局 触发漏洞,更改Vector的length属性 任意地址读写,布局shellcode 更改对象虚表,接管程序运行流程



第11页

ByteArray

uByteArrayObject uBuffer uBuffer大小以4k倍数增长 u通过FixedMalloc进行内存分配



第12页

FixedMalloc

FixedMalloc::Alloc(size) {

if(size < kLargestAlloc) // 32bit 2032 FindAllocate(size)->FixedAlloc()

else LargeAlloc(size)

}



第13页

FixedBlock



第14页

FixedAlloc



m_firstBlock FixedBlock



FixedAllo c



m_firstFree



FixedBlock



FixedBlock



firstFree

Free item



Free item



FixedBlock



第15页

Uint Vector



第16页

内存布局



data data Data_1 data data



Worker



data data Data_2 data data



Main



data data FixedBlock si32 Block Head data Vector<uint> data Vector<uint>

Vector<uint>



第17页

FixedBlock



第18页

稳定性的考虑

uByteArray.clear之前的额外操作

ØGCHeap内存释放,将HeapBlock挂入freelist末尾 ØGCHeap内存分配,从freelist头部开始遍历。



第19页

CVE-2015-3043

ØFlash在解析Flv中Nellymoser压缩的<tag>时,没有对buffer长度 进行正确的检验,从而导致的堆溢出

Ø被溢出的对象大小是0x2000

Ø该漏洞出现过 两次



第20页

内存布局



Vector<uint> Vector<uint>

Free Vector<uint> Vector<uint>



加载flv



Vector<uint> Vector<uint>

Corrupt Buffer

Vector<uint> Vector<uint>



重新布局



Vector<uint> Vector<uint> Corrupt Obj Vector<uint> Vector<Obj>



第21页

Object Vector



第22页

GC::Alloc

GC::Alloc {

if(size < kLargestAlloc) //1968 GCAlloc()

else GCLargeAlooc::Alloc()

}



第23页

GCBlock



第24页

GCAlloc



m_firstBlock GCBlock



GCAlloc



m_firstFree



m_qlist Free item



Free item



GCBlock



GCBlock



firstFree

Free item



Free item

Free item



Free item



GCBlock



第25页

GCLargeBlock



第26页

CVE-2015-5119



第27页

内存布局



第28页

Class2



第29页

另一种办法

uObject Vector u通过GC直接在内存中查找 Vector

uObj -> Vector[ i ]



第30页

uNo ROP uAS完成操作 uBypass CFG



优雅的利用



第31页

FunctionObject

uAS中的函数对象 uFunction.apply ; Function.call;Function()



第32页

FunctionObject

uCore可由FunctionObject查找



第33页

AS3_call



第34页

u完全使用AS代码 操作API

u只 能 精 确 控 制 两 个参数

u调 用 的 函 数 参 数 个数需为三或四



Demo



第35页

Flash_18_0_0_209/232

u Vector长度验证 u 隔离堆 u 强随机化



第36页

uUint Vector



长度验证



uObject Vector



第37页

u堆溢出



绕过验证



uString对象 u更改长度字段/更改起始指针 u任意地址读



第38页

uVectorObject



绕过验证



u更改数据对象指针



uCookie作为length



u交换Vector<uint>长度与Cookie



第39页

谢谢



支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。