热搜:

Intel Sysret 漏洞在WIN7 X64下的实现分析

2013-03-13 15:10:46文章来源:点点软件园热度:0

更多

  intel sysret 漏洞在WIN7 X64下的实现分析。前半部分是网上现有的文章分析,后半部分为代码实现分析更多最新IT资讯尽在金顺软件园http://www.jinshun168.com/

  1. 漏洞浅析

  在x64系统上,最重要的48位虚拟地址将被用于地址转换,而此外48到63的任何虚拟地址必须是47位的副本。否则处理器会抛出异常:保护故障(GP)。

  这会将虚拟地址分割位两个区块,如:

  · 规范的高阶半区: 0xFFFFFF`FFFFFFFF 0xFFFF8000`00000000

  · 规范的低阶半区: 0x00007FFF`FFFFFFFF 0x00000000`00000000

  而所有这之间的地址都会被认为是不规范的。

  SYSRET指令被用于传递返回到普通用户模式(user-mode)。它将RCX寄存器中的值复制到RIP寄存器中,并把Code Segment Selector位切换位普通用户模式(user-mode)。然而,RCX寄存器是一个通用寄存器,它可能包含的任何值,包括不规范的地址。并且SYSRET指令一旦抛出异常是不负责退栈切换回用户空间的,也不负责为GS寄存器做扫尾工作。这意味着,程序员在调用SYSRET指令前后都需要为GS,RSP,RBP做额外的处理。

  而我们恰好发现intel的SYSRET指令实现中存在一个缺陷: 如果一个不规范的地址从RCX寄存器传递而抛出GP, 那么在CG,RBP和RSP返回普通用户模式(user-mode)前, 其ring0的权限不会被取缔(因为没有任何扫尾工作)。

  2. MS windows中的漏洞触发

  利用这个漏洞的关键是要抛出一个不规范的返回地址,而为了在MS Windows中触发这个漏洞,我们可以有以下的方式:

  · 映射内存并在0x7FFF`FFFFFFFF位执行一个系统调用。这将返回一个不规范的地址。然而,由于Windows地址空间的限制,这个地址是不可达的,因此此路不通罗马。

  · 寻找一个系统调用,并能手动改变返回地址。

  关于后者,可借力于UMS(User-Mode Scheduling 用户模式计划程序)。

  ps: MSDN,UMS是一个轻量级的机制,应用程序可以用它来安排自己的线程。应用程序可以在用户模式下自由进行UMS线程间的切换而不必不涉及系统调度。

  为了使用UMS线程,可以用CreateUmsCompletionList()函数创建一个的UMS调度列表。scheduler线程将被链接到此调度列表,而scheduler线程也将需要被创建(scheduler线程通过EnterUmsSchedulingMode()从普通线程晋升为UMS线程)。

  如果UMS线程启动或阻塞,那么ExecuteUmsThread()函数需要被调用。如果没有, scheduler需要确定哪些线程将随后运行。它将排列调度列表,选择正确的线程。

  EnterUmsSchedulingMode()函数是ntdll.dll中实现的。从汇编代码中,我们可以看到,它得到当前的UMS线程,完成链接调度列表,保存线程上下文(寄存器),然后调用RtlpUmsPrimaryContextWrap()函数。

  1. .text:0000000078F33A20 RtlEnterUmsSchedulingMode

  2. .text:0000000078F33A20

  3. .text:0000000078F33A20 arg_0 = qword ptr 8

  4. .text:0000000078F33A20 arg_8 = qword ptr 10h#p#分页标题#e#

  5. .text:0000000078F33A20 arg_10 = qword ptr 18h

  6. .text:0000000078F33A20

  7. .text:0000000078F33A20 mov [rsp+arg_8], rbx

以上,就是金顺软件园小编给大家带来的Intel Sysret 漏洞在WIN7 X64下的实现分析全部内容,希望对大家有所帮助!

上一篇lol美服更新锤石上线、英雄技能价格调整介绍下一篇AV-C最新杀毒软件评级:360检测率中位列第一、误报率也是居世界首
编辑:点点小编