LWN:塞满return stack buffer!

《大话处理器》连载——微架构(10) 分支预测实现与条件执行 (2) 分支预测实现        算法是基础,有了算法后,就可以在处理器中实现分支预测功能。Intel的分支预测模块包含了3个单元:        1.         Branch Target Buffer(BTB)        2.         The Sta 阅读详情

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

Stuffing the return stack buffer

By Jonathan Corbet
July 22, 2022
DeepL assisted translation
https://lwn.net/Articles/901834/

"Retbleed" 系列漏洞,是一类牵涉到 return 指令的投机执行(speculative-execution)漏洞。针对 Retbleed 的加固措施已经在 mainline kernel 中了。但是,截至本文写作时,还有一些剩余问题导致无法进入 stable update 发布版。防护 Retbleed 的问题会严重影响性能,尤其是在一些英特尔处理器上。Thomas Gleixner 和 Peter Zijlstra 认为他们已经找到了一个更好的方案,不需要使用现有的防护措施,而是对处理器的预测执行机制进行误导来解决这个问题。

如果 CPU 要对 return 指令进行推测执行,那么就必须对代码将返回的位置有一定的了解。在最近的英特尔处理器中,有一个特殊的隐藏数据结构,称为 "返回堆栈缓冲区"(RSB, return stack buffer),用于缓存存放预测的返回地址。RSB 可以容纳 16 个条目,因此,如果一个调用链的深度超过这个数字的话,它就必须得放弃掉最早的那个 entry。这样在这个非常深的调用栈在返回时,RSB 可能会出现 underflow (也就是想要的数据在这里并不存在了)。人们可能认为这时 speculation 预测会在此时停止,但恰恰相反,CPU 会求助于其他的一些启发式方法,比如依赖 branch history buffer 来预测。唉,现在人们已经充分认识到可以通过精心构造特殊的 branch history buffer 来进行攻击了。

因此,内核中的这种非常深的调用关系就很容易受到预测执行攻击。在从 Skylake 一代开始的英特尔处理器上,防止这种攻击的唯一方法就是打开 CPU 中 indirect branch restricted speculation(IBRS) CPU 这个 "feature",这是由英特尔在 Spectre 时代的早期添加的功能。IBRS 确实有效,但它有一个不受欢迎的副作用,即性能降低 30%。用户自然对这种解决方案缺乏热情。

Another way

Gleixner 和 Zijlstra 决定尝试一种新方法。在这些处理器上只有在 RSB underflow 的情况下才能利用预测执行来控制 return call。因此,如果可以阻止 RSB underflow,那么这个特殊的问题就会消失。而我们似乎可以通过在 RSB 有可能耗尽条目时来 "stuffing (填充内容)" 从而实现这个效果。

这就马上引出了两个新的挑战:需要知道 RSB 何时处于快要 underflow 的情况,以及找到一种方法来填充内容。第一个问题,是通过跟踪当前的调用链深度来处理的,采用的是一种近似方式。构建系统会被修改为在内核镜像的可执行文件中创建几个新的 section,来存放内核函数的 entry 和 exit 位置会执行的小段代码,用来进行跟踪。当 RSB stuffing 功能启用时,函数 entry 增加的额外代码就会在每次进入各个函数时被调用,exit 的额外代码将在离开函数执行。

RSB 的状态会被跟踪下来,有一个 per-CPU 的 64 位值,初始化为:

0x8000 0000 0000 0000

函数 entry 的额外代码会通过将其右移 5 位来变相 "增加" 这个计数器。处理器会对这个值进行符号扩展,因此,在第一次调用后,该计数器将看起来是这样:

0xfc00 0000 0000 0000

如果再连续发生 12 次调用的话,这个符号位将一直向右扩展,计数器中的最高位的 1 就会一直传递到最右端;因此这个计数器无法可靠地统计超过 12 的数。这样一来,它就模仿了 RSB,其无法容纳超过 16 个 entry,这里留有四个调用来作为安全屏障;开发者使用移位来实现这一行为,就不需要引入 branch 了。每当函数返回时,就会发生相反的情况:计数器被左移 5 位。在 12 个 return 之后,再进行一次 shift 移位就会清除所有 bit,而计数器的值就变为了 0,这就提醒我们需要做一些事情来防止 RSB 用完了。

这时需要执行的工作,就是进行一系列非常快速短小的函数调用(是用汇编编码写的,在相关 patch 的末尾可以找到),于是增加了 16 个函数调用,从而也增加了 RSB 的内容。这些函数调用在返回时,都会立即执行一条 int3 指令;如果这些 return 调用都准备要做预测执行了,那么这个指令会阻止预测执行。当然,实际的内核并不想执行这些指令(或执行这么多 return 操作),所以用来填充 RSB 的代码里会增加了实际上的 stack pointer,来跳过这些填充进来的 call frame。

最终的结果是,RSB 不再符合实际的 call stack 了,其中充满了许多 entry,如果预测执行进去的话也不会有什么危害。在这个时候,call-depth 计数器就可以被设置为 -1(在 2 的补码中就是一个全 1 的数字),从而代表 RSB 已经填满了。内核现在就不怕 Retbleed 攻击了,要等到发生另一连串的 12 个 return 之后才会有问题,不过届时会做操作来把 RSB 再次填满。

Costs

我们做了大量的工作来减少这个方案的开销,特别是在不需要这个防护的系统上。编译出来的内核会像往常一样进行 direct call;在系统启动时如果选择 retbleed=stuff 了启动选项,那么所有这些函数调用都会被改为经过上面介绍的额外代码跳转来完成。这些 thunks 本身会被放置在一个 huge-page mapping 里面,从而减少对 TLB 的占用。即便如此,正如 patch 封面邮件中所说,这个方案还是有成本的。"我们都毫不意外地对这个结果恨之入骨"。

这些成本有几种体现形式。首先需要 "令人印象深刻 "的数量的内存得被用来保存这些额外的中转代码以及相关的处理工作。内核 size 增大,对其自身的性能也有影响,即使在没有启用 RSB stuffing 功能的系统上也会受到这个影响。额外的指令增加了 instruction cache 的压力,减缓了执行速度。信中说,最后一个问题可以通过在每个函数的开头来放置这些额外代码(而不是在一个单独的 section )来缓解。Gleixner 已经准备了一个 GCC patch 来实现这一目标,并且已经看到在使用这个 GCC patch 时,有一些性能损失就会被找回来。

邮件中包含了一长串的基准测试结果,比较了 RSB stuffing 与完全禁用缓解措施、以及使用 IBRS 的性能差异。RSB stuffing 的性能情况令人大开眼界,包括一个 microbenchmark 中测出了 382%的性能损失。不过,在所有情况下,RSB stuffing 都比 IBRS 表现得更好。

不过,只有在阻断 Retbleed 攻击的主要目标已经实现的情况下,还提供比 IBRS 更好的性能,这才有意义。邮件中这样说:

我们的假设是,在第 12 个返回点进行填充,足以在遇到 underflow 和并且转而求助于其他预测机制之前就破坏预测执行机制。测试下来可以证实是有作用的。Johannes [Wikner],retbleed 的研究人员之一,就试图对这种方法进行攻击,并且证实测试结果如水晶一般完美。

显然,没有什么科学证据能表明这可以经受住未来研究出的新的攻击,但我们现在能做的就是预测一下而已。

因此,RSB stuffing 似乎是有效的,至少目前看来是这样。这样一来,在需要防御 Retbleed 攻击的场景下,它是很有吸引力的。比如说在运行不受信任的用户的托管服务供应商都会需要这个。但没有人会对这里的额外开销感到满意,尽管它比 IBRS 好。对于很多用户来说,RSB stuffing 看起来是一个聪明巧妙的 hack 方案,并且值得庆幸的是他们并不需要真正使用这个功能。

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

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

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

format,png

Exploring Branch Predictors for Constructing Transient Execution Trojans Exploring Branch Predictors for Constructing Transient Execution Trojans(木马) 1. 摘要: 针对于幽灵攻击,工业界迅速采取了一系列软件和硬件上的缓解措施,其中微码补丁最为流行和受信任(microcode patch) 问题:现有的防护策略仍旧存在被攻击的漏洞 论文工作: 提出了暂态木马(transient trojans),即一种软件模块会在暂态执行模式中隐藏自身的恶意活动。这些木马看起来完全正常,能够通过静态/动态的分析检查, 阅读详情

相关推荐

Camera Sensor接口协议全解析(六)聚焦onsemi HiSPi接口的技术突破与应用实践

摘要: Onsemi HiSPi是一种高速并行接口协议,专为高分辨率图像传感器设计,具备1600 Mbps传输速率、低功耗和高兼容性特点。通过对比DVP、MIPI CSI-2等主流协议,HiSPi在工业/医疗领域表现突出,支持动态功耗控制、多ROI和CRC校验。其创新架构包含多PHY设计,提供分组SP、流SP等多种工作模式,满足灵活传输需求。实际应用中,HiSPi在PCB缺陷检测(5μm精度)和液晶面板检测(0.3% Mura检出率)等场景展现卓越性能,成为高速成像领域的关键技术。

GateWorld的博客 1435

Spectre-v2 以及 Linux Retpoline技术简介

Spectre-v2 以及 Linux Retpoline技术简介

小立仔 3307

abaqus wcm插件下载_Abaqus随机短纤维增强复合材料建模插件

文末附Abaqus随机短纤维增强复合材料建模插件下载链接前言短纤维增强复合材料相对于长纤维增强复合材料来说更容易制备,且短纤维的填充性能略有改善,可制造复杂产品,广泛应用于车辆、航空航天、建筑等行业,对短纤维增强复合材料进行细观力学分析,可对其宏观力学性能进行预测、分析破坏机理等。接下来对随机短纤维增强复合材料建模插件进行介绍。NO.1 【算法简介】难点一:此插件核心在于判断生成的纤维是...

weixin_39974882的博客 2833

现代处理器内核的分支预测逻辑

在计算机体系结构中,分支预测器(Branch predictor)是一种数字电路,在分支指令执行结束之前猜测哪一路分支将会被运行,以提高处理器的指令流水线的性能。使用分支预测器的目的,在于改善指令管线化的流程,进而通过指令管线化提高处理器性能,分支预测器是现今指令流水线微处理器性能提升的关键技术之一。 01分支类型 按照是否条件执行以及是否直接寻址可以将分支分为下表中...

网络空间发展与战略研究 2264

flash均衡磨损--实时保存设备数据

【代码】flash均衡磨损--实时保存设备数据。

Car12 480

Unity 热更新技术 |(六)xLua框架学习最新系列完整教程

开始学习热更新方面系列知识,就从这一篇开始吧! 本系列教程 会从热更新基本概念出发,详细介绍热更新相关的全套知识点。 如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。 热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~ 接下来先从XLua学习使用 开始学习吧!

努力前行,总会成为自己心中的那道光 1万+

LWN:呼吁再次考虑地址空间隔离!

关注了就能看到更多这么棒的文章哦~A call to reconsider address-space isolationBy Jonathan CorbetSeptember 29, 2022LPCDeepL assisted translationhttps://lwn.net/Articles/909469/内核运行时可以访问到地址空间中的全部内容,通常就包括了所有的物理内存,尽管其实这个地...

Linux News搬运工 417

uniapp(安卓苹果APP端):解决video组件播放视频卡顿,视频一直加载非常缓慢或加载不出来解决方案,解决多个video组件视频播放很卡一直加载非常慢怎么办(无论真机调试还是本地测试都完美搞定)

uni-app APP端video组件播放视频卡顿,uniapp video app 加载不出来解决方案,uniapp app使用video视频播放卡顿,uni-app APP端video组件播放视频卡顿_uniapp video老是加载,uniapp开发app视频在真机上卡顿,安卓app播放视频很卡,苹果ios真机运行播放视频加载很慢怎么办,解决UniApp中MP4视频播放卡顿问题,解决m3u8视频播放很卡的问题,uniapp 使用video组件,部分视频加载非常慢,uniapp视频播放卡顿,安卓视频播放

✅ 精选推荐文章 7914

ssm框架使用resultful_async/await异步模型是否优于stackful coroutine模型?

我们要先想清楚:问题是什么?当代码遇到一个“暂时不能完成”的流程时(例如建立一个tcp链接,可能需要5ms才能建立),他不想阻塞在这里睡眠,想暂时离开现场yield去干点别的事情(例如看看另外一个已经建立的链接是否可以收包了)。问题是:离开现场后,当你回来的时候,上下文还像你走的时候吗?跳转离开,在任何语言里都有2种最基本的方法:1)从当前函数返回; 2)调用一个新的函数。 前者会把上下文中的局部...

weixin_32192681的博客 212

损失函数大汇总(五十三)(Boundary Loss附公式推导与代码)

摘要 Boundary Loss是一种针对图像分割任务的新型损失函数,特别适用于高度类别不平衡的细粒度分割场景。与传统的区域型损失(如Dice、交叉熵)不同,它通过计算预测边界与真实边界之间的距离来优化模型,更关注边界精度而非区域重叠。核心思想是利用距离图(distance map)将边界约束转化为区域积分形式,实现端到端训练。具体实现中,损失函数为预测概率与距离图的点积,梯度仅取决于距离图,具有明确的空间引导性。相比区域型损失,Boundary Loss能更好处理小目标、细长结构等边界敏感任务,可与Dic

悦学共鸣,温柔以待,汇聚光芒,共同成长 238

NPC 三电平逆变器中点电位平衡算法详解

最常用:零序电压注入(简单、计算量小)最可靠:虚拟空间矢量调制(VSVPWM)及其改进形式(全范围平衡)趋势:结合模型预测控制(MPC)或智能算法(模糊、神经网络)进一步提升动态性能和鲁棒性。NPC 三电平逆变器中点电位平衡算法的 C# 实现示例(零序电压注入法 + 闭环补偿)在 NPC(Neutral Point Clamped)三电平逆变器中,中点电位平衡最常用且易于软件实现的方案是零序电压注入法。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 323

计算机术语中英文对照表(流水线/微架构/体系结构/指令集)

术语 翻译 描述 Intel Architecture (IA) IA架构 执行x86指令集的CPU架构 Pipeline 流水线 根据上下文,翻译做“流水线”或者“管道” Pipelined ...

一凡stkeke 9436

第 8 篇:TMC2240 电机正反转实现|DIR 引脚控制 + 代码优化(稳定不抖动)

本文详细介绍了TMC2240电机驱动芯片的正反转实现方法,重点解决方向切换时的抖动和冲击问题。文章首先明确了硬件连接、基础配置和使能状态三个前提条件,然后阐述了DIR引脚电平控制方向的核心原理,提供了STM32的GPIO配置代码。针对方向切换时的电流冲击问题,作者提出了"停止-延迟-切换-启动"的平滑切换逻辑,并给出了包含方向枚举、转速控制和方向切换函数的完整代码实现方案。通过这种优化方法,可以有效避免电机在正反转切换时产生的抖动、冲击声和发热问题,实现稳定的双向控制。文章还提示了后续可

BackCatK Chen的博客 2073

【嵌入式安全扫盲一】Stack buffer overflow

出处:https://en.wikipedia.org/wiki/Stack_buffer_overflow Stack buffer overflow From Wikipedia, the free encyclopedia For other uses, see Stack overflow (disambiguation). In sof

自由的天空 1787

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

openSUSE的Spectre缓解方法导致性能下降

openSUSE默认使用IBRS作为其Spectre Variant 2缓解方法而不是Retpolines,这是该发行版与其他Linux发行版相比开箱即用性能较慢的原因之一。 这个opensuse-factory邮件列表引用了联想笔记本电脑在使用openSUSE时“巨大的单核性能损失”。围绕Spectre Variant 2 缓解措施的单线程性能损失约21%,这本身并不令人惊讶,因为我们已经多...

petpig0312的博客 463

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

怼你没商量!Linux之父手删AWS 工程师提交的补丁,表示这是愚蠢的行为,网友:我的快乐又回来了...

(给机器学习算法与Python学习加星标,提升AI技能)作者:刘琳来源:雷锋网大神教你在线怼人~”“大神” Linus Torvalds 又来怼人了。据开源中国报道,近日,Linux 内...

机器学习算法与Python学习 929

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Meltdown & Spectre 攻击及缓解措施(一)

Yueqiang Cheng, Yulong Zhang, Yu Ding, Tao WeiBaidu X-Lab, Jan 8, 20181. 引言最近Google Project ...

Baidu_Secrity的博客 1686

linux修复cpu漏洞,【图片】为什么linux mint上cpu漏洞直到现在也没完全修复?_linux吧_百度贴吧...

该楼层疑似违规已被系统折叠隐藏此楼查看此楼下面是完整数据:Spectre and Meltdown mitigation detection tool v0.42Checking for vulnerabilities on current systemKernel is Linux 4.15.0-55-generic #60-Ubuntu SMP Tue Jul 2 18:22:20 UTC ...

weixin_39891158的博客 241

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 224

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 149

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 328

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 195

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 117

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

Decorator

TaskDecorator 是异步场景下"跨线程传递上下文"的标准方案,主要用于传递 MDC、用户信息、数据源路由等上下文数据,核心价值是让异步任务的日志链路不中断、业务上下文不丢失。TaskDecorator 是 Spring 提供的一个钩子接口,用于在异步任务执行前对 Runnable 进行包装,常用于跨线程传递上下文。如果你在项目中遇到具体的异步上下文传递问题,可以把代码贴出来,我帮你给出最合适的 Decorator 方案 👍。✅ 核心能力:在线程切换时,把"父线程的上下文"搬到"子线程"

wlwork66的博客 104

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 626
上一篇: LWN:支持Intel线性地址屏蔽功能!
下一篇: LWN: Docker 以及 OCI 容器生态!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值