我们长期以来都不信任软件,因此我们进行软件审计,进行逆向工程,逐步运行软件,在沙盒中运行软件。 那运行我们软件的处理器呢? -我们盲目且全心全意地信任这小块硅。 但是,现代硬件与软件具有相同的问题:秘密的,未记录的功能,错误,漏洞,恶意软件,木马,rootkit,后门。

ISA(指令集体系结构)x86是历史上最长的,不断变化的“指令集体系结构”之一。 从1976年开发的8086设计开始,ISA不断进行更改和更新。 同时保持向后兼容性和对原始规范的支持。 经过40多年的发展,ISA体系结构不断发展壮大,并伴随着许多新的模式和指令集,每一种模式和指令集都为先前的设计增加了一层新的内容,而先前的设计已经超载了。 由于完全向后兼容的策略,现代x86处理器甚至包含已经完全被遗忘的指令和模式。 结果,我们有了处理器架构,它是新旧技术的复杂迷宫。 如此极其复杂的环境-导致处理器网络安全的许多问题。 因此,x86处理器不能声称是关键网络基础架构的可信赖根。
您仍然信任您的处理器吗?
程序和操作系统的安全性-基于部署它们的硬件的安全性。 通常,软件开发人员不会考虑部署其软件的硬件可能是不受信任的恶意事实。 如果硬件行为错误(无论是否有意为之),软件安全机制将变得毫无价值。 多年来,已经提供了各种型号的安全处理器:英特尔SGX,AMD Pacifica等。然而,令人羡慕的规律性是,发布有关严重故障的信息(来自最近的故障,例如Meltdown和Spectre)并检测到未记录的“调试”功能-导致我们全心对处理器的信心是毫无根据的。
现代x86处理器是最新的和过时的技术的繁琐而复杂的交织。 8086拥有29,000个晶体管,Pentium 300万,Broadwell 32亿,Cannonlake超过100亿。

拥有如此多的晶体管,现代x86处理器上充斥着未记录的指令和硬件漏洞也就不足为奇了。 在无证文件中,这些文件几乎是偶然发现的,指令包括:ICEBP(0xF1),LOADALL(0x0F07),apicall(0x0FFFF0)[1],它们可以解锁处理器以用于未经授权的访问受保护的内存区域。
至于处理器的众多硬件漏洞(请参见下面的两个图),它们使网络攻击者可以提升特权[3],提取加密密钥[4],创建新的汇编程序指令[2],更改已经存在的汇编程序指令[2] ,在汇编程序指令[2]上安装钩子,控制“硬件加速虚拟化” [7],干预“原子密码计算” [7],最后,进入“上帝模式”: 香港专业教育学院自己一个合法硬件英特尔ME后门(它允许你收到的远程访问连电脑关闭)。[8] 而这一切-不会留下任何数字痕迹。


现代处理器比硬件更多的是软件
严格来说,现代处理器甚至不能完全称为“硬件”。 因为它们最关键的功能(包括ISA)是由闪存微码提供的。 最初,微码主要负责控制复杂的汇编程序指令的解码和执行:浮点运算,MMX原语,带有REP前缀的行处理程序等。 但是,随着时间的流逝,越来越多的责任被分配给微码,以进行处理器内部的处理操作。 例如,英特尔处理器的现代扩展,例如AVX(高级矢量扩展)和VT-d(硬件虚拟化)都在微代码上实现。
另外,今天的微代码除其他事项外,还负责维护处理器的状态,管理缓存以及管理功耗。 为了节省能量,微代码实现了一种中断机制,该机制处理电源状态:C状态(节能睡眠的程度:从活动状态到深度睡眠)和P状态(电压和频率的不同组合)。 因此,例如,微码负责在进入状态C4以及退出状态C4时重置L2缓存。
为什么处理器制造商使用微码?
x86处理器的制造商使用微代码将复杂的汇编指令(最长为15个字节)分解为一系列简单的微指令,以简化硬件体系结构并促进诊断。 实际上,微代码是外部(对用户可见)CISC体系结构和内部(硬件)RISC体系结构之间的解释器。
如果在CISC架构中(主要是在ISA中)检测到错误,制造商将发布微码更新,该更新可通过主板的BIOS / UEFI或操作系统(在启动过程中)下载到处理器。 得益于这种基于微码的更新系统,处理器制造商可以为自己提供灵活性和降低成本的能力,同时还能修复其设备中的错误。 fdiv引起的耸人听闻的错误使1994年的Intel Pentium处理器严重崩溃,这使得像软件一样容易发生高科技硬件错误的事实更加明显。 此事件使制造商对基于微码的处理器的架构更加感兴趣。 因此,英特尔和AMD开始使用微码技术构建其处理器。 英特尔-从1995年发布的奔腾Pro(P6)开始。 AMD-从1999年发布的K7开始。
一切秘密都变得清晰
尽管处理器制造商正在努力使微代码的体系结构和更新机制保持最严格的置信度,但敌人并没有睡着。 零散的信息(主要来自专利,例如AMD RISC86 [5])和官方BIOS更新的周密逆转(与K8 [6]一样),逐渐揭示了微码的秘密(例如,参见下图“ AMD处理器微码更新机制”)。 而且由于逆向工程工具(包括软件和硬件)[2]的不断发展,有前途的模糊技术[1]以及诸如Microparse [9]和Sandsifter [10]之类的OpenSource工具的出现,网络攻击者可以学习有关微码的一切必要信息必须在上面编写微码恶意软件。

因此,例如,在[2]中,“ Hello world!” (微码木马化的第一步)开发了一个“微钩”(拦截汇编程序指令的微码程序),它计算处理器访问div命令的次数。 该微钩是对汇编程序指令div的处理程序的注入。

同上[2]提出了一个更高级的微钩-静默地位于div ebx的汇编程序指令中,不显示任何内容,并且仅在访问ebx div时满足特定条件时才被激活:ebx寄存器包含值B,并且该寄存器eax包含值A。激活后,此微钩会将eip寄存器(当前指令指针)的值加1。 结果,程序(有勇气引用div ebx指令)的执行将继续偏移:不是从div ebx之后的命令的第一个字节开始,而是从其第二个字节开始。 如果在eax和ebx寄存器中指定了其他值,则ebx div照常工作。 这有什么实际价值? 例如,当使用带有“重叠指令”的混淆技术时,可以悄悄地激活汇编程序指令的隐藏链[11]。

这两个示例演示了如何使用合法的汇编程序指令在其中隐藏任意Trojan代码。
同时,网络攻击者可以激活他的恶意负载-包括远程激活。 例如,当在攻击者控制的网页上满足激活所需的条件时。 这要归功于现代Web浏览器中内置的即时(JIT)和提前(AOT)编译器。 这些编译器使您能够为机器代码发出预定义的汇编程序指令流-即使您仅使用高级JavaScript编写程序(请参见上面的最后清单)。