The Memory Sinkhole

来源:互联网 发布:查找重复删除知乎 编辑:程序博客网 时间:2024/06/08 17:47
Abtract
    在x86架构上,除了ring 0外,还有更高特权级的执行级别,这个级别的代码对AV软件不可见,可以自由访问硬件,随意抢占或是修改OS。x86架构在负ring上加了保护层,但是40年的进化留下了进入最高特权模式的后门。尽管有各种改善和补丁,仍然有一个设计缺陷20年来从未被注意到。利用x86被遗忘的特性这广袤的未被探索的荒地,本文演示如何让恶意代码从ring 0调到处理器最高特权级。攻击和一个嵌到芯片中的架构级的0-day漏洞一起执行,定向到现代系统广泛使用的独特的漏洞代码字符串。

I 简介
    传统x86架构被分为特权级,其中ring 3为最低特权级,ring 0为最高。随着架构进化,需要更深的特权级,因此开发了更多的特权隔离机制来限制和约束ring 0代码,通俗地说就是负的ring。ring -1,为hypervisor,可以抢占并隔离ring 0代码。ring -2为系统管理模式SMM,可以抢占ring -1,拥有访问平台硬件不受限的权限,而且很多情况下可以绕过TXT,将这个特权级定位为现代x86处理上最高执行特权级别。因为被滥用的极端情况,SMM受很多安全机制保护。然而架构的复杂性妨碍了更高ring间的隔离,通过精心配置一些意外的架构特性可以绕过SMM安全保护。

II SMM安全概述
    SMM安全模型基于一块安全受保护的内存区域SMRAM。概念上,SMM驻留在SMRAM中,且SMRAM只能在处理器在SMM模式中时才可被访问。在这种设定下,SMM代码可以访问系统上任何别的资源,但任何别的事物都不能访问SMM代码。内存控制器中心MCH位于处理器核与内存间,执行SMRAM隔离,如果处理器不在SMM模式,MCH阻止访问SMRAM,否则允许访问。

III 违背安全
    x86可编程中断控制器APIC用于管理发送给处理器的中断事务。最初是隔离的电路,在P5微架构中,APIC集成在处理器芯片中。为了允许管理APIC上的快速访问和灵活性,芯片寄存器被映射到0xFEE00000和0xFEE01000之间4KB的处理器内存区域。这无意中和已经使用这片内存范围的软件形成了冲突,为了解决这个问题,P6处理器家族扩展了APIC,允许寄存器重新映射到另一片内存区域。这个功能纠正了传统系统的一个稀有问题,不被使用也不被现代处理器需要,然后现代处理器仍然支持可重映射的APIC特性。
重定位APIC寄存器的能力引入了一个复杂的漏洞到处理器架构上一个完全不相关的组件——SMM。如果APIC寄存器窗口移动到覆盖了SMRAM范围,内存访问将应该被发送给MCH进行裁决,而不是过早被APIC接收而MCH收不到。这为ring 0代码提供了一个影响SMM的小而间接的口,并且违背了两种模式间重要的架构隔离。

IV 内存缺口(sinkhole)
    APIC寄存器窗口固定为4KB大小,而且需要对齐4KB边界,处理器对APIC寄存器有一些有限控制,但大多数4KB寄存器窗口硬接线到0.实际上,这给ring 0提供了通过重定位APIC而“sinkhole”一页SMRAM的能力,从这块区域里进行内存读返回0,内存写则被丢弃。APIC位置的粗粒度,和不能有效控制APIC数据一起使得这个漏洞很难应用到实际,但并非不可能。

V SMM处理程序
    为了从ring 0提权到ring -2,首先应该检查SMM代码、SMM代码在启动过程中由系统固件安全,其多样性阻碍了攻击。然而,系统固件的组件来源于Intel提供的一组UEFI模版代码。以下是初始的SMM入口点,被广泛应用于现代系统。针对这段特定代码序列的攻击得到了最大可能的覆盖度。图1给出了模版SMM入口点。关于SMM模版代码有2-3个通用的版本,最近二十年SMM入口点似乎更新了一或两次,其他版本的攻击也需要改进,图中SMM处理程序入口应该是最通用的。


VI 提权
    模版SMM处理器程序对任何正常攻击而言被验证是正确且安全的,但纯属巧合,对内存sinkhole攻击存在漏洞。
处理程序从位于SMM地址0xFB00的结构加载关键数据,如图指令8003、8022、802A、804B和805A完成这些操作。因为这个结构位于SMRAM内部,ring 0不能通过任何正常方式访问或修改它。但是,在SMI之前,如果APIC被重映射而覆盖了这个结构,这些指令将从APIC寄存器中获取数据,而非获取内存数据。这些寄存器被硬接线为0而不能改变,这意味着从可由SMM外部进行配置8003、8022、802A、804B和805A的读只能读到0。这非常限制在SMM上执行攻击,但如果通过正确设计,允许在SMM代码中生成畸形的GDT和far jump,将导致运行跳出SMRAM,允许ring 0代码劫持SMM。
    若APIC配置为与0xFB00处SMM结构重叠,程序将这么进行:8003处的读加载0作为GDT基址;随后的指令在靠近物理地址0的不存在的GDT内设置GDT描述符;8022指令从内存加载GDT的大小,APIC重叠导致其被错误地读为0;8026处dec ax指令重新计算GDT大小为0xFFFF,而且8027保存GDT描述符的大小;802A重新加载0作为GDT地址,将其保存到相同描述符;8034处lgdt指令加载畸形的描述符,将SMRAM外的新GDT放置在攻击者的控制下。有了这些,当SMM中新的段选择符加载时,恶意的ring 0代码可以控制内存布局,这些将发生在8089处的far jump。在8075的自修改代码和805A处从sinkhole中获取数据后,最终的指令被错误地生成为jmp far ptr 0x10:0x8097。通过将构造的GDT放在地址0,并配置描述符0x10指向SMRAM外部,0x8097处的载荷将拦截SMM执行而以SMM特权运行。

VII 攻击载荷
    攻击原型如下图,且已被作者选的处理器模型所验证。

    攻击通过运行于ring 0的内核驱动提交,假设相同的内存映射。这个例子针对BSP CPU核,系统SMBASE位于0x1F5EF800。GDT地址的调整GDT描述符创建过程中哪个APIC寄存器被读。攻击将SMM执行定向到SMRAM外部位于PAYLOAD_OFFSET的二级载荷,二级载荷由ring 0安装,在SMM处理程序被劫持后以SMM特权运行。二级载荷的特定效果留给读者想想,但是通常包括永久性的rootkit、硬件修改和系统破坏。
0 0
原创粉丝点击