选择 conforming 还是 non-conforming ?

本文详细解析了non-conforming与conforming codesegmentdescriptor的区别,强调使用non-conforming类型能有效避免低权限向高权限转移时的隐患,包括权限错误、指令执行异常及stack切换问题,同时阐述了在call-gate操作下的安全特性,进一步论证了non-conforming类型的优越性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:点击打开链接

code segment descriptor 的 C 位表示 code segment 是 conforming 还是 non-conforming 类型,C = 1 代表 conforming 类型,C = 0 代表 non-conforming。conforming 类型可以允许低权限向高权限转移,而不需要通过 call-gate。低权限向高权限的 non-conforming 转移则必须通过 call-gate。


显然,使用 non-conforming 比使用 conforming 更为安全,因为:

原因 1、当 far call/jmp 到 code segment 直接跳转时(使用 code segment selector):

(1)选择 conforming 类型仅需要 CPL >= DPL 权限就可以了,也就是说:可以直接从低权限向高权限的 code segment 转移,但是 CPL 是不改变的。
  这样存在着隐患,由于 CPL(当前的 processor 权限)不改变,但是代码却从低权限转到了高权限,导致:若高权限的代码之中使用了高权限的指令,而 CPL 还停留在低权限上,执行这样的指令会导致异常发生,这是其一。
  其二:高权限的代码使用的是高权限的 stack,但由于 CPL 不变,导致不能发生正确的 stack 切换。

(2)而选择 non-conforming 类型需要更严格的权限,需:CPL == DPL 且 RPL <= DPL。
  很明显,使用 non-conforming 类型不能从低权限转向高权限,必须 CPL == DPL,只能要同级权限之中转移。这样就避免了不必要的隐患。



原因 2:当通过 call-gate 来 far call/jmp 到 code segment 时:

(1)选择 conforming 类型的需要权限:(CPL <= DPLg) && (RPL <= DPLg) 并且 (CPL >= DPLs)
(2)选择 non-conforming 虽然需要同样的权限:(CPL <= DPLg) && (RPL <= DPLg) 并且 (CPL >= DPLs)。
  但是,在 non-conforming 下仅允许使用 call 指令转移到高权限,不允许使用 jmp 指令转移到高权限代码。
使用 jmp call-gate 导致产生两个问题:
其一:jmp 指令不能正确返回到原调用的代码。由于没有将原 CS:RIP 入栈保存,系统服务例程 ret 时,将会出错。
其二:由于不能正确返回,可能导致不能从高权限代码返回低权限代码,processor 将一直运行在高权限代码中。

  使用 jmp call-gate 指令到 non-conforming 仅允许同级转移,即:CPL <= DPLg && RPL<= DPLg 并且 CPL == DPLs
  jmp 指令只能同级转移(不能调用系统服务例程),使用 non-conforming 类型将不允许 jmp 指令转移到高权限代码,避免隐患。  

-------------------------------------------------------------------------------

  综上所述两个原因,使用 non-conforming 类型更符合 x86 / x64 的保护机制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值