FavoriteLoading
0

MS16-124:微软内核整型溢出漏洞

前言
上个月我发现并报告了一个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

分页阅读: 1 2
【声明】:8090安全小组门户(http://www.8090-sec.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱hack@ddos.social,我们会在最短的时间内进行处理。