第1页
Flash内存管理与漏洞利用
Hearmen 北京大学软件安全研究小组
第2页
AVM2 虚拟机简介 CVE-2015-0313 CVE-2015-3043 CVE-2015-5119
目录
第3页
uCVE-2015-3043
攻击演示
第4页
AVM2 虚拟机简介
uAVM2 是 目 前 使 用 的 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
uByteArrayObject uBuffer uBuffer大小以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页
稳定性的考虑
uByteArray.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页
另一种办法
uObject Vector u通过GC直接在内存中查找 Vector
uObj -> Vector[ i ]
第30页
uNo ROP uAS完成操作 uBypass CFG
优雅的利用
第31页
FunctionObject
uAS中的函数对象 uFunction.apply ; Function.call;Function()
第32页
FunctionObject
uCore可由FunctionObject查找
第33页
AS3_call
第34页
u完全使用AS代码 操作API
u只 能 精 确 控 制 两 个参数
u调 用 的 函 数 参 数 个数需为三或四
Demo
第35页
Flash_18_0_0_209/232
u Vector长度验证 u 隔离堆 u 强随机化
第36页
uUint Vector
长度验证
uObject Vector
第37页
u堆溢出
绕过验证
uString对象 u更改长度字段/更改起始指针 u任意地址读
第38页
uVectorObject
绕过验证
u更改数据对象指针
uCookie作为length
u交换Vector<uint>长度与Cookie
第39页
谢谢