eBPF 中的漏洞可以绕过 Spectre 4 攻击保护

Linux 内核中已发现两个漏洞,允许使用 eBPF 子系统绕过针对 Spectre v4 攻击的保护(SSB,推测存储绕过)。 使用非特权 BPF 程序,攻击者可以为某些操作的推测执行创造条件,并确定内核内存任意区域的内容。 内核中 eBPF 子系统的维护者获得了原型漏洞利用的访问权限,该漏洞演示了在实践中进行攻击的能力。 这些问题已以补丁 (1, 2) 的形式得到修复,并将包含在下一个 Linux 内核更新中。 分发包中的更新尚未创建(Debian、RHEL、SUSE、Arch、Fedora、Ubuntu)。

Spectre 4 攻击方法基于在使用间接寻址处理交替写入和读取操作时丢弃推测执行操作的结果后恢复存储在处理器缓存中的数据。 当读操作在写操作之后(例如,mov [rbx + rcx], 0x0; mov rax, [rdx + rsi])时,由于正在执行类似的操作(读操作是执行更频繁,并且可以从缓存执行读取)并且处理器可以在写入之前推测性地执行读取,而无需等待计算写入的间接偏移量。

如果在计算偏移之后,检测到用于写入和读取的存储区域的交集,则处理器将简单地丢弃已经推测获得的读取结果并重复该操作。 此功能允许读取指令在存储操作尚未完成时访问某个地址的旧值。 在丢弃不成功的推测操作之后,其执行痕迹保留在高速缓存中,之后可以使用用于确定高速缓存内容的方法之一来基于对高速缓存和未高速缓存数据的访问时间的变化的分析来检索它。

第一个漏洞(CVE-2021-35477)是由 BPF 程序验证机制的缺陷引起的。 为了防止 Spectre 4 攻击,验证程序在可能有问题的存储到内存后添加一条附加指令,该指令存储空值以替换先前操作的痕迹。 写空操作预计会非常快并且会阻止推测执行,因为它仅依赖于指向 BPF 堆栈帧的指针。 但事实上,事实证明可以创造条件,在该条件下导致推测执行的指令设法在抢占存储操作之前执行。

第二个漏洞 (CVE-2021-3455) 是由于当 BPF 验证程序识别潜在危险的内存保存操作时,它没有考虑 BPF 堆栈的未初始化区域,即第一个写入操作不受保护。 此功能导致在执行存储指令之前根据未初始化的内存区域执行推测性读取操作的可能性。 为 BPF 堆栈分配新内存时无需检查已分配内存中的内容,并且在 BPF 程序运行之前有一种方法可以操作随后将为 BPF 堆栈分配的内存区域的内容。

来源: opennet.ru

添加评论