DMA攻击和Thunderbolt 3安全级别浅谈

Overview of DMA attacks

0x00 DMA攻击

​ DMA攻击是一种侧信道攻击,即攻击者可以通过利用高速扩展端口,穿透计算机和操作系统,直接读取DMA,DMA包含在许多连接中,DMA可以通过例如便携式摄像机、网卡、存储设备或者其他可直接读取或写入主内存的互动设备。此类设备的合法使用已导致DMA连接广泛,攻击者可以采用工具连接到DMA接口,绕过操作系统的安全机制和屏幕密码等,来访问部分或者全部的计算机物理内存地址,读取计算机的所有工作,窃取数据和加密密钥,安装运行间谍软件和其他漏洞利用程序,或者修改系统以允许后门或其他恶意软件

允许DMA攻击的设备包括:FireWire、CardBus、ExpressCard、Thunderbolt、PCI和PCI Express

首先用一张图来总结

PCILeech

0x01 DMA 是什么

DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。

​ 正常情况一般只有CPU才能进入主存,现在加了DMA,直接在I/O设备和主存之间打通了一个通路,用来减少CPU的负担。如果出现DMA和CPU同时访存的情况,DMA优先级更高,当两者争抢时CPU是DMA的小弟卧槽 好家伙我TM直接好家伙。

那么CPU和DMA同时访问主存就会出现一下三种情况:

1.CPU停止访问主存

​ a.CPU放弃地址线的使用权
​ b.CPU放弃数据线的使用权
​ c.CPU放弃控制线的使用权

image-20201203193831422

优点: 控制简单,它适用于数据传输率很高的设备进行成组传送。

缺点: 在DMA控制器访问内存阶段,内存的效能没有充分发挥,相当一部分内存工作周期是空闲的。这是因为,外围设备传送两个数据之间的间隔一般总是大于内存存储周期,即使高速I/O设备也是如此。例如,软盘读出一个8位二进制数大约需要32us,而半导体内存的存储周期小于0.5us,因此许多空闲的存储周期不能被CPU利用。

2.周期挪用

​ DMA请求时,I/O设备挪用或者窃取总线占用权一个或几个主存周期

image-20201203193850311

I/O设备要求DMA传送时可能遇到两种情况:

​ (1)此时CPU不需要访内,如CPU正在执行乘法指令。由于乘法指令执行时间较长,此时I/O访内与CPU访内没有冲突,即I/O设备挪用一二个内存周期对CPU执行程序没有任何影响。

​ (2)I/O设备要求访内时CPU也要求访内,这就产生了访内冲突,在这种情况下I/O设备访内优先,因为I/O访内有时间要求,前一个I/O数据必须在下一个访问请求到来之前存取完毕。显然,在这种情况下I/O 设备挪用一二个内存周期,意味着CPU延缓了对指令的执行,或者更明确地说,在CPU执行访内指令的过程中插入DMA请求,挪用了一二个内存周期。 与停止CPU访内的DMA方法比较,周期挪用的方法既实现了I/O传送,又较好地发挥了内存和CPU的效率,是一种广泛采用的方法。但是I/O设备每一次周期挪用都有申请总线控制权、建立线控制权和归还总线控制权的过程,所以传送一个字对内存来说要占用一个周期,但对DMA控制器来说一般要2—5个内存周期(视逻辑线路的延迟而定)。因此,周期挪用的方法适用于I/O设备读写周期大于内存存储周期的情况。

3.DMA和CPU交替访问

​ 适用于CPU的工作周期比主存存取周期长的情况。这样可以将CPU的周期拆分成两部分,前一部分用于DMA访存,后一部分用于CPU访存

image-20201203194201769

​ 这种传送方式又称为“透明的DMA”方式,其来由是这种DMA传送对CPU来说,如同透明的玻璃一般,没有任何感觉或影响。在透明的DMA方式下工作,CPU既不停止主程序的运行,也不进入等待状态,是一种高效率的工作方式。当然,相应的硬件逻辑也就更加复杂。

0x02 PCILeech 和MemProcFS的攻击利用

我们发现在DMA和CPU同时进行内存访问的情况下,DMA的优先级会更高,我们便可以硬件设备模拟DMA请求来进行内存访问

DMA12

DMA13

同时在github也开源了PCILeech和MemProcFS的利用脚本
PCILeech
同时在windows系统下给出了GUI工具

DMA15

我们这边使用测试板子如下

DMA11

Linux攻击方式

首先连接设备进行内存扫描

DMA14

扫描成功后加载KMD地址,并将Linux内存挂载到本地的K盘

DMA16

DMA17

我们可以去读取几乎所有的文件比如读取\etc\shadow文件如下

DMA18

Windows 攻击方式

环境如下

Intel NUC
ScreamerM2

image-20220902181627579

在windows系统上我们同样可以挂载内存到本地的K盘

DMA19

获取System权限并建立用户进行登录

DMA20

获取系统进程信息

DMA21

获取SAM哈希存储信息

DMA22

获取系统日志信息等

DMA23

同时也可以进行一些有趣的操作比如Bypass锁屏密码,动态修改Notepad显示内容等

利用姿势优化

PS:很多时候我们测试需要插入PCIE或者M2接口导致比较麻烦,或者M2接口可能失效的情况下我们可以去使用M2延长线

DMA24

或者使用Thunderbolt3 转接装置,将PCIE和M2接口转换为thunderbolt3 同时也涉及了Thunderspy攻击利用

DMA31.pic

DMA32.pic

同样对Thunderbolt3的 安全讨论在下文进行简单描述
在ThunderSPY的官网提供了漏洞的检测工具

DMA26

同样的DMA利用方式还有:
火线接口的DMZ攻击同样也可以进行火线转Thunderbolt3的攻击方式

0x03 Thunderbolt 3 安全等级

无安全性(SL0)

在位于SL0模式时,任何Thunderbolt 3设备连接后将立即开始工作。此模式的危险在于,由于Thunderbolt 3支持PCIe,并且PCIe允许直接访问系统内存,因此恶意的Thunderbolt 3设备可以访问系统内存中的潜在敏感数据,而在SL0模式下,只需要简单的插入设备。

用户授权(SL1)Default

连接Thunderbolt 3设备时,用户必须响应弹出对话框以明确允许连接。用户可以选择允许一次或始终允许该特定设备。这减轻了上述SL0风险。

安全连接(SL2)

与SL1相同,不同之处在于,如果用户选择始终允许特定设备,则系统会向该设备写入加密密钥,并将其记录在其自己的固件中,以执行更强大的“身份验证”使用质询/响应机制在后续连接上对该设备的性能进行评估。这样可以防止攻击者获取已被授予“始终允许”访问权限的外围设备的设备ID并将其克隆到恶意设备上,这在SL1模式下将允许该恶意设备获得“始终允许”访问权限。但是,并非所有的Thunderbolt 3外设都支持SL2。

仅DisplayPort和USB(SL3)

通过Thunderbolt 3允许DisplayPort流量,但不允许PCIe。

如果设置安全模式为SL3,并且连接到实际的Thunderbolt 3扩展坞,则将获得视频输出,但将无法使用通过扩展坞的USB控制器运行的任何USB 3.x端口或其他扩展坞功能。(通常包括所有其他端口,以太网,音频等)

Daisy chaining disabled / USB docks only (SL4)

image-20200514221739727

SL4 会禁用thunderbolt菊花链,而不是DisplayPort菊花链。

在SL4模式下,允许设备使用PCIe,但仅允许链中的第一个Thunderbolt 3设备。链下游的thunderbolt设备将不允许使用PCIe。

此模式旨在防止恶意的Thunderbolt外围设备通过受信任的设备(例如扩展坞)来访问系统。

内核DMA保护

此模式需要系统固件,操作系统,驱动程序和Thunderbolt 3外围设备的支持。

内核DMA保护使系统仅允许外围设备直接访问系统内存的指定部分,从而降低了风险。

如果系统支持内核DMA保护,但所连接的特定Thunderbolt外围设备不支持它,则该系统将退回到该特定设备连接(通常为SL1)

0x04 攻击方式

  1. 对于默认采用了SL1的设备,可以通过其主板上的SPI接口dump出Thunderbolt接口控制的固件,对固件进行修改并写回,以此将SL1降级为SL0。

    p.s. 在对设备进行写SPI闪存进行降级的时候,可以将审批闪存设置为只读,这样用户就无法通过BIOS更改 Thunderbolt接口 的安全等级。

  2. 降级成功后通过Thunderbolt接口连接被攻击的设备,执行DMA攻击(PCILeech 攻击程序)

    PCILeech部分功能:

    • 可以通过>150MB/s的速度检索内存
    • 将数据写入目标内存
    • 将活动的RAM挂载位文件
    • 将文件系统挂载为驱动器
    • 在目标系统上执行内核代码
    • 解锁系统

PCILeech攻击使用PCIe硬件设备读取和写入目标系统内存。这是通过在PCIe上使用DMA来实现的。目标系统上不需要驱动程序。

PCILeech还可以在没有硬件的情况下运行,并可以使用LeechCore库支持的多种软件内存获取方法-包括使用DumpIt或WinPmem捕获远程实时内存。PCILeech还支持本地捕获内存和多种内存转储文件格式。

支持多个内存采集器比如:

1.基于USB3380的硬件(基于USB3380的硬件只能本地读取4GB内存,但是如果首先将内核模块(KMD)插入目标系统内核,则可以读取所有内存。)
2.基于FPGA

支持的目标系统:

UEFI
Linux
FreeBSD
macOS(不支持macOS High Sierra及更高版本)
Windows

​ 这需要有内存(USB3380硬件,FPGA硬件或CVE-2018-1038“ Total Meltdown”)的写访问权。

0x05 安全思考

1.设备位于SL1模式下,是否可以 窃取\克隆 已经获得授权的设备ID,以此获得无提示的设备接入。
2.针对上一点作出防御的SL2模式,如果在THunderbolt 3外设不支持SL2的情况下会自动降级到SL1。攻击者完全可以随心所欲降级。SL2如果不是强制实施的话等于无效

0x06 如何缓解

BIOS中启用VT-d(IOMMU)防护DMA攻击
image-20201203195328413

0x07 参考链接

https://en.wikipedia.org/wiki/DMA_attack
https://baike.baidu.com/item/DMA/2385376
https://github.com/ufrisk/pcileech
https://www.anquanke.com/post/id/86840
https://github.com/LuckyPi/PushPin
https://www.youtube.com/watch?v=mca3rLsHuTA
https://zhuanlan.zhihu.com/p/50640466
https://docs.microsoft.com/zh-cn/windows/security/information-protection/kernel-dma-protection-for-thunderbolt
https://www.youtube.com/watch?v=7uvSZA1F9os
https://www.youtube.com/watch?v=oEfzp4lHpB0
http://lordcasser.com/2020/07/01/thunderbolt/

Author

ol4three

Posted on

2020-11-28

Updated on

2022-09-02

Licensed under


Comments