flash内存管理与漏洞利用 - paper.seebug.org conf/kcon/2015/flash 虚拟机... ·...
TRANSCRIPT
Flash内存管理与漏洞利用
Hearmen北京大学软件安全研究小组
目录
AVM2 虚拟机简介
CVE-2015-0313
CVE-2015-3043
CVE-2015-5119
攻击演示
uCVE-2015-3043
AVM2 虚拟机简介
uAVM2是目前使用的 flash player的核心,所有的ActionScript 3代码都由AVM2来执行
u采用Jit与解释器混合执行的方式,大幅提升flash的运行效率
ActionScript 3执行流程
u《avm2overview》
ActionScript 3bytecode
Constant pool
堆栈初始化
常量池初始化
JIT
解释器
机器语言编译器
AVM 2
AVM2 内存管理
u使用MMgc进行内存管理
u延缓引用计数,标记/清除算法
u从操作系统中申请大量保留空间,按页交予垃圾回收机
制GC进行管理。
AVM2 内存管理
HeapBlock
4k4k
4k
4k4k
4k4k
4k
4k4k
4k4k
4k
4k4k
4k4k
4k
4k4k
HeapBlock
HeapBlock
HeapBlock
HeapBlock
GCHeap
Free[0]
Free[1]
Free[2]
Free[3]
Free[4]
Free[5]
……
Free[30]
1 block 1 block 1 block1 block
2 block 2 block 2 block2 block
3 block 3 block 3 block3 block
4 block 4 block 4 block4 block
5 block 5 block 5 block5 block6 block 6 block 6 block6 block
128 block
… block
… block
… block
FreeLists
CVE-2015-0313
ByteArray.Clear()
利用步骤
堆喷射,控制内存布局
触发漏洞,更改Vector的length属性
任意地址读写,布局shellcode
更改对象虚表,接管程序运行流程
ByteArray
uByteArrayObject
uBuffer
uBuffer大小以4k倍数增长
u通过FixedMalloc进行内存分配
FixedMalloc
FixedMalloc::Alloc(size){
if(size < kLargestAlloc) // 32bit 2032FindAllocate(size)->FixedAlloc()
elseLargeAlloc(size)
}
FixedBlock
FixedAlloc
FixedAlloc
FixedBlock FixedBlockFixedBlock FixedBlock
Freeitem
Freeitem
m_firstFree
firstFree
m_firstBlock
Uint Vector
内存布局
data
data
Data_1
data
data
data
data
Data_2
data
data
Worker
data
data
FixedBlock
data
data
Block Head
Vector<uint>
Vector<uint>
Vector<uint>
si32Main
FixedBlock
稳定性的考虑
uByteArray.clear之前的额外操作
ØGCHeap内存释放,将HeapBlock挂入freelist末尾
ØGCHeap内存分配,从freelist头部开始遍历。
CVE-2015-3043
ØFlash在解析Flv中Nellymoser压缩的<tag>时,没有对buffer长度进行正确的检验,从而导致的堆溢出
Ø被溢出的对象大小是0x2000
Ø该漏洞出现过 两次
内存布局
Vector<uint>
Vector<uint>
Free
Vector<uint>
Vector<uint>
Vector<uint>
Vector<uint>
Corrupt Buffer
Vector<uint>
Vector<uint>
Vector<uint>
Vector<uint>
Corrupt Obj
Vector<uint>
Vector<Obj>
加载flv 重新布局
Object Vector
GC::Alloc
GC::Alloc{
if(size < kLargestAlloc) //1968GCAlloc()
elseGCLargeAlooc::Alloc()
}
GCBlock
GCAlloc
GCAlloc
GCBlock GCBlockGCBlock GCBlock
Freeitem
Freeitem
m_firstFree
firstFree
m_firstBlock
Freeitem
Freeitem
Freeitem
Freeitem
m_qlist
GCLargeBlock
CVE-2015-5119
内存布局
Class2
另一种办法
uObject Vector
u通过GC直接在内存中查找 Vector
uObj -> Vector[ i ]
优雅的利用
uNo ROP
uAS完成操作
uBypass CFG
FunctionObject
uAS中的函数对象
uFunction.apply ; Function.call;Function()
FunctionObject
uCore可由FunctionObject查找
AS3_call
Demo
u完全使用AS代码操作API
u只能精确控制两
个参数
u调用的函数参数
个数需为三或四
Flash_18_0_0_209/232
uVector长度验证
u隔离堆
u强随机化
长度验证
uUint Vector
uObject Vector
绕过验证
u堆溢出
uString对象
u更改长度字段/更改起始指针
u任意地址读
绕过验证
uVectorObject
u更改数据对象指针
uCookie作为length
u交换Vector<uint>长度与Cookie
谢谢