LWN: 大麻烦!Spectre继续捣乱

Spectre v1硬件漏洞不仅限于数组越界检查被绕过,CVE-2019-1125 'SWAPGS vulnerability'展示了更复杂的问题。在预测执行环境下,SWAPGS指令可能被误用,导致内核访问用户空间控制的地址,使恶意程序能通过侧信道攻击窃取数据。Intel处理器尤其易受此攻击。

640

点击上方蓝色“Linux News搬运工”关注我们~

Grand Schemozzle: Spectre continues to haunt

By Jonathan Corbet

对于此前的Spectre v1硬件漏洞,大家通常的理解就是数组越界检查可能会在speculative execution(预测执行)的情况下被绕过,从而产生问题。这个理解没错,不过并不完整,还有其他一些攻击方法,例如CVE-2019-1125 "SWAPGS vulnerability"就展示了这一点。这个CVE在Linux kernel的部分开发者这边被称为“Grand Schemozzle(大麻烦)”。

Segment这个概念其实是早期x86系统上遗留下来的体系结构概念了。在64位时代,其实基本上已经没用了。不过对于某些特殊task来说,还使用了一些segment,包括FS和GS。GS通常用在Linux系统里面来存放thread-local或者CPU-local的数据。在kernel里面,GS segment指向per-CPU数据区域。user space有权限直接使用它自己的GS。arch_prctl()系统调用可以用来修改这个值。

当然,kernel需要注意一定要使用它自己的GS指针,而不是使用user space提供的GS指针。x86架构必备的一条指令SWAPGS,就是用来让这个功能更加简便易用的。每次调入kernel的时候,会有一个SWAPGS指令来把当前的GS segment指针换成一个预设值(存放在CPU状态相关的寄存器里,model-specific register)。在返回user space的时候再执行一次SWAPGS,就能把user-space需要用的GS值恢复回来。这样只要仔细设计SWAPGS指令的调用位置,就能防止kernel使用GS pointer以外的数据。这是大家理想中的行为。

这里有一点要注意,并不是每次进入kernel都是从user space发起的。如果系统本来已经在kernel mode了(内核态),执行SWAPGS指令会让系统混乱。所以这里实际写好的kernel代码在大多数情况下其实是等效于这种写法:

    if (!in_kernel_mode())

    SWAPGS

这里其实就是我们今天讨论的会出错的地方了。如果这个代码也被speculatively executed(预测执行了),那么处理器可能就会判断错误从而执行SWAPGS然后使用错误的GS segment指针了。这里的判断条件很有可能会受预测执行错误影响。如果CPU刚从user space进入kernel,此时它判断错误的话,就会导致放弃SWAPGS,从而导致使用了user-space的GS值。另一种情况下,系统本来已经在kernel mode执行了,CPU可能会预测错误,然后执行了本不该运行的SWAPGS,这样就会导致它错误使用了user-space GS值。总之,这两种情况下,后续的per-CPU数据访问都会访问到user-space控制的一个地址去了,这样恶意程序再利用普通的side-channel攻击方法就可以窃取到数据了。

粗看下来,这样会导致kernel数据结构内容的保护形同虚设,不过其实这种攻击方案还是有不少限制。首先只有Intel处理器才会对SWAPGS进行预测执行,因此上述两种场景之中的第二种,已经在kernel的场景,只有Intel处理器才会有受攻击的风险。不过针对第一种场景,当从user mode切换进入kernel mode时,任何处理器都可能会预测错误跳过SWAPGS。

对攻击者来说还有一个困难,就是arch_prctl()虽然可以在非特权代码(unpriviledged code)里被调用来设置GS指针,不过这个指针必须指向user-space的地址。这一点虽然不能完全避免漏洞,不过还是会让漏洞很难利用:攻击者必须先找到kernel里的某段代码会从GS来获取一个变量并把这个变量作为指针来作为后续访问之用的。Josh Poimboeuf在mainline里合入的保护patch里面也提到:“我们很难审查所有处理函数里面是否有符合这种要求的kernel代码,所以虽然目前我们还没找到这样的例子,但是很有可能真的在某些地方会有这种代码逻辑(或者今后可能会有新的代码使用这种逻辑),如果没有工具能扫描出所有这类代码逻辑的话,就应该认为这是一个受攻击的风险点”。

可以通过使用supervisor mode access prevention机制(Intel新增的SMAP功能)来阻止这种攻击,不过这样一来只有那些不怕Meltdown攻击的处理器可以使用这个功能来做防护,因此这种方案价值不是很大。

此外,还有一个长期在进行的工作,是支持FSBASE和GSBASE指令,它们会允许user space来直接设置GS,kernel无法控制。这个功能会对系统性能提升有很大好处,所以一直有人在希望能合入这个功能到Linux mainline,不过这样的话,类似SWAPGS这种攻击方式对攻击者来说就会更加容易实现了。

在kernel实现的防护补丁逻辑很简单:在需要(或者不需要)执行SWAPGS的代码这里需要确保指令是顺序执行的(利用LFENCE)。当然这会影响代码执行速度,这也是为什么patch set里面开玩笑地提到这些patch是来自“性能恶化部门”。某些系统上并不需要担心这类攻击的,那么就可以通过加一个nospectre_v1命令行选项来把新加的barrier指令都去掉(其他的Spectre v1防护代码也都可以一起去掉)。

Spectre漏洞的名字英文含义是幽灵,给它起这个名字也就是因为我们认为这类问题会伴随我们相当长时间。预测执行(speculative execution)和side channels(侧信道攻击)组合在一起的话会出现许多新类型的攻击方式,并且多数很难从安全防护人员的角度来保证这些攻击是否真实可行(需要有办法能探查出特定模式的代码)。因此,我们现在采取的应对方式(牺牲系统运行性能来预防攻击)很有可能也会伴随我们很长时间。

全文完

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

极度欢迎将文章分享到朋友圈 

长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~

640?wx_fmt=jpeg

内容概要:本文围绕基于改进多目标粒子群优化算法(小生境粒子群算法)的配电网有功-无功协调优化问题展开研究,旨在通过智能优化算法有效降低网络损耗、提升电压质量并增强配电系统的运行效率。研究系统地介绍了小生境粒子群算法的改进策略,构建了包含功率平衡、电压安全、设备容量等多重约束的多目标优化模型,并采用IEEE标准测试系统进行仿真验证,充分证明了该方法在处理多目标、多约束优化问题上的优越性能。全文涵盖从数学建模、算法设计、约束处理到多目标折衷解选择的完整流程,并配套提供了完整的Matlab代码实现,便于读者复现结果与进行二次开发。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事电力系统优化、智能算法研究或相关领域工作的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决配电网中有功与无功功率的协同优化问题,实现节能降耗与电压稳定;②学习并掌握多目标粒子群算法及其小生境改进策略在电力系统中的具体应用与实现细节;③通过Matlab代码进行仿真,加深对智能优化算法在工程实践中应用的理解,提升科研与工程实践能力。; 阅读建议:此资源以理论分析与代码实现紧密结合的方式呈现,建议读者在深入理解算法原理和模型构建的基础上,结合所提供的Matlab代码进行仿真实验,重点关注参数设置、收敛性分析与结果可视化等关键环节,从而实现从理论认知到实践验证的完整闭环。
内容概要:本文系统阐述了LVGL(Light and Versatile Graphics Library)嵌入式轻量化图形界面开发的完整技术体系,涵盖从架构原理、环境搭建、控件开发、样式美化、事件机制到硬件移植与性能优化的全流程。深入剖析LVGL的分层架构、对象化编程思想、脏区局部刷新算法、内存管理与低功耗调度机制,并通过PC仿真与可视化工具提升开发效率。全面讲解基础与高级控件的手写实现、UI样式定制、中文字库适配、动画特效开发,并以STM32等主流平台为例,详细演示硬件移植全过程。最后通过一个集数据可视化、多页面导航、参数设置与传感器联动于一体的智能触控终端综合项目,实现理论与实践的深度融合。; 适合人群:具备C语言基础和嵌入式开发经验的工程师、电子信息类专业学生、参与大创或竞赛的开发者,以及从事工业控制、物联网、智能设备研发的技术人员。; 使用场景及目标:① 掌握LVGL在无操作系统MCU上的移植与运行机制;② 实现嵌入式设备的高质量GUI界面开发,包括中文显示、流畅动画与低功耗优化;③ 构建具备多页面、数据联动与用户交互的工业级触控终端项目,满足产品化与结题展示需求。; 阅读建议:学习过程中应结合仿真环境与实际硬件平台同步实践,重视lv_conf.h配置、HAL层接口适配与调试方法,建议按照“仿真验证→代码理解→硬件移植→项目集成”的路径循序渐进,重点关注内存管理、事件机制与性能优化等易出错环节。
内容概要:本文围绕“高效的球形通量计算(2D)研究”展开,基于Matlab实现相关算法,旨在提升二维空间中球形通量的计算效率与精度。研究聚焦于数值积分方法的优化,结合几何建模与数学分析手段,针对传统计算过程中存在的复杂度高、耗时长等问题,提出简化的算法流程与高效的数值求解策略。通过模块化代码设计与关键算法优化,显著提升了通量计算的运行效率与结果稳定性,适用于物理场仿真、电磁学分析、热力学建模及环境科学等需要频繁进行区域通量估算的工程与科研场景。文中提供了完整的Matlab代码实现,便于读者复现与拓展应用。; 适合人群:具备Matlab编程基础,从事科研或工程仿真的研究生、工程师及科研人员,尤其适合在物理、电磁、能源、图像处理或环境工程等领域有数值计算需求的技术人员。; 使用场景及目标:①应用于科学计算中二维球形区域内通量的高效求解,如电场、磁场或热量通量的定量分析;②服务于教学演示、算法性能对比研究及工程仿真平台开发,提升复杂积分问题的求解速度与准确性。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注算法实现细节与性能优化策略,深入理解数值积分与几何建模的结合方式,并参考文档中提到的技术方向拓展至三维场景或其他物理场的通量计算应用。
内容概要:本文围绕永磁同步电机(PMSM)在宽速域范围内的无传感器控制技术展开研究,提出了一种基于观测器异构冗余与柔性切换的复合控制策略。该策略融合高频信号注入法(适用于零低速区)与自适应滑模观测器(SMO,适用于中高速区),通过设计动态加权融合机制实现全速域内转子位置与速度的精确估计。系统在静止和低速状态下采用脉振方波高频注入实现初始定位,在中高速运行时则利用模糊超螺旋滑模观测器提升鲁棒性与动态响应性能,并引入相位同步校正与平滑切换算法以有效抑制模式切换过程中的抖动与误差累积。研究在Simulink平台构建了完整的控制系统仿真模型,全面验证了所提方法在启动精度、稳态性能、动态响应及抗负载扰动等方面的优越性。; 适合人群:具备电机控制、现代控制理论及MATLAB/Simulink仿真基础的电气工程、自动化及相关专业的研究生、科研人员和工程技术人员。; 使用场景及目标:①解决永磁同步电机在无机械传感器条件下全速域运行的控制难题;②为高性能电机驱动系统(如电动汽车、精密伺服系统)提供可靠的速度与位置估算方案;③深入理解高频注入、滑模观测器、多观测器融合与平滑切换等先进控制算法的设计与实现。; 阅读建议:此资源以Simulink仿真实现为核心,不仅提供了详细的算法原理与模型架构,还包含了完整的运行结果分析。建议读者结合文中框架在MATLAB环境中动手复现仿真模型,重点关注不同速度区间下观测器的切换逻辑与参数整定过程,并通过对比实验深入理解各模块的作用机理与系统整体性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值