LWN:mseal() 以及后续方案!

本文讨论了JeffXu提出的mseal()系统调用,旨在防止内存映射修改,以增强安全性。然而,Linux内核开发中遇到困难,尤其是关于接口设计和与其他功能兼容性的问题。Chrome浏览器的使用需求和OpenBSD的mimmutable()功能对比也被提及。

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

mseal() and what comes after

By Jonathan Corbet
October 20, 2023
ChatGPT translation
https://lwn.net/Articles/948129/

Jeff Xu提出了新增一个名为 mseal() 的系统调用的提案,该系统调用将允许应用程序阻止对选定内存映射(memory mapping)的修改。这有助于阻止用户空间应用程序对某些类型的攻击;一些其他操作系统已经具备了这种功能。在Linux内核中也有添加此类机制的支持,但是目前明确下来 mseal() 不会以其当前形式进入主线。相反,从多个角度来说,它已经成为了内核开发中应该不要做什么的一个反面案例。

Xu描述了新系统调用的目的如下:

“内存密封可以额外防止对映射本身进行修改。这有助于减轻已损坏的指针传递给内存管理系统调用的情况下的内存破坏问题。例如,这样的攻击方式可以破坏控制流完整性(control-flow integrity)的保证,因为应该受信任的只读内存可能会改变为可写,或者.text page可以重新映射。”

这项功能的目标用户是Chrome浏览器,其中包含了JavaScript代码的即时(JIT)编译引擎。由于它会即时生成可执行代码,因此JIT编译必须小心进行,以免创建(和运行)有问题的代码。如Stephen Röttger在这篇博客文章中所述,已经付出了大量努力来实现控制流完整性,以防止JIT系统成为攻击者的工具。但是,如果攻击者以某种方式强制执行更改内存权限的内存管理系统调用,那么一切预防措施都不再成立。因此,Chrome开发人员希望有一种机制,使那些系统调用不适用于内存的特定区域,以增强浏览器对此类攻击的防护。

封面信件指出, mseal() 类似于最近添加到OpenBSD的 mimmutable()。但是,所提议的系统调用的原型与 mimmutable() 完全不同:

int mseal(void *addr, size_t len, unsigned int types, unsigned int flags);

要受影响的内存范围由 addr 和 len 指示。必须将 flags 设置为零,而 types 控制要在该地址范围上阻止哪些系统调用:

  • MM_SEAL_MPROTECT: mprotect()和pkey_mprotect()

  • MM_SEAL_MMAP: mmap()

  • MM_SEAL_MUNMAP: munmap()

  • MM_SEAL_MREMAP: mremap()

  • MM_SEAL_MSEAL: 未来的 mseal() 调用

Linus Torvalds迅速对该补丁系列提出了异议,他表示:“我对添加某种“锁定内存映射”模型没有异议,但对当前方案不满意”。他对实现的细节提出了许多投诉,但后来明确表示系统调用的设计是错误的。例如,阻止 munmap() 在其他可以导致地址取消映射的操作(例如mmap()和mremap())仍然被允许,是没有多少意义的。他说,投入的努力只阻止特定系统调用操作,这显然是错误的做法;如果阻止了一个范围的内存被取消映射(例如),它必须从所有方向阻止,否则提供的保护将只是一个幻想。

Matthew Wilcox质疑接口的复杂性,建议仅添加到 mprotect() 的几个标志即可。他表示,内存区域应该是不可变的(可能还可以进一步减少访问权限),或者不可变,无论是使用哪个系统调用。他后来补充道:

“这就是seccomp的毛病,并且更糟,因为你试图拒绝单个系统调用,而不是建立一个可以允许的系统调用列表。如果我们明天引入了一个新的系统调用,可以影响VMA,那么问题将归咎于应用程序未禁用新的系统调用。那是可怕的设计!”

甚至在linux-kernel上还出现了OpenBSD维护者Theo de Raadt,他赞同了Torvalds的观点,并建议Linux应该简单地添加 mimmutable() ,而不是以更复杂的形式重新发明该功能。Torvalds 同意了这个想法 ,尽管他建议添加一个用于未来更改的 flags参数,Theo de Raadt不喜欢 这个想法。这反映了一个事实,就是OpenBSD可以控制其用户空间,因此如果有必要的话它可以在今后添加一个flags参数;Linux没有这种奢侈的条件,因此如果要存在的话,该参数必须从一开始就存在。

Xu抵制了这个想法,引发了一种典型的(相对温和的)de Raadt回复。实际上,即使在收到了评论后,Xu仍然坚持他提出的设计,这就引出了来自Wilcox的回复,Wilcox在其中试图把讨论引导回这组补丁系列实际试图实现的内容之上:

“让我们从目的开始。mimmutable/mseal/任何东西的目的是修复地址范围到其基础对象的映射,无论它是特定的文件映射还是匿名内存。调用成功后,不得可能使该虚拟范围中的任何地址指向任何其他对象。

次要目的是锁定该范围的权限。在那里修复它们可能在那里修复它们,可能允许RW->RO转换。

在这些目的的基础上,您应该能够判断任何一个系统调用或任何madvise()…是否应该被允许。”

Wilcox最后得出的结论是,Xu需要更好地倾听那些试图帮助他的开发人员。

目前,很明显 mseal() 不会以其当前形式进入内核。这引出了一个问题,就是接下来应该做些什么。Röttger加入了讨论,指出纯 mimmutable() 解决方案并不满足Chrome开发人员想要看到的一切;他们有一些情况下希望阻止做取消映射的动作(unmapping),但仍然需要能够使用 mprotect() 更改内存保护。De Raadt描述了这种情况,称其为“部分密封”,这意味着受影响的内存实际上没有得到保护。

在保留这种功能的同时,将从 mseal() 中删除由 mseal() 提供的更复杂选项的一些后续提案将来可能会提出。但是,这个提案是否是 mimmutable() 或其变体的方式是否还有待观察。

可以指出,这里出了一些问题。许多人认为最初的提案只是实现了Chrome开发人员所说他们想要的东西,而没有深入研究真正的需求(对于Chrome和任何其他潜在用户公共的需求)是什么。Google拥有许多有经验的开发人员,他们可以在将其公开发布之前审查此提交,但似乎没有发生这种情况,导致相对经验不足的开发人员陷入了困境。对提案的反馈受到了抵制,而不是得到了认真的听取。这就导致一系列不让任何人满意的交互。

尽管如此,每个人都似乎认为这里是一个合理的使用场景。因此,问题的解决方法是找到正确的方式,希望现在更好地理解了该问题。如果下一次尝试看起来更像 mimmutable() ,并反映了已经给出的反馈,那么内核可能会获得这个密封功能以满足Chrome场景,并提供更广泛的用户空间强化。

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

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

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

format,png

代码下载地址: https://pan.quark.cn/s/8236006bf1f9 Word精灵插件:一款用于增强Microsoft Word功能的辅助软件,能够将多种复杂功能转化为插件形式,并在软件状态栏中进行展示,涵盖诸如批注管理、表格处理、内容替换、文档拆分、数学运算、字符提取、批量重命名等多项实用工具。在工作环境中应用该插件能够显著降低工作强度,提升操作效率。Word精灵插件兼容32位与64位的Microsoft Word版本,支持Word 2007、2010、2013以及Word 2016操作系统,但不适用于Word 2003版本。此外,该插件同样支持WPS办公软件。 功能概述: 1、表格自动调整宽度:自动优化文档内所有表格的显示宽度。 2、批量导出批注信息:将文档内所有批注集中导出到Excel工作簿中。 3、表格至Excel多表导出:在将表格导出到Excel时,每个Word表格将独立存放在一个工作表中,Word文档内的表格数量与Excel生成的工作表数量相等,并附有工作表目录。 4、表格至Excel单表导出:将文档内所有表格整合后导出到一个Excel工作表中,多个表格将按顺序排列于同一工作表内。 5、统一图片分辨率:对指定文件夹内的所有图片进行分辨率标准化处理。 6、图片批量缩放:依据设定比例对图片进行放大或缩小,支持按百分比调整。 7、图片批量插入:将图片批量插入到当前文档,可选择图片名称的展示形式,并设定图片的高度。 8、图片格式统一转换:将指定文件夹内的所有图片转换为相同的文件格式。 9、内容批量替换:对文档内容、页眉及页脚执行批量替换操作,例如将数字1替换为字母A,数字2替换为字母B,数字3替换为字母C等。 10、图片批量导出:将文档内所...
打开链接下载源码: https://pan.quark.cn/s/245ca7a27256 OmniGraffle是一款效能卓越的图形设计软件,在构建图表、流程图以及组织结构图等领域的应用尤为突出。该软件起源于Mac操作系统,并且兼容iOS平台,作为专业人士及业余爱好者进行图形设计时的首选工具之一。在OmniGraffle的功能模块中,“泳道图流程图”占据着核心地位,它主要用于勾勒业务流程图或系统流程图,其中各个分隔的泳道象征着不同的职能角色、部门划分或工作流程的各个阶段。泳道图(Lanes Diagram)作为流程图的一种特殊形式,通过将流程中的各个操作步骤分配到垂直或水平的“泳道”之中,能够明确地揭示出每个参与方或部门所承担的责任以及整个流程的走向。此类图形通常应用于业务流程管理(BPM)和系统分析领域,旨在帮助用户深入理解并优化复杂的业务流程。 在OmniGraffle中构建泳道图时,由于软件本身并未提供现成的泳道图模板,用户需要自行设计图形和布局以模拟出泳道的效果。然而,您提供的"06stencil泳道图流程图.graffle"文件很可能是一个预先构建好的模板,能够显著简化这一过程。该模板可能包含了预先设计好的泳道形态、箭头以及其他流程图组件,使用户能够直接在此基础上进行修改和增添个人的步骤,从而节省了大量的设计时间。 应用OmniGraffle的泳道图模板,你可以: 1. **导入模板**:首先需要启动OmniGraffle并将"06stencil泳道图流程图.graffle"文件添加到你的项目工作中。 2. **定制泳道**:依据实际需求调整泳道的数量和尺寸,使之契合你的业务流程。每个泳道对应一个角色或部门,确保它们的排列顺序和宽度能够精确地体现实际的工...
你有没有过这样的场景:手头一台 Mac 一台 Windows,想发一个几百 MB 的压缩包过去;或者给同事传个文件,结果他说"微信发不了大文件";又或者你想给服务器拷文件,发现 scp 又得记 IP 又得配密钥。有没有一个工具,**不装服务、不注册账号、不折腾内网穿透,一条命令就能安全地把文件从 A 送到 B**?答案是有的——它就是 **croc** | 传统传输的痛点 | croc 的做法 | | --- | --- | | 需要注册账号 / 上传到第三方服务器 | 无需注册,点对点传输 | | 内网没有公网 IP,NAT 后面传不出去 | 自带 NAT 穿透,失败自动走中继兜底 | | 担心文件被中转服务器看到 | 端到端加密,中继只看得到密文 | | 传大文件被限速、被压缩画质 | 直连传输,无第三方限速 | | 断了要重新传 | 支持断点续传 | | 只能传单个文件 | 多文件、整个文件夹一起传 | 官方文档里列了一串特性,翻译成人话就是:**任何两台电脑、跨平台、端到端加密、支持续传、不用服务器也不用端口映射、IPv6 优先、还能走 Tor 之类的代理**。 croc 的成功其实说明了一件事:**好工具不一定功能多,而是把一个高频痛点解决得足够干净**。 它没有花哨的界面,没有账号体系,没有"分享空间"的概念——就是一台电脑生成口令、另一台输入口令,文件在端到端加密的保护下安全抵达。恰恰是这种"少即是多",让它从众多文件传输工具里脱颖而出,拿到 4 万多 Star,还被各路教程反复提及。 如果你也有"两台电脑临时传文件"的刚需,不妨花两分钟装一个试试——大概率会像很多人一样,用完就把"微信传文件"这招给戒了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值