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

共享内存技术之memfd_create() 文章目录前言跨进程分享文件描述符memfd_create函数介绍案例数据采集端数据接收端Makefile验证 前言 写这边博客的目的,在于对宋宝华老师的无线崇拜!在阅读了他的世界上最好的共享内存博客以后,正如原文所说,发现了一个尤物,不得已眼前一亮,让人把持不住。废话少说,直接上干货 跨进程分享文件描述符 以下文字均来自于宋宝华老师的共享内存博客 某年某月的某一天,人们发现,一个进程其实想访问另外一个进程的fd。当然,这只是目的不是手段。比如进程A有2个fd指向2片内存,如果进程B可以拿到这2个fd,其实 阅读详情

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

Keeping secrets in memfd areas

By Jonathan Corbet
February 14, 2020

原文来自:https://lwn.net/Articles/812325/

2019年11月时,Mike Rapoport指出在Linux系统中有太多地址空间共享(address-space sharing)的情况了。这种共享很便捷,也对性能有好处,但是现代有了许多复杂的攻击方式以及一些硬件上的安全风险,所以地址空间共享很容易造成安全问题。当时他提出了一些改动建议,此时他提出了响应的patch,针对memfd机制实现了一些地址空间隔离的方案。这可以给大家展示一下我们今后可能的用法,不过也还遗留了许多有难度的工作有待完成。

有几种方法会导致地址空间的共享。Linux传统上一直会把kernel的地址空间映射到每个user-space进程里,这样可以在多方面提高性能。多年以来大家一直认为这种地址空间共享是很安全的,因为这个mapping禁止了user-space对这部分内存空间的访问。不过Meltdown和Spectre这两个硬件bug则会导致这个内存映射变得不安全,所以此前合入了kernel page-table isolation的patch来关闭这处地址共享。

另外,在处理器的memory cache里面也有空间共享。硬件bug同样会导致这部分共享区域的数据可能被泄露出去。这样一来kernel的direct map(kernel space里面的一个大范围地址映射,包含了所有的物理内存区域)就有问题了。这个direct map对kernel来说非常方便,不过也就导致所有user-space memory在kernel中其实都是可见的。换句话说,攻击者哪怕在kernel上下文只要能运行一点点代码,就可以访问到系统中的所有memory内容。所以,既然现在有了speculative-execution bug这类攻击方式了,那么肯定这里也就不安全了。

memfd subsystem本来设计的时候不是用于address-space isolation的,它的目的实际上是为了实现一种进程间通信的机制。不过,它确实也提供了能把一个memory区域关联到文件描述符上的功能,并且能有一些特殊的属性。比如可以把一个memfd改为"sealed"状态,这样接收方就能知道这个fd不会改变。Rapoport认为这个特点会非常有助于实现“secret memory"功能。

在真正创建一个隔离内存区域的时候,需要在memfd_create()里传入一个新的MFD_SECRET flag。不过这里并没有指定是哪种安全级别了。后面还有许多参数可以指定不同级别的安全和性能等级,这样用户就能自己来决定。在这个patch中已经实现的可用选项都可以在调用memfd_create()的时候用相应的flag来选择,不过Rapoport决定要求用户调用一次ioctl()来指定。等到用ioctl()来选择了安全级别之后,用户才可以对这个memfd进行map操作,因此不做的话其实无法使用这个memfd。

目前已经实现了两种模式。MFD_SECRET_EXCLUSIVE,会做一些操作来把memfd对应的memory隐藏起来,不让外人看到,比如说会把这类memory标记成unevictable,从而永远不会被flush到swap中去。这个效果类似于调用mlock(),不过还有一些区别:实际上直到真正发生mem fault的时候才会真正分配内存page,并且它这里设置的locked page数量限制跟mlock()的限制并不一样(这里可能是实现错误了?)。同时也没有办法能把page unlock掉,只有在销毁memfd的时候才会进行unmap操作、并关闭文件描述符。

MFD_SECRET_EXLUSIVE还做了一件事,它会把memfd所对应的内存page从kernel的direct map中移除,这样kernel space就无法再访问这块内存了。这里有点麻烦,是因为direct map通常都是用huge page方式映射的(因为这样在访问时效率更高),如果把小块page从中移除,就需要把huge page拆散成许多小page来,这样系统中所有人的操作都会更加低效。目前的代码(作者承认是个概念性的代码)会在各个page触发fault的时候分配这个page,这样会放大对direct map的影响。这里肯定需要大改,否则这个patch不可能被接受合入的。

另外一个模式就是MFD_SECRET_UNCACHED,它除了拥有MFD_SECRET_EXLUSIVE的所有特性之外,还会让这个memory在映射时指定不允许使用cache。这样这部分内容就不会出现在处理器的cache里面,哪怕用上那些硬件bug来攻击也无法访问到这些内容了。当然这也会导致访问这块memory的时候会更加慢,甚至可能会让用户误以为这块memory根本无法访问。不过,对于那些不经常访问的小块数据(比如秘钥),这个方案也许可以用得上。

目前来说,这个功能只允许选择一个模式。其实MFD_SECRET_UNCACHED已经包含了MFD_SECRET_EXCLUSIVE,只不过更加严格,所以目前哪怕只能选择一个模式也不是什么问题。Rapoport认为这个API今后可能还会变,有可能会是“指定各种秘密等级,例如从'比起普通数据稍微秘密一点'一直到'想尽办法来保护数据哪怕损失性能也在所不惜'。”

这个patch提出来的目的之一就是请大家反馈一下对这套API的看法,不过目前还没有多说反馈。这个改动也会也会沦为那种“直到开发完快要merge的时候大家才会认真考虑这个问题”的哪种情况。不过,至少这个工作不再是个秘密了,感兴趣的用户可以开始想想这个功能是否能满足自己的需求啦。

继续survey!

全文完

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

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

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

Linux编程:通过memfd_create创建一个匿名内存文件 lrwx------ 1 xxx xxx 64 7月 9 21:57 3 -> '/memfd:mem_file (deleted)'memfd_create提供了一个方法,可以在内存中创建一个匿名文件,但是这个文件在真实的文件系统中却不存在。3.文件的初始大小为0,但是可以通过write向文件中写入数据,或通过ftruncate设置文件的大小。4.函数返回的文件描述符与open返回的并无差异,因此可以通过mmap进行文件内存映射。2.函数返回的文件描述符默认已经设置了读写权限。name:文件的名字。 阅读详情

相关推荐

LWN: 5.14 中的 memfd_secret()!

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

Linux News搬运工 602

避坑指南:ZYNQ PS端读写BRAM时容易忽略的5个配置细节(基于Vivado 2022.1)

本文基于Vivado 2022.1,总结了ZYNQ PS端读写单口BRAM时5个易被忽略的关键配置细节。内容涵盖关闭Safety Circuit以优化时序、精确匹配AXI控制器与BRAM的地址深度、注意PS端函数位宽与地址对齐、正确连接时钟复位域,并提供了实用的调试技巧与诊断代码,帮助工程师规避常见陷阱,确保数据交互稳定可靠。

net55的博客 374

LWN:GCC也支持BPF了!

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

Linux News搬运工 1198

距离多普勒谱(RD谱)绘制方法及理解

RD谱是信号处理领域常用的图形。原始信号往往是一维时域序列,如何将其二维化,并进行变换生成RD谱呢?由于刚刚接触,查阅了网络上、老师手里的资料,发现RD谱的绘制方法并不统一,有些存在一定问题。在此,将心得体会记录下来。

mddh_123的博客 3万+

从桨叶设计到电机匹配:手把手教你调出无人机最佳动力组合

本文系统介绍了无人机动力系统的核心匹配原则,重点解析了如何通过测试与数据分析,优化螺旋桨与电机的组合,从而显著提升系统力效与续航。文章提供了从参数解读、实战测试到深度调优的完整指南,帮助开发者解决电机过热、推力不足等常见问题,实现无人机性能最大化。

weixin_29305313的博客 235

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

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

Linux News搬运工 259

具身智能:从理论突破到场景落地的全解析

具身智能(Embodied Intelligence)是人工智能与机器人学深度融合的前沿领域,其核心在于通过物理实体与环境的动态交互实现智能行为。区别于传统 AI 的 “离身性”(如语音助手仅依赖数据输入),具身智能强调 “智能体通过身体感知世界并反作用于环境”,形成 “感知 - 决策 - 行动” 的闭环。例如,能自主避障的配送机器人、可精准抓取异形物体的机械臂,均通过传感器网络与环境实时互动,在试错中优化行为策略。

LeeKumaの技术Note 2679

LWN:memfd_secret()

memfd_secret()第一个是 Mike Rapoport 的 memfd_secret()补丁集,之前已经介绍过了(https://lwn.net/Articles/812325...

Linux News搬运工 492

HWSD全球土壤数据下载、处理与提取完整指南

全球尺度的科学研究与工程项目中,土壤数据是必不可少的基础底图,而HWSD(和谐世界土壤数据库)凭借其统一的分辨率与属性标准,成为农业区划、生态模型、土地利用变化和水资源评估等领域的通用数据源。深入理解其“栅格存编号、数据库存属性”的核心原理,是高效使用这套数据的关键。通过掌握MDB数据库结构、属性字段含义以及栅格与属性表的关联方法,研究者可以将原始数据转化为可用的研究底图。无论你是需要提取特定区域的土壤属性,还是进行面积统计与点位采样,合理的处理流程都能显著提升工作效率。本文从下载注册开始,一步步梳理数据清

weixin_29056781的博客 313

基于Simulink进行多相电机EMI抑制的仿真建模

特点高可靠性:通过增加相数来提供冗余,增强系统的故障容忍度。低转矩脉动:改善了电机的动态性能,减少了转矩波动。复杂的EMI管理:更多的相数意味着更复杂的电磁环境,增加了EMI抑制的难度。挑战模型复杂性:涉及电气、机械和电磁场等多个领域的相互作用。实时性要求:控制系统需要能够快速响应以适应动态负载变化。多变量优化:包括滤波器设计、PWM调制策略等在内的多个参数需综合考虑以找到最优解。使用Simscape Electrical库来构建一个多相电机模型。

amy_mhd的博客 272

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

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

Linux News搬运工 288

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LWN:用户空间的 per-CPU memory!

本质上,这是缓存行对齐数组方法的变体,但分配器会将分配的数据紧凑地排列在每个 CPU 的区域内,从而减少这些区域之间的内存浪费。Desnoyers 首先表示,他的目标是帮助用户空间开发者更好地利用 restartable sequences (可重启序列),它通过在关键部分中断进程(如果进程在此时被迁移),从而促进对 per-CPU 数据的某些类型的访问。因此,该库首先在一个特殊的“初始化区域”中初始化一个 CPU 的内存,然后为每个 CPU 创建该区域的写时复制(copy-on-write)映射。

Linux News搬运工 1516

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LWN: 关闭SIGBUS信号!

关注了就能看到更多这么棒的文章哦~Suppressing SIGBUS signalsBy Jonathan CorbetJune 25, 2021DeepL assisted trans...

Linux News搬运工 610

LWN:将进程的可执行文件对它自己隐藏起来!

关注了就能看到更多这么棒的文章哦~Hiding a process's executable from itselfBy Jonathan CorbetJanuary 23, 2023DeepL assisted translationhttps://lwn.net/Articles/920384/早在 2019 年的时候,由于一个重要的容器(container)漏洞 (https://lwn.n...

Linux News搬运工 465

linux 匿名文件 memfd_create

本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。本专栏已经分享共享内存,文件映射,匿名/命名管道,消息队列等四种进程间通信的方式,本文来介绍第五种方式memfd_create,而且非常特别,且看本文分解。

一个追逐梦想的码农 7032

Linux四种共享内存技术(附源码):SystemV、POSIX mmap、memfd_create、dma-buf

《Linux 下的进程间通信:管道、消息队列、共享文件、共享内存》 《【共享内存】基于共享内存的无锁消息队列设计》 《File Sealing & memfd_create() | 文件密封和memfd_create()》 《Linux环境无文件渗透执行ELF:memfd_create、ptrace》 《利用ptrace和memfd_create混淆程序名和参数》 《宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)》 先给出宋宝华老师的结论: 目录 共享内存的方式

RToax 7890

使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符

通过fcntl设置FD_CLOEXEC标志有什么用?    close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述符被关闭,不能再使用它,但是在使用fork调用的子进程中,此描述符并不关闭,仍可使用。   通过fcntl设置FD_CLOEXEC标志有什么用? close on exec, not on-

hunanchenxingyu的专栏 6006

利用memfd_create实现无文件攻击

该函数在内核3.17版本中引入,会创建一个匿名文件并返回一个文件描述符指向它,该文件表现和常规文件类同, 可以进行修改,截断,内存映射等等,但不同的是,它存在于RAM当中。在对Linux系统进行应急时,一般会查看进程的上下文信息,在Linux中进程的信息都在/proc/目录下,我们先了解下/proc/目录下部分文件的含义,其他文件可以自行查询含义,在IR中用的比较少。首先,我们需要从文件描述符中获取一个Perl文件句柄,然后我们需要将我们的数据转换为可写的格式,最后将其写入内存。

若有战,召必回 2632

LWN:让memfd支持 non-executable!

关注了就能看到更多这么棒的文章哦~Enabling non-executable memfdsBy Jonathan CorbetDecember 19, 2022DeepL assisted translationhttps://lwn.net/Articles/918106/memfd 接口是一个有点奇怪的功能,也是 Linux 特有的;最初是为了支持单个系统上多个合作进程之间的数据安全传递而...

Linux News搬运工 1037

linux memfd 和udmabuf 机制详解

Linux内核提供了memfd和udmabuf两种高效的用户空间与设备驱动内存共享机制。memfd_create系统调用创建匿名内存文件,支持标准文件操作和mmap映射,通过文件密封(Sealing)机制确保DMA操作安全。udmabuf则专为设备驱动设计,实现零拷贝内存共享。两者共同构成了现代GPU运行时(如ROCm)实现CPU-GPU共享内存的基础设施,广泛应用于进程间通信、临时文件处理和沙箱安全等场景。

图形/计算GPU的驱动与虚拟化技术分享园地 2188

memfd_create 用法

memfd_create 用法

我的博客 828

linux 共享内存方式

linux 共享内存方式

SWX230162的博客 1313

非文件形式的内存动态函数库调用接口

使用memfd的系统调用接口将动态库加载到proc虚拟文件系统,提供的fd为进程持有的句柄,通过dlopen的path指向此句柄,即可实现非文件系统加载动态链接库。

RZer的博客 801
上一篇: LWN:再次审视stable-kernel里面的质量回退问题!
下一篇: LWN:管理文件系统在namespace中的UID映射!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值