是否可以针对单个ret指令临时禁止Intel CET,或者以其他方式使用retpoline?

约瑟夫·西布尔-恢复莫妮卡

英特尔CET(控制流实施技术)由两部分组成:SS(影子堆栈)和IBT(间接分支跟踪)。如果您endbr64由于某种原因需要间接分支到您不能放置的位置,可以使用取消单个jmpcall指令的IBT notrack是否有等效方法可以抑制单个ret指令的SS

对于上下文,我正在考虑它将如何与retpolines交互,retpolines的关键控制流程差不多push real_target; call retpoline; pop junk; ret如果没有为此抑制SS的方法ret,那么启用CET时是否还有其他方法可以使折线工作?如果没有,我们将有哪些选择?我们是否需要为所有内容维护两组二进制软件包,一组用于需要折线的旧CPU,另一组用于支持CET的新CPU?如果英特尔证明是错误的,那我们最终仍然需要在他们的新CPU上使用repoline吗?我们将不得不放弃CET来使用它们吗?

约瑟夫·西布尔-恢复莫妮卡

经过一段时间的组装后,我发现您可以在CET中使用retpolines,但这并不理想。这是如何做。作为参考,请考虑以下C代码:

extern void (*fp)(void);

int f(void) {
    fp();
    return 0;
}

编译gcc -mindirect-branch=thunk -mfunction-return=thunk -O3产生如下结果:

f:
        subq    $8, %rsp
        movq    fp(%rip), %rax
        call    __x86_indirect_thunk_rax
        xorl    %eax, %eax
        addq    $8, %rsp
        jmp     __x86_return_thunk
__x86_return_thunk:
        call    .LIND1
.LIND0:
        pause
        lfence
        jmp     .LIND0
.LIND1:
        lea     8(%rsp), %rsp
        ret
__x86_indirect_thunk_rax:
        call    .LIND3
.LIND2:
        pause
        lfence
        jmp     .LIND2
.LIND3:
        mov     %rax, (%rsp)
        ret

事实证明,您可以通过将thunk修改为如下形式来使其工作:

__x86_return_thunk:
        call    .LIND1
.LIND0:
        pause
        lfence
        jmp     .LIND0
.LIND1:
        push    %rdi
        movl    $1, %edi
        incsspq %rdi
        pop     %rdi
        lea     8(%rsp), %rsp
        ret

__x86_indirect_thunk_rax:
        call    .LIND3
.LIND2:
        pause
        lfence
        jmp     .LIND2
.LIND3:
        push    %rdi
        rdsspq  %rdi
        wrssq   %rax, (%rdi)
        pop     %rdi
        mov     %rax, (%rsp)
        ret

通过使用incsspqrdsspqwrssq说明,您可以修改叠影,以配合您的更改应用到实际堆栈。我用Intel SDE测试了这些修改过的thunk ,它们确实使控制流错误消失了。

那是个好消息。这是个坏消息:

  1. 与不同的是endbr64,我在thunk中使用的CET指令在不支持CET的CPU上不是NOP(它们导致SIGILL)。这意味着您需要两套不同的转换程序,并且需要使用CPU分派以根据CET是否可用来选择正确的转换程序。
  2. 完全使用retpoline意味着您不再需要进行任何间接分支,因此尽管您仍然可以获得SS的好处,但是您完全否定了IBT。我想您可以通过__x86_indirect_thunk_rax检查endbr64指令是否存在来解决此问题,但这确实不够优雅,而且可能会很慢。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

mov 指令不能以其他方式工作

来自分类Dev

是否以其他方式使用try / catch,但有例外情况?

来自分类Dev

是否可以使目录中的所有文件始终创建为/ dev / null的符号链接,或者以其他方式忽略对它们的所有写操作?

来自分类Dev

安全模式下的双启动是否可以以其他方式工作?

来自分类Dev

Guava是否支持合同类,或以其他方式允许界面文档?

来自分类Dev

我可以使用Docker变量在Swagger UI 2.x中启用请求持续时间吗(或以其他方式)?

来自分类Dev

PDF 文件是否可以定义 0 个页面或以其他方式导致页面大小为 0?

来自分类Dev

从master合并43个提交到功能分支是否比以其他方式合并1个提交“难”?

来自分类Dev

Microsoft Bot Framework 是否“回拨”或以其他方式向第 3 方发送数据?

来自分类Dev

在CMD / .bat中,我可以将目录从C更改为D,但不能以其他方式更改吗?

来自分类Dev

我可以哈希/加密或以其他方式保护Django应用程序中的电子邮件免受黑客攻击吗?

来自分类Dev

有没有一种方法可以附加到对象URL或以其他方式创建流作为URL?

来自分类Dev

默认情况下,UDP(使用Java还是其他方式)是否为全双工?

来自分类Dev

默认情况下,UDP(使用Java还是其他方式)是否为全双工?

来自分类Dev

是否可以使用Google表格中的复选框使用sumproduct(或其他方式)从库存中减去?

来自分类Dev

是否可以在运行时使用Reflection API或其他方式访问方法的局部变量?

来自分类Dev

MongoDB 3.4 - 是否可以使用 `$graphlookup` 或其他方式从 2 个以上的集合执行连接?

来自分类Dev

我编写了一个程序来检查矩阵是否对称。尽管两者似乎都正确,但它只能以一种方式起作用,而不能以其他方式起作用

来自分类Dev

如何将匿名函数传递给Celery任务?(或者以其他方式实现我的目标?)

来自分类Dev

是否可以在Unity或其他方式中以自然方式为任何东西设置动画?

来自分类Dev

由于在C ++中使用了异步IO,因此可以通过其他方式延迟我的程序而不休眠。

来自分类Dev

我可以使用API或其他方式接近VBA中的“真实随机数”吗?

来自分类Dev

我可以使用用户名/密码以外的其他方式来保护网页吗

来自分类Dev

用户可以使用javascript或任何其他方式来操纵只读字段中的值吗?

来自分类Dev

可以使用对象方法或 javascript 中的其他方式进一步优化吗?

来自分类Dev

查询需要以其他方式显示数据

来自分类Dev

如何以其他方式变形数据

来自分类Dev

以其他方式创建LatLng时,“递归过多”

来自分类Dev

如何以其他方式编写此查询

Related 相关文章

  1. 1

    mov 指令不能以其他方式工作

  2. 2

    是否以其他方式使用try / catch,但有例外情况?

  3. 3

    是否可以使目录中的所有文件始终创建为/ dev / null的符号链接,或者以其他方式忽略对它们的所有写操作?

  4. 4

    安全模式下的双启动是否可以以其他方式工作?

  5. 5

    Guava是否支持合同类,或以其他方式允许界面文档?

  6. 6

    我可以使用Docker变量在Swagger UI 2.x中启用请求持续时间吗(或以其他方式)?

  7. 7

    PDF 文件是否可以定义 0 个页面或以其他方式导致页面大小为 0?

  8. 8

    从master合并43个提交到功能分支是否比以其他方式合并1个提交“难”?

  9. 9

    Microsoft Bot Framework 是否“回拨”或以其他方式向第 3 方发送数据?

  10. 10

    在CMD / .bat中,我可以将目录从C更改为D,但不能以其他方式更改吗?

  11. 11

    我可以哈希/加密或以其他方式保护Django应用程序中的电子邮件免受黑客攻击吗?

  12. 12

    有没有一种方法可以附加到对象URL或以其他方式创建流作为URL?

  13. 13

    默认情况下,UDP(使用Java还是其他方式)是否为全双工?

  14. 14

    默认情况下,UDP(使用Java还是其他方式)是否为全双工?

  15. 15

    是否可以使用Google表格中的复选框使用sumproduct(或其他方式)从库存中减去?

  16. 16

    是否可以在运行时使用Reflection API或其他方式访问方法的局部变量?

  17. 17

    MongoDB 3.4 - 是否可以使用 `$graphlookup` 或其他方式从 2 个以上的集合执行连接?

  18. 18

    我编写了一个程序来检查矩阵是否对称。尽管两者似乎都正确,但它只能以一种方式起作用,而不能以其他方式起作用

  19. 19

    如何将匿名函数传递给Celery任务?(或者以其他方式实现我的目标?)

  20. 20

    是否可以在Unity或其他方式中以自然方式为任何东西设置动画?

  21. 21

    由于在C ++中使用了异步IO,因此可以通过其他方式延迟我的程序而不休眠。

  22. 22

    我可以使用API或其他方式接近VBA中的“真实随机数”吗?

  23. 23

    我可以使用用户名/密码以外的其他方式来保护网页吗

  24. 24

    用户可以使用javascript或任何其他方式来操纵只读字段中的值吗?

  25. 25

    可以使用对象方法或 javascript 中的其他方式进一步优化吗?

  26. 26

    查询需要以其他方式显示数据

  27. 27

    如何以其他方式变形数据

  28. 28

    以其他方式创建LatLng时,“递归过多”

  29. 29

    如何以其他方式编写此查询

热门标签

归档