【问题标题】:Is ARM a more secure instruction set?ARM 是更安全的指令集吗?
【发布时间】:2010-03-02 12:26:29
【问题描述】:

我已经读到“普通”ARM 指令是固定长度的 - 32 位。并且没有 ARM 指令可以跳转到另一条指令的中间——这对于 x86 指令来说很容易做到。

(对于 x86,Google 的 NaCl 尝试通过在 32 字节边界上对齐指令来“修复”这个问题。)

这会使 ARM 程序更安全还是更能抵抗某些攻击?

如果是这样,这是否扩展到 Thumb 和 Java 指令?

【问题讨论】:

  • 如果攻击者处于可以导致程序计数器与指令不一致的位置,则他可能已经在利用其他地方的安全漏洞,因此系统的安全性已经受到损害。
  • ARM 代码有可能吗?

标签: java x86 arm security


【解决方案1】:

可以更安全的地方是扫描操作码到沙箱进程时。如果要禁止或拦截某些指令,在固定长度的指令集上这样做会更容易。在 x86 架构上,指令集取决于上下文,并且指令具有可变长度,因此如果您从正确的偏移量解析它,看起来无害的指令实际上可以嵌入另一条指令。您可以有效地“在指令中间跳转”并且仍然有有效的指令。

ARM 更容易解析,拇指模式不会改变这一点。所以 ARM 指令集本身并不是特别安全,但是解析起来要容易得多,对于像沙盒这样的 NaCl 来说,正确的解析是必要的

这是简短且可能不准确的答案。如需更明确的答案,请查看此blog post 在优秀的 matasano 博客上

【讨论】:

    【解决方案2】:

    您正在考虑破坏堆栈返回地址或类似的攻击,使其分支成有效负载,对吗?我想,字对齐并没有太大的帮助或障碍——您只需将有效负载对齐 4 个字节。哦,x64 需要 16 字节指令对齐。

    这是你的意思吗?

    【讨论】:

    • 我认为 Google 的 NaCl 在 32 位模式下使用 32 字节对齐。它们(目前?)不支持 64 位模式。 nativeclient.googlecode.com/svn/data/docs_tarball/nacl/…code.google.com/p/nativeclient
    • x64(如 x86)根本不需要指令对齐。一些指令 (SSE) 需要它们的 数据 是 16 字节对齐的。但绝对指令本身不必对齐。毕竟它们中的许多都是一个字节长:)
    • NaCl 也不会尝试通过在 32 字节边界上对齐指令来“修复”此问题。函数或循环可以对齐,但不是单独的指令,所有现代编译器都会这样做
    猜你喜欢
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多