但是,这让我想知道,在安全性领域中,正在使用或组合CPU错误(例如软件错误)进行多少研究,并使用它来远程运行代码或执行其他操作。
如果试图了解计算机漏洞的逆向工程师是否知道CPU的内部实现,它们是否会获得优势?当然,下降到逻辑门级的不仅仅是高端组件。
#1 楼
要扩展对恐怖的回答:也许您应该看一下克里斯托弗·多马斯(Christopher Domas)最近发表的白皮书《打破x86 ISA》。它发布在blackhat17上,描述了一种挖掘x86芯片并提取隐藏的机器指令的方法。
标题:
突破x86 ISA的方法
摘要:
处理器不是运行代码的受信任黑匣子;相反,现代的x86芯片上充斥着秘密指令和硬件错误。在本文中,我们演示了页面错误分析和一些创新的处理器模糊处理如何用于穷举搜索x86指令集并揭示芯片组中隐藏的秘密。严重的x86硬件故障,以前
未知的机器指令,无处不在的软件错误以及
企业管理程序中的缺陷。
作者:Christopher Domas
https://www.blackhat.com/ docs / us-17 / thursday / us-17-Domas-Breaking-The-x86-Instruction-Set-wp.pdf
相关资源:
https://github.com/ xoreaxeaxeax / sandsifter
学术界与微码相关的内部代码:
标题:
逆向工程x86处理器微代码
摘要: />微码是CPU物理组件之上的抽象层,并且在当今大多数通用CPU中都存在。除了简化复杂的
指令集外,它还提供了一种更新机制
,该机制允许在不需要任何特殊硬件的情况下就地修补CPU。虽然众所周知,使用这种机制定期更新CPU
,但是由于微码和
更新机制是专有的,并且尚未获得
,因此人们对其内部工作知之甚少
/>通过分析。
在本文中,我们对微码语义进行了逆向工程。
及其常规更新机制的内部工作方式
以AMD K8和
K10微体系结构为例的COTS CPU。此外,我们演示了
如何开发自定义微代码更新。我们描述了微代码的语义,另外还提供了一组微程序,它们演示了该技术提供的可能性。为此,我们的微程序范围
,从CPU辅助工具到微代码特洛伊木马
,甚至都可以从Web浏览器中访问
,并实现远程代码执行和密码实现
攻击。
作者:菲利普·科普(Philipp Koppe),本杰明·科伦达(Benjamin Kollenda),马克·费比亚克(Marc Fyrbiak),克里斯蒂安·基森,罗伯特·高里克,克里斯托夫·帕尔和索尔斯滕·霍尔茨08/16 / usenix17-microcode.pdf
相关工作/阅读:
http://inertiawar.com/microcode/
https://argp.github.io/2017/09/14/re-x86-microcode/
编辑:我添加了Dan提及的参考。
标题:
Page Fault Liberation Army或获得翻译:创造性的x86虚拟内存使用历史
摘要:
x86处理器包含数量惊人的内置在内存转换逻辑中,它由具有复杂条目格式的各种数据表驱动,并可能产生各种陷阱和其他有趣的计算效果。这些功能主要是早期文明时期的遗物,当时Jedi Knights试图通过分段,管理程序位和硬件任务支持来保护Old Republic操作系统,但由于处理器优化不足和性能问题而被击败,并且两个Windows都未使用它们。和UNIX系统-并且仅由黑客开发。对于世界其他地方,x86 PC是“冯·诺伊曼架构”,未使用大多数怪异物。
作者:朱利安·班格特(Julian Bangert)和谢尔盖·布拉图斯(Sergey Bratus)
https://media.ccc.de/v / 29c3-5265-zh-CN_page_fault_liberation_army_h264
编辑:我添加了最近发布的幽灵或崩溃攻击,该攻击利用了现代处理器中的关键漏洞。
标题:
融化和幽灵:现代计算机中的错误会泄漏密码和敏感数据
TLDR:
Meltdown和Spectre利用了现代处理器中的关键漏洞。这些硬件错误使程序可以窃取计算机上当前正在处理的数据。尽管通常不允许程序从其他程序读取数据,但恶意程序可以利用Meltdown和Spectre来获取存储在其他正在运行的程序的内存中的机密信息。这可能包括您存储在密码管理器或浏览器中的密码,您的个人照片,电子邮件,即时消息,甚至是关键业务文档。
纸张:
https://meltdownattack.com/meltdown.pdf
https://spectreattack.com/spectre.pdf
相关资源:
https://googleprojectzero.blogspot.de/2018/01/reading-privileged -memory-with-side.html?m = 1
http://pythonsweetness.tumblr.com/post/169166980422/the-mysterious-case-of-the-linux-页面表
https://lkml.org/lkml/2017/12/27/2
https:// gruss。 cc / files / kaiser.pdf
https://lwn.net/Articles/741878/
https://lwn.net / Articles / 738975 /
#2 楼
实际上,与程序相比,对CPU的检查和验证要多得多。在CPU中发现(重大)错误的可能性很小。即使它不时发生。因此,与硬件错误相比,查看软件错误(因为它们更有可能)更有趣。
但是,您发生过几次硬件错误,导致某些“秘密”的泄露。最有名的一个可能是贝尔公司的一个(2600Hz错误)。
基本上,此错误是由于它们是电话亭和电信之间传输的两种信号而产生的。中央。命令信号和语音信号:
命令信号:它们用于发送命令,例如电话的目的地(电话号码),通信的开始/结束,
语音信号:用于对电话通讯的音频信号进行编码。
所有这些信号都被编码为电信号,并从到中央的电话亭。问题出在以下事实:来自语音信号的编码模块未严格限制于普通的人类语音频率。人们可能会在电话中产生异常声音,并获得一种编码,该编码将被中央理解为命令信号。
实际上,一个黑客确实意识到,如果您产生2600Hz的声音,该信号的音频编码与长途电话的命令信号相对应(就像您在电话亭中插入25美分的硬币一样)。而且,这是一个偶然的巧合,这时一个名为“ Cap'n Crunch”的谷物(用于儿童早餐)正向他的顾客发出哨声,发出的声音与此频率完全相同。
这时候,这些麦片盒非常受欢迎,电话公司的确花了一些钱。 :-)
评论
尽管您可能(不容易)找到现代CPU中的实际实现错误,但通过了解系统部件,指令集的角落以及诸如TPM之类的较新实现之间的许多复杂交互,可以在安全领域中获得很多好处。
–大卫
17年9月10日在21:40
#3 楼
现代微处理器非常复杂,但是与操作系统和库等相比,它可以用更少的代码行来表示。(尽管其中一个用Verilog编码,另一个用C编码。)尽管如此,其复杂性非常高,以至于拥有源代码如果我们专注于指令执行(相对于内存管理等外围功能),则功能定义得很好,因此易于验证。而且,错误的代价很高-您不能像在软件中那样简单地发布补丁。因此,设计要经过数天的仿真,然后才能进行流片,甚至有正式的方法来证明芯片的每个部分都已行使。
但是,CPU保持的状态量是天文数字。很快就会发现CPU始终跳到错误指令的错误。现实情况是,可能会发生罕见的事件序列-考虑到乱序处理器的随机性,可能甚至不容易重现-导致行为异常。这样的错误也很难利用。
确实有一些错误是在磁带输出后发现的。大多数处理器都有勘误表,并且很少有设计可以在A0(完整的磁带输出,没有金属固定)硅上生产。但是,我主要看到外围功能中的错误或设计空白。有关错误的示例列表,请搜索“ Skylake errata”之类的内容。
评论
>您不能像在软件中那样简单地发布补丁程序-不再如此;通过操作系统或主板固件更新来应用微码更新,可以(并且经常)修复许多高级CPU错误。特别是OS更新与其他OS /驱动程序更新没有太大区别。
–鲍勃
17-09-9在8:52
通过操作系统应用微码更新...具有讽刺意味的是,这为安全问题打开了更多机会。
–tonysdg
17年9月9日19:20
#4 楼
作为一个非常具体的示例,我确定您可以采用最近认可的SKL150勘误表,并在其之上构建一个漏洞利用程序,该漏洞利用程序可以穿越验证系统,JIT编译语言等,因为它破坏了处理器行为的基本假设按设计。报告的SKL150的“症状”崩溃了,但这仅仅是因为受影响的值是一个变为无效的指针,但是您同样可以使用所有常规技术来利用它。当然,这大概是10个难度中的9个。
评论
然后是几年前的事情:media.ccc.de/v/29c3-5265-en-page_fault_liberation_army_h264似乎与X86上的MMU交互的页面错误机制实际上已经完成了图灵。
–丹·米尔斯(Dan Mills)
17/09/8在14:04