最近,我参加了计算机组织课程,该课程在逻辑门级别解释了 CPU 的工作原理等......
到目前为止,我一直将 CPU 视为一个运行汇编指令的黑匣子,即使我在空闲时间学习破解、利用和逆向工程也是如此。
但这让我想知道,在安全领域,有多少研究是使用或组合 CPU 错误(例如软件错误)并使用它来远程运行代码或做其他事情的。
试图寻找计算机漏洞的逆向工程师如果知道 CPU 的内部实现就可以获得优势吗?当然,下降到逻辑门级,而不仅仅是高级组件。
最近,我参加了计算机组织课程,该课程在逻辑门级别解释了 CPU 的工作原理等......
到目前为止,我一直将 CPU 视为一个运行汇编指令的黑匣子,即使我在空闲时间学习破解、利用和逆向工程也是如此。
但这让我想知道,在安全领域,有多少研究是使用或组合 CPU 错误(例如软件错误)并使用它来远程运行代码或做其他事情的。
试图寻找计算机漏洞的逆向工程师如果知道 CPU 的内部实现就可以获得优势吗?当然,下降到逻辑门级,而不仅仅是高级组件。
扩展 perror 的答案:
也许您应该看看Christopher Domas最近发表的名为Breaking the x86 ISA 的白皮书。它发表在 blackhat17 上,描述了一种挖掘 x86 芯片和提取隐藏机器指令的方法。
标题:
打破 x86 ISA
抽象的:
处理器不是运行代码的可信黑匣子;相反,现代 x86 芯片充满了秘密指令和硬件错误。在本文中,我们展示了如何使用页面错误分析和一些创造性的处理器模糊测试来详尽地搜索 x86 指令集并揭示隐藏在芯片组中的秘密。该方法揭示了关键的 x86 硬件故障、以前未知的机器指令、无处不在的软件错误以及企业管理程序中的缺陷。
添加一名作者
https://www.blackhat.com/docs/us-17/thursday/us-17-Domas-Breaking-The-x86-Instruction-Set-wp.pdf
相关资源:
学术界以某种方式相关的微代码内部结构:
标题:
逆向工程 x86 处理器微码
抽象的: 微码是位于 CPU 物理组件之上的抽象层,目前存在于大多数通用 CPU 中。除了促进复杂和庞大的指令集之外,它还提供了一种更新机制,允许在不需要任何特殊硬件的情况下就地修补 CPU。虽然众所周知 CPU 会定期使用这种机制进行更新,但鉴于微码和更新机制是专有的并且尚未经过彻底分析,因此对其内部工作知之甚少。在本文中,我们以 AMD 的 K8 和 K10 微体系结构为例,对传统 COTS CPU 的微代码语义及其更新机制的内部工作原理进行了逆向工程。此外,我们还演示了如何开发自定义微码更新。我们描述了微码语义,并另外提供了一组微程序,展示了该技术提供的可能性。为此,我们的微程序范围从 CPU 辅助工具到微编码木马,甚至可以从 Web 浏览器中访问,并支持远程代码执行和加密实施攻击。
作者: Philipp Koppe、Benjamin Kollenda、Marc Fyrbiak、Christian Kison、Robert Gawlik、Christof Paar 和 Thorsten Holz
http://syssec.rub.de/media/emma/veroeffentlichungen/2017/08/16/usenix17-microcode.pdf
相关工作/阅读:
编辑:我添加了丹提到的参考。
标题:
Page Fault Liberation Army or Gained in Translation:x86 虚拟内存创造性使用的历史
抽象的:
x86 处理器包含数量惊人的内置内存转换逻辑,这些逻辑由具有复杂条目格式的各种数据表驱动,可以产生各种陷阱和其他有趣的计算效果。这些功能大多是更早、更文明时代的遗物,当时绝地武士试图通过分段、管理器位和硬件任务支持来保护旧共和国操作系统,但由于处理器去优化和性能问题而失败,并且被 Windows 和 Windows 未使用和 UNIX 系统——只有黑客才能探索。对于世界其他地方,x86 PC 是一种“冯诺依曼架构”,它的大部分奇怪之处都没有使用。
作者:朱利安·班格特和谢尔盖·布拉图斯
https://media.ccc.de/v/29c3-5265-en-page_fault_liberation_army_h264
编辑:我添加了最近发布的幽灵或崩溃攻击,它利用了现代处理器中的关键漏洞。
标题:
Meltdown and Spectre:现代计算机中的漏洞会泄露密码和敏感数据
域名注册地址:
Meltdown 和 Spectre 利用现代处理器中的关键漏洞。这些硬件错误允许程序窃取当前在计算机上处理的数据。虽然程序通常不允许从其他程序读取数据,但恶意程序可以利用 Meltdown 和 Spectre 来获取存储在其他运行程序内存中的秘密。这可能包括您存储在密码管理器或浏览器中的密码、您的个人照片、电子邮件、即时消息,甚至是关键业务文档。
纸:
https://meltdownattack.com/meltdown.pdf
https://spectreattack.com/spectre.pdf
相关资源:
事实上,CPU 的检查和验证比程序要多得多。在 CPU 中发现(重大)错误的可能性很小。尽管它不时发生。
因此,查看软件错误(因为它们更有可能)比查看硬件错误有趣得多。
然而,您会遇到一些导致泄露某些“秘密”的硬件错误。最著名的可能是来自贝尔公司的那个(2600Hz 错误)。
基本上,这个错误来自这样一个事实,即它们是在电话亭和电信中心之间传输的两种类型的信号。的指令信号和语音信号:
命令信号:它们用于发送命令,例如电话呼叫的目的地(电话号码)、通信的开始/结束、支付的硬币数量等。
语音信号:它们用于对电话通信的音频信号进行编码。
所有这些信号都被编码成电信号并从电话亭发送到中央。问题来自这样一个事实,即语音信号的编码模块并没有严格限制在通常的人类语音频率上。人们可以在电话中发出一种不寻常的声音,并获得一种编码,中央可以将其理解为命令信号。
事实上,一个黑客确实意识到,如果你发出 2600Hz 的声音,这个信号的音频编码对应的是一个长途电话的命令信号(就好像你在电话亭里插入了一个 25 美分的硬币) )。而且,非常巧合的是,此时一个名为“ Cap'n Crunch ”的谷物品牌(用于儿童早餐)正在向他的顾客提供一种产生完全相同频率声音的哨子。
这时候,这些麦片盒变得很流行,电话公司确实亏了一点钱。:-)
现代微处理器非常复杂,但可能可以用比操作系统加库等更少的代码行来表示(虽然一个用 Verilog 编码,另一个用 C 编码。)尽管如此,复杂性如此之大,以至于拥有源代码不会有多大好处。
如果我们专注于指令执行(相对于外设功能,如内存管理),功能定义非常明确,因此很容易验证。此外,错误的代价是相当高的——你不能像在软件中那样简单地推出补丁。因此,设计在流片前要进行数天的模拟,甚至有正式的方法来证明芯片的每个部分都经过了锻炼。
然而,CPU 保持的状态数量是天文数字。很快就会发现 CPU 一直跳到错误指令的错误。现实情况是,可能会出现一系列罕见的事件——鉴于乱序处理器的随机性,甚至可能不容易重现——这会导致不当行为。这样的漏洞也很难被利用。
出片后确实有bug。大多数处理器都有勘误表,很少有设计在 A0(一个完整的流片输出,没有金属修复)硅片上投入生产。但是,我主要看到外围功能中的错误或设计差距。有关错误列表的示例,请搜索“Skylake 勘误表”之类的内容。
作为一个非常具体的例子,我相信你可以采用最近承认的 SKL150 勘误表,并在它的基础上构建一个漏洞利用,它可以通过验证系统、JIT 编译的语言等,因为它打破了处理器行为的基本假设按照设计。
据报道,SKL150 的“症状”正在崩溃,但这只是因为受影响的值是一个无效的指针,但您同样可以使用所有常规技术来利用它。当然,这大概是 10 个难度级别中的 9 个。