LWN:memfd_secret()

The state of guest_memfd 在有硬件支持的实现中,主机如果尝试访问 guest 的私有内存,甚至可能触发机器检查,导致系统崩溃。仍可以通过将私有内存从主机的 direct map(直接映射)中移除,来实现一定程度的设备隐私保护,使得主机无法对其寻址。然而,主机依然保留对这部分内存的访问权限,这意味着它可以轻松地查看这些内存中的数据,即便这些数据是虚拟机希望保密的。子系统中分配内存,但随后将其转换为普通 folio,如果需要,可以将其映射或拆分,以便将其中较小的部分在共享与私有之间转换。但如果主机尝试访问私有页,依然会触发总线错误。 阅读详情

memfd_secret()

第一个是 Mike Rapoport 的 memfd_secret()补丁集,之前已经介绍过了(https://lwn.net/Articles/812325/),所以我们这里仅仅再简单介绍一下,详细背景资料请看那篇文章。这项工作的目的是允许用户空间进程创建一个 "秘密 "的内存区域,这个区域尽可能除了此进程之外都无法访问。预期的使用场景包括用在加密函数库中,可以使用秘密区域来保存加密密钥,并保证它们不被窥探。

在最新版本的 patch 中,这个功能已经被移到了一个单独的系统调用中。

int memfd_secret(unsigned long flags);

函数的返回值是文件描述符,可供传递给 mmap()来 map 实际的内存区域。大多数情况下,这个内存看起来(对 map 的进程来说)就像其他内存区域一样,不过还是会有一些区别:

  • 这个范围内的内存 page 将会从内核的 direct map 中移除掉,因为 direct map 会允许内核访问(几乎)系统中任何物理页的部分。这样改动之后,内核更难访问到这些内存了,无论是普通访问还是通过漏洞访问都不可以了。

  • 如果 flags 包含 SECRETMEM_UNCACHED,那么只要底层架构支持,这部分内存将被映射为 uncached。uncached 内存访问速度会慢得多,但它也不会受那些预测执行的漏洞的影响。

秘密区域的内存被 lock 在 RAM 中,无法被 swap。因此,这会被算入此进程的 locked-memory limit 限制之内。

这样的功能一直存在一个问题:从内核的 direct map 中移除 page,这是一个会带来很大性能损失的动作。direct map 使用 huge page,因此使用了尽量少的系统 TLB。从 direct map 中移除这里那里的 page,会破坏这些 huge page,显著增加要使用的 TLB 数量。为了将这种影响降到最低,memfd_secret()patchset 维护了另一个独立的物理连续页面的缓存。

最近这个 patch set 的改动已经不多了,所以它可能已经接近于可以被合入。不过,在实际打上这个 patch 之前,人们很难确定 memory-management patch 是否真的会被合入。

KVM 保护内存

虽然内存泄露漏洞在任何系统上都是坏事,但在运行虚拟化 guest OS 的系统上问题更大。这类机器可能运行着来自完全不相关的人员的 workload,而这些 workload 通常来说是不愿意互相分享秘密信息的。因此,由于很可能与攻击者控制的 guest OS 共享物理系统,使得内存保护成为了一个更加紧迫的问题。作为加固这些系统的一种方式,CPU 厂商一直在增加内存加密机制,使 guest memory 无法被内核以及其他 guest 访问。不过这些功能都会带来一些额外开销,而且目前支持这些功能的硬件还远未普及。

但是, Kirill Shutemov 从这些技术中得出了一个有趣的结论:使用了这些技术的系统仍然可以正常工作,这意味着大多数时候其实内核或 hypervisor 并不需要访问这些内存。所以他整理了一套 patch set,完全采用了软件方法来实现。运行这套代码的系统并不需要对 guest memory 进行加密,而只是简单地将其 unmap 掉。这个功能需要内核和 guest 两边都要支持。

具体来说就是增加了一个 KVM hypercall,允许 guest 请求他们的内存不可被其他人访问到。host kernel 会相应处理,也就是从 direct map 中删除分配给 guest 的这些内存,从而无法访问该内存。用户空间中的方法有点不同:任何属于 guest 的内存仍然保持 mapped 状态,但被标记为 PROT_NONE 这种保护模式,从而使得无法访问了。这将影响像 QEMU 模拟器这样的程序,它会无法直接访问 guest memory。不进行 mapping 的话,自然也会阻止来自其他 guest 的攻击。在 guest 内部,guest kernel 照常控制着内存权限(memory permission)。

这种隔离方式保护了 guest memory,使其不至于因为内核或 QEMU 等组件的漏洞而被意外访问到。但这并不是一种完全的保护。如果 host kernel 被入侵,可以执行任意代码的话,它就可以随意重映射这些 page 并偷取到其中内容。不过对于绝大多数让内核访问野指针指针的漏洞或者 speculative-execution 漏洞来说,这种 unmapping 动作就可以给攻击者增加很大的麻烦。

当然,有些时候,内核必须访问 guest 内部的内存才能执行正常的内核功能。我们为 guest 添加了第二个 hypercall,用来表明它们需要向 host kernel 开放哪些内存。这些范围将被映射到 host kernel 的地址空间内。虚拟化设备的 DMA buffer 就是一个例子,guest 会希望以这种方式与 host kernel 共享内存。

这项工作看起来很有价值,但还是有一些问题需要先解决,才能合入。与 memfd_secret()不同的是,这项工作没有提供避免 page 被移除产生的 direct map 碎片问题的解决方案,因为在这种情况下涉及的内存空间相当大,碎片问题可能会更严重。unmap 的 guest memory 无法被迁移(migration),这就破坏了内核的内存 defragment 机制。这很可能会随着运行的时间变长,而造成各种问题。Shutemov 也承认,需要先解决这个问题再合并 patch。目前如果一个 guest 系统启用了这种内存保护方式的话,也就不可以被 reboot 了。Shutemov 建议这种情况可以直接判定为 "不支持",不过这个想法已经在讨论中引起了抱怨。

这些问题意味着 KVM proected memory 这个功能不会在不久的将来内出现在主线内核中。不过这两个 patch set 很可能都给我们指明了今后发展的一个方向。尽可能的共享内存,这会提高性能,但越来越明显看出与之相关的安全问题很难解决。所以,尽可能地分离地址空间,这看起来是一个相对简单的方法,可以避开许多这类问题。

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

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

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

Ubuntu下bpf纯c程序的编写与运行 1. 前言 2. 搭建bpf程序运行环境 2.1 下载源码 3. bpf代码分析及运行 4. 总结 阅读详情

相关推荐

Windows中的TLS 1.2启用方法(IIS、C#、.Net framework)

折腾几天了windows中的tls1.2启用方法!特此记录一下 开发背景: 在一个用.net framework 2.0开发的客户端程序里面嵌入功能调用第三方物联网相关接口,服务器上有一个restful接口用于接收第三方上报的数据及处理,最后再调用第三方的物联网相关接口。本机开发环境Windows 10,客户服务器是Windows Server 2008 R2。 第一次写这种物联网相关的接口调用,而且第三方提供的文档比较简单,最基本的报文示例都没。开发环境里面各种摸索一步一个坑,首先在发送HTTP请求前

dl1314ld的博客 1万+

LWN:GCC也支持BPF了!

关注了就能看到更多这么棒的文章哦~BPF in GCCBy Jake EdgeSeptember 15, 2020LPC原文来自:https://lwn.net/Articles/831...

Linux News搬运工 1198

Mac上安装Label Studio

以上步骤详细说明了如何在Mac上通过Anaconda安装Label Studio。记得根据你的具体需求选择是否创建新的环境,并使用conda或pip进行安装。安装完成后,务必验证Label Studio是否成功运行。

g2526的博客 1957

LWN:使用GCC编译生成BPF程序

点击上方蓝色“Linux News搬运工”关注我们~ Compiling to BPF with GCC ByJonathan Corbet LPC 自从在kern...

Linux News搬运工 1557

【纯血鸿蒙】安装hdc工具

参考资料:

oh.K 5546

grafana 配置页面告警

Rate 下拉选择也可,保持默认也可。By label 选择一个比如选择filename。配置无数据或者错误数据的时候如何处理,这里选择 Normal (表示当做正常不会告警)单机 node_name 标签,选择一个主机,选好后单机 Show logs。单机 New floder,如果之前配置过,也可以选择。单机 Save contact point 保存即可。会跳出如下对话框(如果没有跳出就自己单机选择下)完成后会自动生成如下图,告警规则部分就配置好了。选择告警接收方式(这里选择企业微信 WeCon)

weixin_40548182的博客 3251

LWN: 5.14 中的 memfd_secret()!

关注了就能看到更多这么棒的文章哦~memfd_secret() in 5.14By Jonathan CorbetAugust 6, 2021DeepL assisted translat...

Linux News搬运工 602

管道机器人手臂机械结构设计cad【8张】+三维图+设计说明书+绛重

履带式管道机器人适用于各种管道环境,包括直管道、弯曲管道、水平管道、垂直管道等,其灵活性和适应性使得它可以应对不同形状和尺寸的管道,完成全面的检测和维护工作。管道机器人研究具有重要的现实意义和深远的社会影响,通过提高工作效率、降低人员风险、提升服务质量、节约成本资源和促进科技创新等方面的作用,为现代工程技术领域的发展和进步做出了积极的贡献。管道机器人是一种能够在管道内部执行各种任务的智能机器人,而管道机器人的机械臂对于管道机器人在管道内执行任务的灵活性、稳定性和效率至关重要。

kejigongjiang的博客 943

LWN:KVM使用Guest-first memory!

关注了就能看到更多这么棒的文章哦~Guest-first memory for KVMBy Jonathan CorbetNovember 2, 2023ChatGPT translationhttps://lwn.net/Articles/949277/保护计算(confidential-computing)实现的核心目标之一是保护客户(guest)系统的内存免受来自客户本身之外的其他使用者的访...

Linux News搬运工 1243

跨模态行人重识别实战:Python复现SYSU-MM01官方评估协议

本文详细介绍了如何用Python复现SYSU-MM01数据集的官方评估协议,以解决原Matlab代码在Python生态中不便使用的问题。文章深入解析了数据集的`indoor`与`all`两种评估模式,并提供了完整的Python代码实现,包括特征加载、相似度计算、Rank-k与mAP指标计算等核心步骤,确保评估结果与官方Matlab版本完全一致,助力跨模态行人重识别研究。

weixin_29081163的博客 99

LLC型自驱动半桥谐振变换器:电压电流变化与自然换向解析

变换器的工作状态经历了多个阶段,从模态一的关断状态,到模态二和三的电流供电状态,每个阶段都得到了合理的设计和优化。的工作原理,尤其是在半个周期内的电压和电流变化。上图 展示了该变换器在工作时的电压和电流波形,它为我们揭示了变换器如何通过精确的电流和电压控制,优化性能并实现高效能转换。,并根据负载情况调整电流和电压的工作模式,能够极大提升变换器的效率,尤其是在零电压开通和自然换向的设计中,发挥着关键作用。这意味着,电流会随着时间周期的变化,呈现典型的振荡波形,从而达到良好的电流控制。是两个关键的电流变量。

weixin_43199439的博客 279

LWN:在memfd中附加安全保护功能!

关注了就能看到更多这么棒的文章哦~Keeping secrets in memfd areasByJonathan CorbetFebruary 14, 2020原文来自:https:...

Linux News搬运工 1099

把 SAP Query 用到极致:ABAP Query 的核心概念、配置流程、权限与运输治理全解析

摘要:SAP Query 是一款面向业务用户的自助报表工具,可解决标准报表无法满足业务需求的问题。其核心由四大组件构成:Queries(报表定义)、InfoSets(数据视图)、User Groups(权限分组)和Translation(多语言支持)。通过SQ03、SQ02、SQ01事务码分步创建用户组、数据视图和查询,业务用户无需ABAP知识即可生成Basic List(明细)、Statistics(统计)和Ranked List(排名)三种报表形式。典型案例展示了如何为采购部门设计包含明细追溯和Top1

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 179

LWN:5.14合并窗口结束了!

关注了就能看到更多这么棒的文章哦~The conclusion of the 5.14 merge windowBy Jonathan CorbetJuly 12, 2021DeepL a...

Linux News搬运工 506

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LWN:地址空间隔离的两个patch!(重发)

关注了就能看到更多这么棒的文章哦~Two address-space-isolation patches get closerBy Jonathan CorbetOctober 27, ...

Linux News搬运工 288

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

LWN: KVM guest 里的私有内存!

关注了就能看到更多这么棒的文章哦~Private memory for KVM guestsBy Jonathan CorbetApril 7, 2022DeepL assisted translationhttps://lwn.net/Articles/890224/云计算是很美妙的;它可以更加有效地利用好计算系统,并使虚拟机在点击鼠标或调用 API 时立即就准备好。但...

Linux News搬运工 665

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LWN:2022年嵌入式Linux的进展!

关注了就能看到更多这么棒的文章哦~The 2022 embedded Linux updateBy Jake EdgeJuly 6, 2022OSSNADeepL assisted translationhttps://lwn.net/Articles/899742/Embedded Linux Conference(ELC)的一个常规内容是会议组织者 Tim Bird ...

Linux News搬运工 774

LWN:期待 Linux Plumbers 2021 大会!

关注了就能看到更多这么棒的文章哦~A look forward to Linux Plumbers 2021By Jake EdgeJuly 27, 2021DeepL assisted ...

Linux News搬运工 783

LPC 2024 会议讨论 sched_ext

可扩展调度类(sched_ext)允许以一组从用户空间加载的 BPF 程序的形式实现 CPU 调度器;它首次出现在 2022 年底的邮件列表中。自那以来,sched_ext 引发了一些争议,但目前计划将成为 6.12 内核发布的一部分。在 2024 年的 Linux Plumbers Conference 上,日益壮大的 sched_ext 社区举行了其首次公开聚会;sched_ext 似乎在调度器设计中引发了新的创造力爆发。

weixin_49382066的博客 738

【Rust 日报】2021-09-29 Linux Plumbers Conference 2021有9个主题与 Rust 相关

LLVM13 的最新的 pass manager 进展让 Rust 的编译速度整体提高 5~20%微软的 Ryan Levick 大神提到,LLVM13 的最新的 pass manager...

Rust语言学习交流 364

LWN: 5.13 合并窗口第二部分!

关注了就能看到更多这么棒的文章哦~The second half of the 5.13 merge windowBy Jonathan CorbetMay 10, 2021DeepL a...

Linux News搬运工 259

BPF学习笔记(三)--BPF示例程序

上一篇文章中BPF的例子是以BCC的整体框架为基础,本篇介绍一下基于libbpf库函数为基础,结合内核中的bpf的sample为基础编写一个BPF的程序,本篇介绍是以《linux-observability-with-bpf》这本书第二章的例子为基础,由于内核版本的不同,本篇介绍是以Linux5.16内核为基础,Linux5.16内核中的接口函数与书中的给到的程序案例有较大的差别。2)随着bpf和内核版本的不断变化,参考本文时需要重点关注不同的内核版本、bpftool、gcc等各类工具的版本。

frankzfz的专栏 2967

LWN:内核KSM综述!

关注了就能看到更多这么棒的文章哦~An overview of kernel samepage merging (KSM)By Jake EdgeNovember 29, 2023LPCChatGPT translationhttps://lwn.net/Articles/953141/[2023-12-08 Fri 12:57]在2023 Linux Plumbers Conference(LP...

Linux News搬运工 1468

BPF示例在64位ARM上的调试

eBPF调试工具 eBPF作为Linux内核中调试功能强大的子系统,相应的应用层调试工具有很多,例如bpftool/bpftrace,以及提供了Lua和Python调试接口的bcc;内核信息收集、性能分析的开源工具SystemTap也用到了内核的eBPF功能。不过笔者希望在嵌入式设备上使用eBPF提供的调试功能,一种方法是使用开源的SDK(例如yocto,笔者未尝试过)自动化构建这些调试工具(否则就需要手动交叉编译);另一种方法是将某个支持arm64架构的Linux发行版(例如运行debian系统的树莓派)

yeholmes的专栏 5110

LWN:高层级服务质量(QoS)接口

此外,用户对比了 Windows 和 Linux 的系统健壮性,强调即便在极端负载下,系统也应保留足够的 CPU 和内存资源用于鼠标移动和启动终端,以避免用户在遇到失控程序时只能强行重启。它提供了四个 QoS 级别供程序选择:用户交互(user interactive,用于更新程序界面的任务)、用户发起(user initiated,用于用户正在进行的操作)、实用工具(utility,用于应及时发生但不会直接影响用户的任务)以及后台(background,用于对延迟没有特殊要求的任务)。

Linux News搬运工 97

BCC和libbpf的转换

BCC和libbpf的转换 转载 BCC和libbpf的转换 本文讲述如何将基于BCC的BPF应用转换为libbpf + BPF CO-RE。BPF CO-RE可以参见上一篇博文。 为什么是libbpf和BPF CO-RE? 历史上,当需要开发一个BPF应用时可以选择BCC 框架,在实现各种用于Tracepoints的BPF程序时需要将BPF程序加载到内核中。BCC提供了内置的Clang编译器,可以在运行时编译BPF代码,并将其定制为符合特定主机内核的程序。这是在不断变化的内核内部下开发可维护的BPF应用程

qq_40848737的博客 924
上一篇: LWN:5.10合并窗口的后半部分!
下一篇: LWN:地址空间隔离的两个patch!(重发)
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值