🔍 MachineWare SIM-V 能否帮助防止#GhostWrite?
🔍 MachineWare SIM-V RISC-V参考模型设计精确,能够准确模拟每一条指令。通过将处理器的执行状态与 SIM-V 进行比较,可以立即发现潜在的缺陷,如 GhostWrite 序列中的缺陷。如下方截图所示,SIM-V 可以完美地处理 GhostWrite 指令序列。
🚀 欢迎在我们的免费试用版本中亲自体验。有兴趣的读者,欢迎添加微信:machinewarevp(备注公司职位和姓名),了解更多。点击阅读原文,开源了解该漏洞的更多内容。
GhostWrite 漏洞影响 T-Head XuanTie C910 和 C920 RISC-V CPU。该漏洞允许未授权的攻击者(甚至是访问权限有限的攻击者)读写计算机内存的任何部分,并控制网卡等外围设备。GhostWrite 使 CPU 的安全功能失效,如果不禁用 CPU 大约一半的功能,就无法修复。
GhostWrite 是 T-Head XuanTie C910(目前最快的 RISC-V CPU 之一)中的一个漏洞。与侧信道攻击或瞬时执行攻击不同,GhostWrite 是 CPU 的直接漏洞。该 CPU 的矢量扩展指令有问题,矢量扩展是 RISC-V ISA 的附加组件,旨在处理比基本 ISA 更大的数据值。
这些错误指令直接与物理内存而非虚拟内存协同工作,绕过了通常由操作系统和硬件执行的进程隔离。该漏洞嵌入在硬件中,因此无法通过软件更新修复。
无权攻击者(例如普通用户)可以使用这些指令写入任何内存位置。这完全绕过了安全和隔离功能,使攻击者可以完全不受限制地访问设备。这种攻击是 100% 可靠的,具有确定性,只需几微秒即可执行。即使是 Docker 容器化或沙箱等安全措施也无法阻止这种攻击。此外,攻击者还可以劫持使用内存映射输入/输出(MMIO)的硬件设备,允许他们向这些设备发送任何命令。
缓解这一问题的唯一方法是禁用整个向量功能,这将禁用大约 50% 的指令集,严重影响 CPU 的性能和功能。
我们通过两个概念验证来展示 GhostWrite 的功能。
在第一个漏洞中,我们使用 GhostWrite 修改了内核的 getuid syscall。该函数通过检查用户的 ID 来决定 sudo 应该做什么。如果 getuid 返回 0,也就是 root 特权用户的特殊 ID,那么 sudo 就会给予 root 访问权限,而无需询问密码。
GhostWrite 本身只能写入内存。不过,它可以通过修改内存中的页表来创建读取功能。这些页表将虚拟内存地址转换为物理地址。因此,修改这些表允许攻击者为任何物理地址获取可访问的虚拟地址,从而允许读写。
第二个漏洞展示了基于 GhostWrite 的读取功能如何从机器中泄漏任何内存内容。为了演示这一点,我们假定管理员在可信密码提示符下输入一个秘密密码来更新系统(左图)。
漏洞利用(右图)首先用页面表填充物理内存。鉴于受害者系统有 8GB 内存,这个过程只需几秒钟。然后,漏洞利用程序会尝试使用 GhostWrite 修改其中一个页表。一旦成功,漏洞利用程序就可以直接从物理内存中读取秘密密码。
据我们所知,只有 TH1520 SoC 中的 T-Head XuanTie C910 CPU 和 SOPHON SG2042 中的 T-Head XuanTie C920 CPU 受 GhostWrite 影响。不过,该漏洞影响的设备范围很广,包括个人电脑、笔记本电脑、容器和云服务器中的虚拟机。因此,使用这些处理器的任何客户或供应商都面临风险。
-
Scaleway Elastic Metal RV1, bare-metal C910 cloud instances
-
Milk-V Pioneer, 64-core desktop/server
-
Lichee Cluster 4A, compute cluster
-
-
Lichee Console 4A, tiny laptop
-
Lichee Pocket 4A, gaming console
-
Sipeed Lichee Pi 4A, single-board computer (SBC)
-
-
我们发现 GhostWrite 的方法是使用一种称为 CPU 差异模糊测试(differential fuzz-testing)的方法分析有记录和无记录的指令。这个概念很直观:生成小程序,在不同的 CPU 上运行,然后比较结果。由于每个 RISC-V CPU 都应遵循 RISC-V 规范,因此对于相同的输入,它们应产生相同的结果。如果不同 CPU 的结果不同,则表明其中一个 CPU 可能存在问题。
当 T-Head XuanTie C910 CPU 在使用非法编码的向量存储指令时出现异常行为时,我们发现了 GhostWrite。当其他 CPU 产生页面故障异常或拒绝执行该指令时,C910 却执行了该指令。
经过进一步调查,我们发现非法编码的指令允许进程直接写入物理内存而不是虚拟内存,从而暴露了一个严重的安全漏洞。
现代操作系统与 CPU 协同工作,将系统上运行的每个进程与其他进程隔离开来。为此,操作系统将物理内存划分为独立的虚拟内存空间,每个进程一个。这样可以确保每个进程只能访问自己的虚拟内存,而不能干扰其他进程。
电脑通过在 CPU 上执行指令来运行程序。这些指令既包括非常简单的任务,如两个数字相加,也包括更复杂的操作。通常情况下,CPU 供应商的手册会详细记录这些指令及其行为。不过,CPU 有时也包含未记录的指令。
原文始发于微信公众号(虚拟原型 Virtual Prototyping):GhostWrite 漏洞影响玄铁 C920 安全,如何第一时间规避 RISC-V CPU 设计缺陷?