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

2024-01-26 12:20

本文主要是介绍LWN:呼吁再次考虑地址空间隔离!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

A call to reconsider address-space isolation

By Jonathan Corbet
September 29, 2022
LPC
DeepL assisted translation
https://lwn.net/Articles/909469/

内核运行时可以访问到地址空间中的全部内容,通常就包括了所有的物理内存,尽管其实这个地址空间中只有一小部分是内核实际需要访问的。这就导致内核面对投机性攻击(speculative attack)的时候比较脆弱。近几年一直有一个希望能改变这种情况的地址空间隔离(address-space isolation)patch set,但从未被认真考虑过合入 mainline。在 2022 年的 Linux Plumbers 会议上,Ofir Weisse 试图说服开发社区来重新考虑一下地址空间隔离的事情。

Weisse 首先指出,看起来源源不断地有新的投机执行攻击,都需要应对;"Retbleed "只是最新的例子之一。要想补上这些漏洞,带来的性能开销可能会很高,以至于很多公司根本不使用这些防护措施。开发也非常耗时,每一个新的这类攻击,都需要几个月的努力工作才能解决。

地址空间隔离(ASI,Address-space isolation)是把不再需要的内存 unmap 掉的一个技术,从而让当前的运行环境无法访问到这部分内存。投机执行攻击就不再能访问到那些未被 map 的内存,因此这些 unmmaped memory 中的内容就不能再通过这种攻击而被泄露出来。ASI 的例子之一就是 kernel page-table isolation,这个机制是在应对 Meltdown 漏洞时实现的。近年来,有许多建议都是关于在其他一些情况下使用 ASI 的,但没有一个被合并到 kernel。本次会议讨论到的这个具体的提案,就是希望能保护 host 免受恶意虚拟机的攻击。

956349d533df36f40a5285e7ffe7fd2e.png

Weisse 说,在内核中更广泛地使用 ASI,就可以减少防御投机性漏洞所做的许多工作。它将把解决一个新漏洞的工作减少到 "由一个工程师编写三到十行代码" 的程度,而且不会对性能产生新的影响。不过,这个说法中的 "新" 这个字很重要;ASI patchset 本身对性能是有 2-14% 的影响的,取决于运行哪个 benchmark。他说,这些数据还有改进的余地。

他继续说,这个 patch set(https://lwn.net/Articles/886494/ 有更详细的描述)是 "一粒苦口良药"。这个 patch 很大,需要对内存管理子系统和许多分配函数(如 kmalloc())的调用进行较多的修改。简而言之,ASI 需要对内存的 "内容敏感" 部分进行标记,这部分应该被屏蔽掉从而避免投机执行攻击;这些部分在隔离生效时会被 unmmap 掉。这意味着会需新增一些 GFP 标志来用在内存分配时,以及在 slab 创建和 vmalloc() 的时候使用一些类似 flag,还有需要对局部变量和全局变量增加一些新的 annotation。完整的工作中需要检查每一个分配和声明的位置,并确定所涉及的内存是否算是敏感数据。

在内核把控制权交给一个虚拟机时,它首先会调用 asi_enter() 来对所有被标记为敏感数据的内存进行 unmmap,使这些内存无法被投机性攻击所获取。在这个虚拟机退出回到 host 内核时,如果 host 内核处理来自虚拟机的请求,那么该内存起初还是会保持在 unmapped 状态。他说虚拟机退出的原因中,许多都是可以在不访问敏感内存的情况下进行处理的。在这种情况下就把这个 request 处理掉了,然后将控制权返回给虚拟机,而不需要把那些敏感内存 map 上来。

但是,有时会有需要去访问这些敏感内存。Weisse 说,这里观察到的一个重要特征是,那些 speculative 执行永远都不会导致 page fault。因此,如果内核在试图对敏感内存进行操作时出现 page fault,就说明这种访问应该不是 speculative 性质的;内核就可以把这部分内存 map 上来从而继续执行。如果同时正在使用 SMT(simultaneous multi-threading),相应的兄弟 CPU 都会将在 map 这个内存之前就被 "击晕"(也就是强制进入 idle),从而额外确保安全。在返回虚拟机时,该内存区域会被再一次地 unmmap 掉,兄弟 CPU 也会被恢复正常。

使这一机制良好运作的关键是要确定哪些内存应被归类为敏感内存。如果能有更多的请求可以在无需 map 敏感内存的情况下处理掉,那么就可以提高性能和安全性。这是通过运行人们关注的各种 workload 并查看需要 map 敏感内存的虚拟机退出 event 的百分比来实现的;理想情况下,这个数字应该很低。如果情况不是这样的话,就需要查看正在被访问的内存,并确定它是否是敏感内容,从而可以相应地改变分配位置的代码来正确地对内存进行标记。

Weisse 最后说到,ASI 可以让未来解决那些必定会出现的新的投机性执行漏洞变得更加容易,并且性能损失远远小于目前的缓解措施所带来的损失。他说,开发者们应该重新考虑一下,服下这颗苦口良药。

Dave Hansen 问,ASI 是否可以扩展到更普遍的 baremetal system 上,而不是专门针对 KVM 接口。Weisse 回答说,应该是可以的,但要做到的话,还需要很多工作。

Christian Brauner 问道,为什么该 patch set 以前被拒绝了。发布了最新版本代码的 Junaid Shahid 说,没有人真正反对这个想法,但也没有人很希望把它合入进来。Hansen 说,他不喜欢这个方案,因为它为了一个相当小众的使用场景编写了大量的代码;它也根本没有解决 system-call 路径上的问题。他补充说,需要确定内存的敏感性的话,会给内核中各个地方都带来很大的维护负担。

会议结束时,没有就这项工作的未来得出任何真正的结论。除非有一天出现了一波对 ASI 的热情欢迎,否则它似乎可能会无限期地在 mainline 之外徘徊。这颗药丸,对大多数开发者来说,似乎仍然太苦了。

[感谢 LWN 订户对编者参加这次活动的支持。]

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

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

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

format,png

这篇关于LWN:呼吁再次考虑地址空间隔离!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/646782

相关文章

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

时间服务器中,适用于国内的 NTP 服务器地址,可用于时间同步或 Android 加速 GPS 定位

NTP 是什么?   NTP 是网络时间协议(Network Time Protocol),它用来同步网络设备【如计算机、手机】的时间的协议。 NTP 实现什么目的?   目的很简单,就是为了提供准确时间。因为我们的手表、设备等,经常会时间跑着跑着就有误差,或快或慢的少几秒,时间长了甚至误差过分钟。 NTP 服务器列表 最常见、熟知的就是 www.pool.ntp.org/zo

开启青龙 Ninja 扫码功能失效后修改成手动填写CK功能【修正Ninja拉库地址】

国内:进入容器docker exec -it qinglong bash #获取ninjagit clone -b main https://ghproxy.com/https://github.com/wjx0428/ninja.git /ql/ninja#安装cd /ql/ninja/backend && pnpm install cp .env.example .env

局域网内vue2 配置本地IP地址访问项目

在日常开发中同事可能需要访问你的前端项目,可以通过配置实现通过ip访问 一.首先找到config文件夹目录下的 index.js文件             将此处的host的值修改为0.0.0.0(即 host: 0.0.0.0) // Various Dev Server settings//host: 'localhost' //将localhost进行替换成 0.0.0.0host:

剑指Offer—编程题56(链表中环的入口地址)

题目:一个链表中包含环,如何找出环的入口结点? 解题思路   可以用两个指针来解决这个问题。先定义两个指针P1和P2指向链表的头结点。如果链表中环有n个结点,指针P1在链表上向前移动n步,然后两个指针以相同的速度向前移动。当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点。    剩下的问题就是如何得到环中结点的数目。我们在面试题15的第二个相关题目时用到

理解什么是DSR,嗅探器视角下的IP和MAC地址识别(C/C++代码实现)

网络嗅探器是监控和分析网络流量的一种工具,它能够捕获数据包并提取出关键的信息,比如IP地址和MAC地址。 网络嗅探器工作原理基于网卡的工作模式。正常情况下,网卡只处理发送给它的数据包,忽略其他数据。但是,如果将网卡设置为“混杂模式”,那么它可以接收到网络上所有的数据包,而不仅仅是发给它的数据包。网络嗅探器就是利用了这一特性来捕获网络上的数据交换。 数据包是网络通信的基本单位,包含了传输数据和控

python3GUI--ktv点歌软件By:PyQt5(附下载地址)

文章目录 一.前言二.展示1.启动2.搜索2.服务1.首页2.天气预报3.酒水饮料4.酒水饮料2 3.服务4.灯光5.调音6.排行榜7.分类点歌9.歌手点歌10.歌手个人页 三.心得体会1.关于代码2.关于设计3.关于打包 四.总结 文件大小:33.13M https://wwt.lanzoul.com/iikRv22iqmpg 如果安装后打不开,多半是权限问题,请使用管理

【续2】linux C语言 文件描述符 读写地址分析

记录时间:2014-10-24 10:35 记录原因:一直对文件指针读写存在疑惑,导致经常性的操作文件时,结果不理想。原来一直是对文件被打开后,对文件流指针的读写位置没有弄清楚。 文件在打开后,任何一个对文件的操作都会改变文件流指针的位置,所以在对文件进行操作时,应从如下两点考虑: 1、文件是不是第一次打开:可以确认文件指针的确却位置; 2、检测文件打开方式,特殊注

linux C语言 文件描述符 读写地址分析

1、fwrite 和 fread对文件操作之后,文件位置指针已经移动到被操作的位置; 2、如果不是在fread或fwrite操作后的位置读、写文件内容,那么必须重新定位文件指针位置,此时可以使用 rewind、fseek函数; 3、rewind(FILE *stream):将文件指针直接移动到文件起始位置; 4、fseek(FILE *stream, long offset

【LinuxC语言】深入理解IP地址与端口号

文章目录 前言端口号IP地址IP地址的分类主机地址与网络地址多播是什么子网掩码 特殊的地址与私有的地址总结 前言 在计算机网络中,IP 地址和端口号是两个非常重要的概念。IP 地址用于标识网络上的设备,而端口号则用于在同一设备上区分不同的服务或应用。在 Linux C 语言编程中,我们经常需要处理 IP 地址和端口号,例如在创建套接字、建立网络连接等操作中。因此,深入理解 I