安全研究

安全漏洞
NetBSD IRET通用保护错误处理本地权限提升漏洞

发布日期:2009-09-16
更新日期:2009-09-17

受影响系统:
NetBSD NetBSD <= 5.0.1
描述:
BUGTRAQ  ID: 36430
CVE ID: CVE-2009-2793

NetBSD是一款免费开放源代码的UNIX性质的操作系统。

在Intel架构上,操作系统内核完成了对中断或异常的服务后通常会使用iret返回到用户态。iret指令会恢复执行继续所需的上下文,如代码段、指令指针、标记等。在受保护模式中iret会分为两个不同的阶段执行,分别为提交前阶段(pre-commit,权限级别改变之前)和提交后阶段(post-commit,权限级别改变后)。可在以下伪代码中找到提交点:

IF new mode != 64-Bit Mode
  THEN
    IF tempEIP is not within code segment limits
      THEN #GP(0); FI;
    EIP <- tempEIP;
  ELSE (* new mode = 64-bit mode *)
    IF tempRIP is non-canonical
      THEN #GP(0); FI;
    RIP <- tempRIP;
FI;
CS <- tempCS;  // This is the commit point (privilege switch)
EFLAGS (CF, PF, AF, ZF, SF, TF, DF, OF, NT) <- tempEFLAGS;

当处理器在处理异常时,会出现两种情况:

- 与中断的过程相同的权限级别执行处理器过程,不会发生栈切换。
- 以不同的权限级别执行处理器过程,因此会发生栈切换。

如果发生了栈切换,所生成的栈帧会不同,因为处理器要保存中断过程的栈。当iret返回到不同的权限级别时,出现失败时的行为会取决于运算当前所处的阶段:提交前失败不会导致栈切换,而提交后失败会导致栈切换,因此生成不同的陷阱帧。

对于NetBSD,内核栈会由于这个漏洞而变得不同步,这可能允许攻击者获得权限提升。

<*来源:Tavis Ormandy (taviso@gentoo.org
  
  链接:http://marc.info/?l=bugtraq&m=125312746502532&w=2
        http://blog.cr0.org/2009/09/cve-2009-2793-iret-gp-on-pre-commit.html
        http://secunia.com/advisories/36775/
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

http://marc.info/?l=bugtraq&m=125312746502532&w=2

建议:
厂商补丁:

NetBSD
------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://www.netbsd.org/Security/

浏览次数:2252
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障