【漏洞分析】MS16-124:微软内核整型溢出漏洞
2016-11-03 14:59:09
来源:安全客 作者:scriptkid
阅读:1009次
点赞(0)
收藏
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://blog.fortinet.com/2016/10/31/microsoft-kernel-integer-overflow-vulnerability
2016-11-03 14:59:09
来源:安全客 作者:scriptkid
阅读:1009次
点赞(0)
收藏
翻译:scriptkid
预估稿费:100RMB(不服你也来投稿啊!)
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
前言
上个月我发现并报告了一个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__thiscallCmpCheckKey(int,char,int,int,ULONG_PTRBugCheckParameter3,PRTL_BITMAPBitMapHeader) PAGE:82C10E9B_CmpCheckKey@24procnear ... PAGE:82C114C0loc_82C114C0:;CODEXREF:CmpCheckKey(x,x,x,x,x,x)+60Fj PAGE:82C114C0movedx,[ebp+var_14];edx值为从POC偏移0x1048处获取的0x80000001 PAGE:82C114C3shledx,2;edx乘4,这里导致整型溢出,然后edx值变为4 PAGE:82C114C6cmpedx,4 PAGE:82C114C9jbshortloc_82C11512;比较的结果为false PAGE:82C114CBmovecx,[ebp+BugCheckParameter3] PAGE:82C114CEmoveax,esi PAGE:82C114D0call_HvGetCellSize@8;HvGetCellSize(x,x) PAGE:82C114D5cmpedx,eax;eax(0xc)与edx(4)进行比较 PAGE:82C114D7jashortloc_82C11512;比较结果为false PAGE:82C114D9leaeax,[ebp+var_C] PAGE:82C114DCpusheax PAGE:82C114DDpush[ebp+arg_4] PAGE:82C114E0moval,[edi+2] PAGE:82C114E3push[ebp+var_14];构造的ValueCount值0x80000001入栈 PAGE:82C114E6shral,4 PAGE:82C114E9andal,1 PAGE:82C114EBpushecx PAGE:82C114ECmovecx,[ebp+BitMapHeader] PAGE:82C114EFmovzxeax,al PAGE:82C114F2pusheax PAGE:82C114F3pushesi PAGE:82C114F4leaedx,[ebp+var_10] PAGE:82C114F7call_CmpCheckValueList@32;调用函数触发windows内核错误检查 PAGE:82C114FCtesteax,eax …下面是函数“_CmpCheckValueList@32”的代码片段
PAGE:82C11F24;__stdcallCmpCheckValueList(x,x,x,x,x,x,x,x) PAGE:82C11F24_CmpCheckValueList@32procnear ... PAGE:82C17253loc_82C17253:;CODEXREF:CmpCheckValueList(x,x,x,x,x,x,x,x)+32Bj PAGE:82C17253movecx,[ebp+var_44] PAGE:82C17256cmp[ecx],eax PAGE:82C17258jnbshortloc_82C1725C PAGE:82C1725Amov[ecx],eax PAGE:82C1725C PAGE:82C1725Cloc_82C1725C:;CODEXREF:CmpCheckValueList(x,x,x,x,x,x,x,x)+334j PAGE:82C1725Cinc[ebp+var_20];[ebp+var_20]的值在第一次循环中变为1 PAGE:82C1725Fadd[ebp+var_38],4 PAGE:82C17263jmploc_82C16F89;跳转到第二层循环 ... PAGE:82C173FFloc_82C173FF:;CODEXREF:CmpCheckValueList(x,x,x,x,x,x,x,x)+4D3j PAGE:82C173FFpush0 PAGE:82C17401push[ebp+arg_10] PAGE:82C17404moveax,esi PAGE:82C17406call_HvMarkCellDirty@12;HvMarkCellDirty(x,x,x) PAGE:82C1740Btestal,al PAGE:82C1740Djzloc_82C175B8 PAGE:82C17413push0 PAGE:82C17415pushdwordptr[edi+28h] PAGE:82C17418moveax,esi PAGE:82C1741Acall_HvMarkCellDirty@12;HvMarkCellDirty(x,x,x) PAGE:82C1741Ftestal,al PAGE:82C17421jzloc_82C175B8 PAGE:82C17427decdwordptr[edi+24h] PAGE:82C1742Adec[ebp+arg_C];[ebp+arg_C]是作为调用的一个参数传进来的,值为0x80000001,这里减1 PAGE:82C1742Dmoveax,[ebp+arg_C] PAGE:82C17430subeax,[ebp+var_20];[ebp+var_20]是从上面的第一层循环中得到的,值为1.0x80000000减一得到0x7fffffff PAGE:82C17433shleax,2;eax乘4,得到0xfffffffc PAGE:82C17436pusheax;构造的memcpy大小0xfffffffc入栈 PAGE:82C17437moveax,[ebp+var_38] PAGE:82C1743Aleaecx,[eax+4] PAGE:82C1743Dpushecx;void* PAGE:82C1743Epusheax;void* PAGE:82C1743Fcall_memmove;调用函数触发堆溢出 PAGE:82C17444movesi,[esi+28h] ...下面是函数"_memmove"的代码片段:
... .text:82A7C6ABandedx,3 .text:82A7C6AEcmpecx,8;switch8cases .text:82A7C6B1jbshortloc_82A7C6DC; .text:82A7C6B3repmovsd;最后在这里因为复制内存大小过大堆溢出 .text:82A7C6B5jmpds:off_82A7C7CC[edx*4] ...总结
该漏洞是在执行内存复制操作时由于整型溢出带动堆溢出造成的,成功利用该漏洞可以导致本地权限提升。
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://blog.fortinet.com/2016/10/31/microsoft-kernel-integer-overflow-vulnerability