前言
上个月我发现并报告了一个Windows注册表整型溢出漏洞,上星期二(2016.10.25)微软发布了该漏洞的修复补丁MS16-124并对该漏洞编号CVE-2016-0070。该漏洞可以导致本地权限提升,影响到多个版本的Windows,因此微软定义为“重要更新”,并建议用户及时安装本次更新。接下来的内容中将对该漏洞的详细信息进行介绍。
漏洞复现
复现该漏洞只需要以下几步:
1. 以非管理员用户登录Windows7
2. 运行regedit.exe打开注册表编辑器
3. 选择注册表编辑器左边的“HKEY_USERS”
4. 点击菜单“文件”=>“加载配置单元”
5. 选择POC文件POC.hiv并打开
6. 在弹出框中的“键值”中输入随意字符
7. 接着你就可以看到蓝屏了,如下图
漏洞分析
该漏洞主要在解析构造的POC.hiv文件时触发,所以,我们先来瞧瞧这个文件长什么样,下图为POC.hiv文件的主要结构
正如图中标明部分所示,整型溢出发生在NKCELL结构中的ValueCount处,构造的值为0x80000001。根据本人的分析,漏洞存在于函数"CmpCheckKey"处,下面为该函数的代码片段:
PAGE:82C10E9B ; int __thiscall CmpCheckKey(int, char, int, int, ULONG_PTR BugCheckParameter3, PRTL_BITMAP BitMapHeader)
PAGE:82C10E9B _CmpCheckKey@24 proc near
PAGE:82C114C0 loc_82C114C0: ; CODE XREF: CmpCheckKey(x,x,x,x,x,x)+60Fj
PAGE:82C114C0 mov edx, [ebp+var_14] ; edx值为从POC偏移0x1048处获取的0x80000001
PAGE:82C114C3 shl edx, 2 ; edx乘4,这里导致整型溢出,然后edx值变为4
PAGE:82C114C6 cmp edx, 4
PAGE:82C114C9 jb short loc_82C11512 ; 比较的结果为false
PAGE:82C114CB mov ecx, [ebp+BugCheckParameter3]
PAGE:82C114CE mov eax, esi
PAGE:82C114D0 call _HvGetCellSize@8 ; HvGetCellSize(x,x)
PAGE:82C114D5 cmp edx, eax ; eax(0xc)与edx(4)进行比较
PAGE:82C114D7 ja short loc_82C11512 ; 比较结果为false
PAGE:82C114D9 lea eax, [ebp+var_C]
PAGE:82C114DC push eax
PAGE:82C114DD push [ebp+arg_4]
PAGE:82C114E0 mov al, [edi+2]
PAGE:82C114E3 push [ebp+var_14] ; 构造的ValueCount值0x80000001入栈
PAGE:82C114E6 shr al, 4
PAGE:82C114E9 and al, 1
PAGE:82C114EB push ecx
PAGE:82C114EC mov ecx, [ebp+BitMapHeader]
PAGE:82C114EF movzx eax, al
PAGE:82C114F2 push eax
PAGE:82C114F3 push esi
PAGE:82C114F4 lea edx, [ebp+var_10]
PAGE:82C114F7 call _CmpCheckValueList@32 ; 调用函数触发windows内核错误检查
PAGE:82C114FC test eax, eax
…
下面是函数“_CmpCheckValueList@32”的代码片段
PAGE:82C11F24 ; __stdcall CmpCheckValueList(x, x, x, x, x, x, x, x)
PAGE:82C11F24 _CmpCheckValueList@32 proc near
PAGE:82C17253 loc_82C17253: ; CODE XREF: CmpCheckValueList(x,x,x,x,x,x,x,x)+32Bj
PAGE:82C17253 mov ecx, [ebp+var_44]
PAGE:82C17256 cmp [ecx], eax
PAGE:82C17258 jnb short loc_82C1725C
PAGE:82C1725A mov [ecx], eax
PAGE:82C1725C
PAGE:82C1725C loc_82C1725C: ; CODE XREF: CmpCheckValueList(x,x,x,x,x,x,x,x)+334j
PAGE:82C1725C inc [ebp+var_20] ; [ebp+var_20]的值在第一次循环中变为1

◆◆0
MS16-124:微软内核整型溢出漏洞
分页阅读: 1 2
发表评论