基于硬件辅助的内核漏洞挖掘框架 闫广禄
贡献者 潘剑锋 360首席安全架构师 闫广禄 360冰刃实验室高级安全研究员 范晓草 360冰刃实验室高级安全研究员 www.iceswordlab.com
内核漏洞 永恒之蓝(EternalBlue) 内核漏洞 NSA网络军火库民用化第一例 WannaCry勒索病毒 Adylkuzz挖矿僵尸网络 本地提权->完整控制操作系统
整体架构 1 错误检测 2 内容提要 路径探测 3 漏洞检测 4
整体架构
组成 路径探测 日志分析 错误检测 路径探测 错误检测 日志分析 基于代码覆盖导向型路径探测方法,构造、变异输入用例,执行目标程序,以发现更多的路径为目标。 错误检测 监控目标程序执行过程,捕获漏洞特征行为、收集关键数据。 日志分析 分析日志数据,生成漏洞报告
Hardware (CPU + virtualization extensions + Intel PT) 整体架构 Guest OS Loader Fuzzer Log Analyzer User Space Kernel Space Middleware Interface Detection VMM Infrastructure Memory Detection Hypervisor PT Trace Hardware (CPU + virtualization extensions + Intel PT) Target Program Logs 初始化 Driver hypervisor OS guest OS 基础功能组件 虚拟页面监控器 内核与Hypervisor间通信 事件监控器 CPU模拟器 线程调度监控器 PT Trace
错误检测子系统
虚拟页面监控器 影子页表(SPT) BitMap #PF handler MTF/TF handler 监控虚拟页面 记录 私有中断 VA PA #PF Not Match MA Propagate GPT SPT CR3 Handle Log Inject Interruption MTF/TF Handler Match Clear P Set MTF/TF Update #VMEXIT 影子页表(SPT) BitMap 监控虚拟页面 #PF handler 记录 私有中断 设置MTF/TF 更新SPT MTF/TF handler 再次监控虚拟页面
Hypervisor Components User Space Kernel Space Hypervisor Hypervisor Components Target Module Work Thread Log Shared Memory 3 1 2 2` K2H 服务函数 H2K 共享内存
ProbeRead/ProbeWrite/ProbeAccess AllocVirtualMemory/GetPebTeb 事件监控器 Check ProbeRead/ProbeWrite/ProbeAccess 检测用户指针 Access MemAccess 访问用户地址空间 Start Syscall/Trap2b/Trap2e 系统调用入口 Mark AllocVirtualMemory/GetPebTeb 标记内存合法 End RetUser 系统调用出口
CPU模拟器 ProbeAccess事件 目标内存 解释执行 1) cmp esi, dword ptr [nt!MmUserProbeAddress] 2) mov eax, dword ptr [nt!MmUserProbeAddress] cmp eax,XXX ProbeAccess事件 目标内存 nt!MmUserProbeAddress win32k!W32UserProbeAddress 解释执行 N cmp 固定指令数 #DR Target Memory DR Handler EAX EBX …… EIP Guest CPU EAX EBX …… EIP Virtual CPU N UVA-1 Update UVA-2 cmp Emulator …… UVA-N
路径探测子系统
Executing System Calls 代码覆盖导向型路径探测子系统 User User Space Building Parameters Mutating Executing System Calls Checking Bitmap Inputs Logs configuration Kernel Space Target Program Auxiliary Hypervisor PT Trace
进化算法 Input: Seed Inputs S 1: T’ = ∅; 2: T = S 3: while(1) 4: { 4: { 5: t = chooseNext(T) 6: p = assignEnergy(t) 7: for(i=0; i<p; i++) 8: { 9: t’= mutate input(t) 10: if t’ crashes 11: add t’ to T’ 12: if IsInteresting(t’) 13: add t’ to T 14: } 15: } Output: Crashing Inputs T’
PT Trace Intel® Processor Trace (Intel PT) 数据包(Data Packets) Taken Not-Taken (TNT) packets: TNT包负责跟踪条件跳转指令的跳转方向,即1代表跳转,0代表未跳转。 Target IP (TIP) packets: TIP包记录间接分支、异常和中断处理程序的目标地址。
线程调度监控器与准实时数据处理 目标线程 VS 非监控线程 _KPCR->_KPRCB->CurrentThread SPT or GPT 性能开销 _KPCR->_KPRCB->CurrentThread 监控 _KPRCB Write Monitor _KPCR Thread #1 …… _KPRCB Thread #2 Thread #n Thread #i PT buffer 1 PT buffer n Buffer is full/ Thread exits Thread call back Full path Bitmap 线程级别的准实时处理,无需内存或文件存储大量packets
块缓存(Block Caches) Cache for Block B Cache for Block A Address Size Jump type Next block array Next block 1 Next block 2 …… Block B Address Bitmap offset (1) Block C Address Bitmap offset (2) Cache for Block C 在解析数据包和构建bitmap时带来极大的性能提升。 程序运行一次即可建立起相应的块缓存 通过1bit(即跳转与否)可立即定位到目标块
改进的BitMap\全路径信息 改进的BitMap:在bitmap中为每一条新发现的路径分配固定位置 5 E 2 C 6 A F 1 B 4 动态分配 仅为执行过的路径分配 分配的位置记录到块缓存中 快速、无碰撞 A B C D F E 1 3 2 6 5 4 全路径信息
降噪实例 — 消除外部中断影响 × Stub (nop vmcall) External Interrupt Monitor (EIM) Guest OS Hypervisor Stub (nop vmcall) × External Interrupt Monitor (EIM) Interrupt Window Monitor (IWM) Guest IF = 1 Guest IF = 0 Disable EIM&PT, Tamper Guest EIP to Stub Disable EIM, Enable IWM sti Disable PT&IWM, Tamper Guest EIP to Stub External Interrupt VMCALL Monitor Enable EIM&PT, Return Guest EIP Target Program
构建、变异系统调用参数 [info] ;funs count number=4 ;STRATEGY_GUID = 2, STRATEGY_RANDOM =1 strategy=2 [parameters1] index=0x15c SubStructsNum=3 args=_HANDLE_PTR,_UINT32,_STRUCT_PTR,_STRUCT_PTR,_UINT32,_UINT32,_HANDLE,NIL mask=0xffffffff ;deep first subargs1=_UINT32,_HANDLE,_STRUCT_PTR,_UINT32,_VOID_PTR,_VOID_PTR,NIL submask1=0xffffffff subargs2=_INT16,_INT16,_VOID_PTR,NIL submask2=0xffffffff subargs3=_INT32,_INT32,_INT64,NIL submask3=0xffffffff ……
路径探测导出函数 线程级别路径探测 实时分析 DTENABLETRACE EnableTrace; DTDISABLETRACE DisableTrace; DTTRACEADDTHREAD TraceAddThread; DTTRACESTARTTHREAD TraceStartThread; DTTRACESTOPTHREAD TraceStopThread; DTQUERYTRACEINFORMATION QueryTraceInformation; DTENABLEIPT EnableIpt; DTDISABLEIPT DisableIpt; DTIPTQUERYINFORMATION IptQueryInformation; DTIPTADDTHREAD IptAddThread; DTIPTSTARTTHREAD IptStartThread; DTIPTSTOPTHREAD IptStopThread; DTPREPAREDECODER PrepareDecoder; DTDECODEIPTLOG DecodeIptLog; DTINITIALIZEDECODECACHE InitializeDecodeCache; DTDECODEIPTLOGSIMPLE DecodeIptLogSimple; DTDECODEIPTLOGTOBITMAP DecodeIptLogToBitmap; 线程级别路径探测 实时分析
漏洞检测
UNPROBE 与 TOCTTOU 类型错误检测 (Probe X) n Syscall n+4 RetUser n+1 ProbeRead (Access X) n+3 MemAccess n+2 (Access Y) 系统调用过程的事件记录示例
漏洞示例 UNPROBE (Avast 11.2.2262) TOCTTOU (Dr. Web 11.0) NtAllocateVirtualMemory : Eip : 89993f3d, Address : 0023f304, rw: R Eip : 84082ed9, Address : 0023f304, PROBE KiFastSystemCallRet TOCTTOU (Dr. Web 11.0) NtCreateSection : …… Eip : 89370d54 Address :3b963c Sequence :399 rw: R Eip : 89370d7b Address :3b963c Sequence :401 rw: R KiFastSystemCallRet
检测UAF漏洞 MS16-123/CVE-2016-7211: 跟踪释放内存 通过虚拟页面监控器捕获 “use” 操作 记录“free”函数及其调用栈 延迟释放 MS16-123/CVE-2016-7211: Single step exception - code 80000004 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. win32k!_ScrollDC+0x21: 96b50f3e 83ff01 cmp edi,1 kd> r eax=fe809268 ebx=96b50e37 ecx=85eefb40 edx=00000000 esi=fe809268 edi=00000000 …… 96b50f3b 8b7e68 mov edi , dword ptr [esi+68h] 96b50f3e 83ff01 cmp edi ,1// win32k !_ScrollDC+0x21
检测OOB漏洞 MS16-090/CVE-2016-3252: 监控待测模块分配与释放内存 利用虚拟页面监控器捕获内存访问 额外内存块 — 保护区(red zone) Single step exception - code 80000004 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. win32kbase!RGNMEMOBJ::bFastFill+0x385: 93e34bf9 895304 mov dword ptr [ebx+4],edx kd> r eax=00000002 ebx=9fa3f4f0 ecx=000003f0 edx=0000001b esi=9fa3f4f0 …… BAD_POOL_HEADER (19) FOLLOWUP_IP: win32kfull!NSInstrumentation::PlatformFree+10 a0efaade 5d pop ebp STACK_TEXT: nt!RtlpBreakWithStatusInstruction nt!KiBugCheckDebugBreak+0x1f MS16-090/CVE-2016-3252: Digtool Driver Verifier
检测内核信息泄露漏洞 CVE-2017-8470 CVE-2017-8474 CVE-2017-8476 CVE-2017-8482 内核会把某些关键的信息写入用户态的内存——监控内核代码对用户态内存的写操作: 未初始化堆/栈拷贝与直接敏感信息拷贝 初步试验产出60+ case,目前微软已分配18个CVE。 CVE-2017-8470 CVE-2017-8474 CVE-2017-8476 CVE-2017-8482 CVE-2017-8485 CVE-2017-8490 ...
总结 & 优势 无需Crash 提供准确上下文 检测多种类型漏洞 性能损耗低 连续记录漏洞特征 在漏洞触发时,可中断客户操作系统 UNPROBE, TOCTTOU, UAF(MS16-123/CVE-2016-7211), OOB, 信息泄露… 性能损耗低 只影响目标线程中被监控的系统调用 Intel PT仅带来很小的性能开销
谢谢! IceSwordLab@360.cn