CVE:CVE-2009-2793
CNNVD:CNNVD-200909-379
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，内核栈会由于这个漏洞而变得不同步，这可能允许攻击者获得权限提升。
solution:Upgrade netbsd netbsd to a higher version than 5.0.1,0.8,0.9,1.0,1.1,1.2,1.2.1,1.3,1.3.1,1.3.2,1.3.3,1.5,1.5.1,1.5.2,1.5.3,1.6,1.6.1,1.6.2,2.0,2.0.1,2.0.2,2.0.3,2.1,3.0,3.0.1,3.0.2,3.1,4.0,4.0.1,5.0,and avoid the version (,5.0.1],0.8,0.9,1.0,1.1,1.2,1.2.1,1.3,1.3.1,1.3.2,1.3.3,1.5,1.5.1,1.5.2,1.5.3,1.6,1.6.1,1.6.2,2.0,2.0.1,2.0.2,2.0.3,2.1,3.0,3.0.1,3.0.2,3.1,4.0,4.0.1,5.0