LWN: Spectre 漏洞利用了BPF!

硬件安全漏洞 -- Spectre && Meltdown 介绍 Spectre和Meltdown是缓冲时延旁路攻击的两种实际攻击方法。由于CACHE的存在,CPU对于不同外存的地址访问速度会有差异,这本身就是一种“边带信息”。对这种边带信息的一种利用方式就是:首先清空CACHE;使用内存当中某个地址所存储的字节的值(这个值就是我所感兴趣、但又不被允许访问的,比如内核其他保护区域中)作为下标来读一个我可以访问的数组,这相当于预取了CACHE;然后测试这个数组所有地址的访问速度,就可以猜出我感兴趣的这个值来。 阅读详情

关注了就能看到更多这么棒的文章哦~

Spectre revisits BPF

By Jonathan Corbet
June 24, 2021
DeepL assisted translation
https://lwn.net/Articles/860597/

自 Spectre 硬件漏洞被披露以来,已经过去三年了,但 Spectre 仍在不断给我们新的意外。在硬件行为完全可以预测的情况下要想写出正确且安全的代码已经很困难了,而如果处理器会随机做出一些无法预测到的行为的时候,情况就变得更加困难了。为了说明这里会面临的挑战,我们只需要看看这个公告(https://lwn.net/ml/oss-security/CAHMfzJkhZ01FG62sfMdXayK_NwD3g=5NcpGmg+-PVZLBpjJ9Fw@mail.gmail.com/)中所介绍的 BPF 漏洞就好,这个漏洞本身已在 5.13-rc7 版本中得到了 fix。

针对 Spectre 漏洞的攻击一般是先要让处理器在 speculative mode 下执行一系列在现实代码中不会发生的操作。典型的例子就是访问超出数组范围之外的位置(out-of-range array reference),尽管代码本身已经正确地进行了边界检查。当处理器发现它错误地预测了边界检查的结果的时候,就会把之前进行的错误的访问撤销,但是这个 speculative access(预测性访问)会在 cache 中留下痕迹,这样就可以被用来探测有价值的数据了。

在抵御这类预测执行的攻击方面,BPF 虚拟机一直是一个特别值得关注的领域。大多数这类攻击都依赖于找到内核代码的某个片段,当 CPU 进行预测执行时,利用这段代码来做一些破坏性的工作。内核开发者已经做了不少努力来消除这样的代码片段。但是,BPF 的存在就是为了能够加载来自用户空间的、可以运行在内核上下文中的代码,这就使得攻击者能够制作他们自己的代码,而不用再从 kernel 代码中寻找攻击目标了。

为了挫败这些攻击者,BPF 社区已经做了很多工作。例如将数组索引(array index)与一个 bitmask 进行 AND 操作,这样一来访问数组的时候就不会越过数组边界了,即使 CPU 是在 speculative 模式并且这些索引是乱七八糟的值也不怕了。但人们还是很难列出处理器在各种情况下的处理方式,难免会遗漏一些场景。

The vulnerability

下面的代码就是一个例子,来自 Daniel Borkmann 对这个漏洞进行 fix 时提交的说明:

// r0 = pointer to a map array entry
// r6 = pointer to readable stack slot
// r9 = scalar controlled by attacker
1: r0 = *(u64 *)(r0) // cache miss
2: if r0 != 0x0 goto line 4
3: r6 = r9
4: if r0 != 0x1 goto line 6
5: r9 = *(u8 *)(r6)
6: // leak r9

顺便说一下,这个 patch 的 changelog 非常值得一读,在记录漏洞本身以及相关 fix 方面是一个非常棒的例子。

在正常(non-speculative)执行时,上述代码有一个潜在问题。寄存器 r9 包含的是攻击者提供的值,这个数值在第 3 行被赋值给 r6,然后在第 5 行被用作指针了。这个值可能是指向内核地址空间的任何地方的,这正是 BPF verifier 想要阻止的那种无拘无束的访问操作,所以人们可能会以为这段代码肯定不会被 kernel 接受并执行。

但是,BPF verifier 的工作机制是遍历执行 BPF program 的所有可能代码分支来判断是否接受。它的遍历中,并不会既执行第 3 行又执行第 5 行。因为攻击者提供的指针赋值操作只有在 r0 内容是 0 时才会发生,但这个值会导致第 5 行不会得到执行。BFP Verifier 因此得出结论,认为没有任何执行流程会导致把用户提供数据当作指针进行了访问,于是它就正常加载并执行了这个 BPF Program。

但是这个验证分析完全是按照正常执行的情况来进行的,在 CPU 根据 speculative 执行的过程中则并不遵照这种规则。

上面这段代码中的第 1 行中引用的这块内存,攻击者会想尽办法来让这段内存不存在于 CPU cache 中,这样第一行的访问就会触发一次 cache miss。而处理器并不会等待从内存中取到的数值,而是根据预测来进行执行后续与 r0 有关的代码。而实际上这些预测的结果有可能会导致两处 if 条件(在第 2 行或第 4 行)都被判断为 false,于是就不会进行跳转。

这种情况怎么可能会出现呢?原因是,branch prediction(分支预测)并不是通过猜测 r0 的值来进行判断来实现的。其实它是基于某个特定代码分支最近几次执行的历史来判断的。这个历史信息
存储在 CPU 的 "pattern history table"(PHT)中。但是,CPU 不可能跟踪记录某个大型程序中的每一条 branch 指令,所以 PHT 就采用了 hash table 的形式。攻击者会寻找一些代码,使得它的 branch 会被放在精心设计的 BPF program 中的 branch 相同的 PHT 条目位置内,然后使用该代码来调教 branch predicator,从而诱使其最终按攻击者的期望来进行预测执行。

一旦攻击者加载了这段代码,清除了 cache,并愚弄了 branch predicator 做出了啥事,那么攻击者的目的就达到了,CPU 会根据预测来访问引用攻击者提供的地址。后续只需要用一些常规方式来把结果暴露出来就可以完成攻击了。这个过程还是挺麻烦的,但是计算机天生就适合做这种重复执行的操作。

值得注意的是,这种攻击方式并不仅存在于假想之中。根据上面的公告,当这个问题被报出来的时候, security@kernel.org 列表上就收到了很多个 proofs-of-concept 的攻击方案。其中一些方案都不需要对 branch predicator 进行调教的步骤。这些攻击可以读到内核地址空间中的任意内存的内容,在所有物理内存都属于内核地址空间的系统上,相当于任何数据都可以被窃取到了。由于非特权用户也可以加载某些类型的 BPF program,所以攻击者都不需要 root 权限。换句话说,这是一个严重的漏洞(serious vulnerability)。

Closing the hole

针对这种问题的 fix 是比较简单易懂的。BPF Verifier 不要再去跳过那些它明知道不可能执行的代码分支就好,而是根据 speculative 的方式来模拟执行这些路径。这样一来,在看到 r0 为零的代码分支时,之前有问题的 verifier 会简单地得出结论认为第 4 行的判断结果一定是 true,而不再考虑其他可能。在 fix 后,verifier 仍然会走到 false 的分支里去(包括第 5 行),从而得出结论这里正在使用一个未知指针,从而禁止加载这个 BPF program。

这个改动有可能会导致之前能正常运行的正确代码也无法加载了,尽管很难想到有哪些正常代码会包含这类的代码 pattern。当然,这将会导致 verifier 进行检查时所花费的时间更长,因为它需要检查在正常程序执行中不可能出现的代码路径,但我们没有办法,谁让我们面对的是这些会进行 speculative 执行的 CPU 呢。

这个 fix 已经被合入了 mainline,可以在 5.13-rc7 版本中找到。此后,它又被合入了 5.12.13 和 5.10.46 这两个稳定版的 update 中,但目前(还)没有进入那些更早期的 stable kernel。有了这个 fix 的内核就可以防止另一个 Spectre 漏洞被利用了,但如果认为这是最后一个,那就太天真了。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

SAM - Speculative Access to Memory-开源 Speculative Access to Memory 是一个库,允许程序员创建以推测方式访问内存区域的线程。 这意味着在系统确定所有数据相关性都已解决之前,不会验证读取的数据。 立即下载

相关推荐

谷歌学术用publish-or-perish来对引用量排序

用谷歌学术搜索文献的时候发现不能按照引用量高低进行排序,网上提供了这个软件。 下载地址如下:Publish or Perish (harzing.com)https://harzing.com/resources/publish-or-perish 关于软件界面页面和各种指标的介绍,可以参考中科大的这个PPT: 文献分析软件——publish or perish(精品·公开课件).ppt (book118.com)https://max.book118.com/html/2018/1124/813

m0_48878989的博客 1万+

armv8 memory system

在armv8中,由于processor的预取,流水线, 以及多线程并行的执行方式,而且armv8-a中,使用的是一种weakly-ordered memory model,     不保证program order和execute order一致。     所以有时需要显式的执行一些指令,来order自己的代码。 armv8涉及到的优化包括:   1) multiple issu...

ahr7882的博客 604

基于STM32的宠物智能照护嵌入式系统设计

嵌入式系统是实现物联网终端设备本地化感知、决策与执行的核心技术载体,其关键在于多传感器融合、低功耗执行控制与轻量级云边协同。本文围绕环境监测(温湿度、烟雾、余粮)、机电执行(步进电机食盘、继电器风扇)和可靠通信(MQTT+ESP8266)三大技术主线,深入解析STM32F103在资源约束下的外设调度策略、ADC采样抗干扰设计、DHT11时序精准控制及HX711称重滤波算法等工程实践要点。系统强调本地闭环优先原则,确保离线基础功能可用,同时通过阿里云IoT平台实现远程监控与告警联动,为中小型智能硬件项目提供可

weixin_29155599的博客 292

【ARM Cache 入门及渐进六--内存顺序模型】

arm 内存顺序模型及原子操作

CodingCos的博客 1991

MMI分束器仿真优化:用Lumerical FDTD实现95%耦合效率的实战技巧

本文详细介绍了使用Lumerical FDTD软件对MMI分束器进行仿真优化的实战技巧。通过构建高保真模型、精确配置光源与边界条件,并重点优化波导结构与taper设计,系统性地将器件的耦合效率提升至95%以上。文章还分享了利用参数扫描、varFDTD加速等高级方法,帮助硅光芯片设计工程师高效实现高性能MMI分束器设计。

rainy的博客 772

python设计俄罗斯方块(附源码)

【代码】python设计俄罗斯方块(附源码)

牧魂的博客 2059

linux内存拦截,英特尔提出SAPM内存类型解决方案以防止CPU漏洞

在2018年初,英特尔和其他处理器受到Meltdown,Spectre,L1TF,SGXSpectre,SWAPGSAttack,Zombieload和MDS漏洞的影响。漏洞影响深远。英特尔还大大加强了对安全性的投资,并不断寻找新的解决方案。拥有60人的安全研究团队,英特尔专门组建了一支名为“战略风暴研究与缓解”的“STORM”团队,其中包括12位安全精英,专门研究已知漏洞及其危害。最近,英特尔S...

weixin_34495151的博客 476

使用buildroot系统的qmake编译QT出现Unknown module(s) in QT: xxxx 的错误解决方法

可以看到,我这里使用的是 qt5base-5.15.2 目录下的qmake,这个qmake只包含了基础的qt模块,而额外添加的qt模块没有包含进去,需要使用。可以看到我这里是有的,如果你跟我一样,模块存在,但是还是报找不到对应模块的错误的话,大概率是跟我一样,用错qmake了,看第二点。在包含 qt5base 目录下查看,是否有对应模块的目录,如果没有的话,需要通过make menuconfig 添加一下。目录下的qmake才可以。

T541132的博客 2489

BPF介绍

Thank Zhihao Tao for your hard work. The document spent countless nights and weekends, using his hard work to make it convenient for everyone. If you have any questions, please send a email to zhihao.tao@outlook.com 文章目录1. 概述1.1 发展1.2 优势1.3 限制1.4 基于eBPF.

Phantasm的博客 2540

用Python玩转Milvus:从安装SDK到完成第一个向量搜索Demo

本文为Python开发者提供了一份详细的Milvus向量数据库实战指南。文章重点讲解了如何规避版本兼容性陷阱,正确部署Milvus服务端并安装匹配的Python SDK。通过一个电影推荐系统的完整案例,演示了从数据建模、集合创建、向量插入、索引构建到执行混合搜索的全流程,帮助开发者快速上手并完成第一个向量搜索Demo。

weixin_29239279的博客 192

如何实现在Go语言中替换程序自身

总结起来,我们可以通过将新的程序二进制文件写入磁盘,并在运行时启动这个新的程序来实现在Go语言中替换程序自身。在Go语言中,有时候我们需要在程序运行时替换程序自身,例如更新程序版本或者进行热重启。本文将介绍一种正确的方式来实现在Go语言中替换程序自身的方法,并提供相应的源代码示例。此外,替换程序自身可能会导致正在运行的程序产生意外行为或终止,请谨慎使用,并确保在合适的时机进行替换操作。实现替换程序自身的关键是将新的程序二进制文件写入到磁盘,并在运行时启动这个新的程序。函数启动新的可执行文件,并在后台运行。

HoUnix的博客 288

解决bpf Verifier analysis错误问题

解决bpf Verifier analysis: last insn is not an exit or jmp错误问题

laitianli的专栏 303

使用 Visual Studio Code 搭建 SAP UI5 本地开发环境

工欲善其事,必先利其器。时至今日,SAP 提供了非常多的 SAP UI5 开发工具,既包含本地搭建的,也包含浏览器里远端使用的工具,比如 WebIDE 和 Business Application Studio. 我们访问下面这个链接,就能找到所有这些工具的安装或者配置步骤: https://tools.hana.ondemand.com/#sapui5 如果想选择本地开发,SAP 推荐的工具是 Visual Studio Code,也就是本文要介绍的内容。 也可以下载 WebIDE 的本地安装包,将其安

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1万+

CPU漏洞之Spectre

Spectre攻击通过欺骗处理器,使其推测性地执行在正确的程序执行下不应该执行的具有可测量副作用的操作,并通过侧通道(Side channel)将受害者的机密信息泄露出去。

W1Z1Q的专栏 1914

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spectre(幽灵漏洞)是什么?

摘要: Spectre(幽灵漏洞)是2018年披露的CPU硬件安全缺陷(CVE-2017-5753/5715),利用现代处理器的推测执行机制非法访问敏感数据。该漏洞影响几乎所有Intel/AMD/ARM处理器,攻击方式包括边界检查绕过(v1)和分支目标注入(v2)。缓解措施包括软件补丁(如编译器防护)、硬件改进(微代码更新)和开发规范调整。虽然实际攻击难度较高,但暴露了性能优化与安全性的根本矛盾,后续还出现了Spectre-NG等新型变种。建议用户保持系统更新,关键服务部署在已修复漏洞的新硬件上。

guigenyi的专栏 1059

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

一步一步理解CPU芯片漏洞:Meltdown与Spectre

一个具有用户级权限的攻击者在第三条指令中试图访问内核地址,处理器会对其作安全检查,检查该进程是否有权限访问该地址,于是这条指令会触发异常,该指令及之后的指令对寄存器的修改都会被丢弃,处理器重新回到能正常执行的指令中。在支持乱序执行的CPU中,后面的指令可能在前面指令执行结束前就开始执行了。此后,攻击者就可以通过缓存侧信道攻击,不断遍历加载rbx[al*4096],由于该数据此时已经在缓存中,攻击者总会遍历出一个加载时间远小于其它的数据,推测哪个内存页被访问过了,从而推断出被访问的内核内存数据。

ZP1015 3372

熔断&幽灵漏洞复现

熔断,幽灵漏洞原理介绍及其复现

qq_52504945的博客 5294

CPU 漏洞是“Spectre”和“Meltdown”漏洞简介

Spectre 漏洞主要存在于现代 CPU 中的分支预测器设计中,这使得攻击者可以利用分支预测器的特性来获取系统中的敏感信息。Meltdown 漏洞则利用了现代 CPU 中的一种内存优化技术,称为“乱序执行”(out-of-order execution),它允许 CPU 在等待内存访问结果的同时执行其他指令。这些漏洞于2018年1月首次被公开披露。总之,Spectre 和 Meltdown 漏洞是当前的 CPU 漏洞,如果你的计算机运行的是较新的 CPU 设计,建议你安装相关的补丁程序来解决这些漏洞。

weixin_64542139的博客 945

CPU 漏洞之“Spectre幽灵”和“Meltdown熔断”漏洞原理闸述

现代计算机CPU、高速缓存、快慢表等机制,竟然存在致命的漏洞!Meltdown熔断 Spectre幽灵!

zw_estridy的博客 2056

揭开Spectre漏洞的神秘面纱

摘要: Spectre漏洞是计算机安全领域的重大威胁,利用现代CPU的分支预测和投机执行机制窃取敏感数据。该漏洞影响几乎所有主流处理器,威胁个人隐私与企业机密。其核心原理在于CPU预测执行错误路径时,虽丢弃计算结果,但缓存状态未被清除,攻击者可通过侧信道获取残留数据。本文深入剖析Spectre漏洞背景、CPU缓存机制及分支预测原理,揭示其利用代码层面的攻击路径,强调在追求性能的同时需兼顾安全防护,为漏洞修复提供理论依据。

技术分享 1029

Spectre漏洞

漏洞介绍 Spectre的PoC下载地址: https://spectreattack.com/。 Spectre涉及CVE编号为CVE-2017-5754。 虽然我们常见认为CPU访问内存速度很快,但基于CPU运算频率来看,这个访问过程还是非常慢的,CPU访问内存中的数据需要比较长的等待时间,为了提高CPU的性能,它提出了分支预测、预测执行的功能。让CPU再访问内存等待数据时,依然可以进行相对...

yusakul的博客 2204

Meltdown与Spectre:处理器漏洞揭秘

最近披露的处理器重大安全漏洞,使得芯片巨头Intel遭受重大打击。而且漏洞不止一个,一个有两个:一个叫熔断(Meltdown),只涉及Intel处理器;一个叫幽灵(Spectre),影响Intel,AMD以及ARM处理器。这两个漏洞可能造成的后果很严重,给人们的教训也很深刻,我们在无限制追求芯片性能的同时也要反思一下,性能和安全性,到底谁才是最重要的? 来龙去脉 处理器

Jeremy的博客 8725

都说计算机今年炸了,究竟炸到什么程度呢?

企业和机构应该建立健全的安全管理制度和体系,包括完善的安全防控方案、网络安全培训和演练、及时的安全漏洞修复等。同时,还需要引进专业的安全产品和服务,如入侵检测与防御系统、数据加密技术、安全服务外包等,为企业和机构提供更可靠的保障。最后,我们要注意的是,计算机技术的发展速度是非常快的,而漏洞的发现以及修复难以完全规避,因此保持安全意识和及时更新软件与系统是长久以来保护计算机安全的有效手段。总之,保障计算机安全是一个千头万绪的工程,需要广泛的意识宣传、政府、企业和组织的合作以及人类智慧和努力。

都会一点点的博客 4万+

Spectre-v1 简介以及对应解决措施

Spectre-v1 简介以及对应解决措施。

小立仔 3500

Spectre和Meltdown漏洞攻击原理

这样,即便之后CPU成功的恢复了寄存器状态,攻击者只需要对于所有缓存地址进行遍历,分析哪个地址在过去被访问过(被访问过的地址再次访问需要的时间减少),由此在随后取走所需信息。为了提高性能,CPU采用了分支预测,在分支条件语句没有计算出结果时,CPU就预测分支的可能结果,并开始执行后面的代码。如果预测失败,CPU会消除错误指令的执行痕迹转去执行正确的指令。当CPU计算的时候,需要从存储器读取数据,如果数据在缓存里,那么读取可以在60个时钟左右完成,相反,如果不在缓存,而在内存,那么读取需要300个时钟左右。

qq_75186598的博客 850
上一篇: LWN: 关闭SIGBUS信号!
下一篇: LWN:My Book Live用户受到惊吓!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值