LWN:OpenBSD中的mimmutable()!

200_matlab处理NCEP数据并画全球彩色的风场图 200_matlab处理NCEP数据并画全球彩色的风场图。 阅读详情

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

mimmutable() for OpenBSD

By Jonathan Corbet
December 9, 2022
DeepL assisted translation
https://lwn.net/Articles/915640/

虚拟内存(virtual-memory)系统在映射和保护内存方面提供了很多灵活性。不幸的是,内存管理越灵活,那些一心想破坏系统的攻击者来说也就越高兴。在 OpenBSD 的世界里正在添加一个新的系统调用,希望能减少这种灵活性;不过这是一个几乎没有代码会使用的系统调用。

OpenBSD 创始人 Theo de Raadt 在 9 月初首次提出了一个新的系统调用,叫做 mimmutable()。经过多次修改之后,该系统调用看起来准备用下面的形式来完成合入:

int mimmutable(void *addr, size_t len);

调用 mimmutable() 会使得从 addr 开始的 len 字节长的内存映射变得不可再被改动,这意味着内核将不允许对该范围内的内存保护或映射做出任何改动。因此,像 mmap()或 mprotect()这样的系统调用如果牵涉到这个范围的话,就会失败。

乍一看,mimmutable()与 OpenBSD 的 pledge() 本质上很类似,后者是限制了调用进程中可以使用的系统调用。但是,虽然 pledge() 调用已经在 OpenBSD 仓库中的许多程序中使用起来了,但是使用 mimmutable() 的地方确实很少。大多数开发者对他们的程序的内存布局缺乏详细的了解,因此不能很好地把自己地址空间的一部分配置成不可改变的,但内核和链接器(linker)是有相关信息的。

关于如何使用 mimmutable()的细节,在 De Raadt 的一封邮件中做了详细描述。简而言之,当内核加载一个新的可执行映像文件时,它就开始生效了;只要有 text、stack 和 data section 被映射,在程序开始运行之前,它们就会变成不可更改状态。对于静态二进制文件,C runtime 会做一些 fixup 工作,然后使用 mimmutable() 让映射好的地址空间的其余部分中大部分也变成不可更改的。对于动态链接的二进制文件,共享库链接器(ld.so,shared-library linker)会做一系列类似的动作,将每个库都映射到地址空间中,然后让这些映射的大部分内容变得不可更改。

所有这些都将自动发生,而不需要被加载的程序意识到这些。最终的结果将是这个进程几乎无法对其映射的地址空间进行修改(尽管它总是可以利用尚未映射的地址空间区域来创建新的映射)。这里有一个小小的例外:

所以这个 static executable 是完全不可改变的,除了 OPENBSD_MUTABLE 区域之外。这个标注现在只用在一个地方,就是在 libc 的 malloc(3)代码之内,其中有一段代码会将一个数据结构在 readonly 和 read-write 之间切换,这是一种安全措施。这部分区域就没有被设置为不可变的。

要使整个计划能顺利进行的话,不仅仅需要改变 OpenBSD kernel;尤其是还需要修改编译器工具链(compiler toolchain),需要加强对程序加载时必须保持 mutable(可以修改)的部分的标记。显然会有一些程序需要特殊调整才能在这种环境下正常地工作起来;由于 OpenBSD 同时管控着 kernel 和用户空间的程序,它能够做出 Linux 所不能做出的一些改动,不用担心会造成用户空间的 regression 问题。

即便如此,实现 mimmutable() 也涉及到相当多的很繁琐的工作;我们可以理解,OpenBSD 的开发者希望看到这么做能带来的好处。一个明显的好处就是在可执行内存方面。OpenBSD 一直在努力防止内存既是可写的,同时又是可执行的,但如果攻击者能够将恶意代码加载到可写区域,然后改变权限,那么这种限制所带来的保护就会失效。对进程的数据区域进行严格的保护会使得这种攻击变得不再可行。

除此之外,OpenBSD 还使用了一些 Linux 中没有的内存保护措施。其中之一是对那些可以支持调用到 kernel 的可执行内存进行标记;在 OpenBSD 系统中,只有 C 库才有这种能力。这可以防止从其他地方加载的恶意代码直接进行系统调用;用 mimmutable() 来保护进程的其他部分,就可以避免这个保护措施被修改成允许从其他地方进行系统调用(在 OpenBSD 上,可以通过 msyscall()来进行这种改动)。

OpenBSD 也会对用于存放 stack 的内存区域进行标记。每当一个进程进入内核态时,它的 stack 指针就会被检查,看它是否真的指向了一个 stack 区域;如果不是的话,会把这个进程直接 kill。这种检查可以阻止 "stack pivot" 攻击,即攻击者将堆栈指针重定向到一个更有利于执行攻击的内存区域中。同样,mimmutable() 可以阻止攻击者将普通的数据区域变成支持防治 stack 的区域。

类似 mimmutable()这样的系统调用有可能被用来提高 Linux 系统的安全性,但这将会是一个更难的任务。Linux 内核开发者无法同步修改用户空间程序,所以在希望不破坏用户空间的代码的情况下做出这种改动是很困难的。例如,增加一个 "允许直接系统调用" 的保护性 bit 会很容易就导致 Linux 下的许多程序无法使用,这些程序出于各种原因没有使用 C-library wrapper,而是直接使用系统调用进入内核。

还有一些类似的障碍也同样适用于对 stack 指针的限制措施。内核确实有一个 "grows down" bit,可以用来识别 stack 区域,但是只适用于那些可以增长的 stack。多线程程序经常会创建具有固定长度的 stack 的线程,这些线程都没有设置这个 bit。因此,任何为线程创建 stack 的用户空间程序都需要修改,从而明确设置这个 bit,而内核开发者不能进行这样的修改。因此,stack 指针的检查功能就不可能很容易地加到 Linux 中来。

不过,让内存映射变得不可改变的这个系统调用可能是有价值的。要让这样的东西进入 Linux,需要一个有兴趣实现此功能的开发者,需要证明用户空间的代码会使用它,还需要有某种令人信服的场景来描述会被它所阻挡的攻击。可能还需要对 toolchain 进行修改以支持这一功能。这是一个很高的标准,就跟通常添加新的系统调用差不多。但也许有人最终会受到启发,尝试开发一个 patch 来支持这个功能的。

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

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

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

format,png

嵌入式通信协议框架的四层架构设计与实现 本文详细介绍一种模块化的嵌入式通信协议框架设计,采用四层架构:硬件抽象层统一管理数据收发与缓冲,隔离硬件差异;协议管理层通过特征识别自动路由多协议数据,支持动态扩展;协议处理层独立实现各协议解析/构建,确保校验安全与零拷贝效率;应用层采用表驱动模式处理业务逻辑,与协议细节解耦。 该架构已应用于工业控制等领域,具备强类型安全、高扩展性和平台无关性特点,显著提升复通信场景下的开发效率与系统可靠性。提供完整代码实现与设计要点分析,助力开发者构建高效通信栈。 阅读详情

相关推荐

rv1106 模型部署

ONNX(Open Neural Network Exchange),开放神经网络交换,是一种模型IR,用于在各种深度学习训练和推理框架转换的一个中间表示格式,支持多种深度学习框架,包括 TensorFlow、PyTorch、Caffe 等。将模型转换为 ONNX 格式后,可以更容易地在不同的深度学习框架中进行部署和推理,而无需重新训练模型。

weixin_50993868的博客 1285

LWN:mseal() 即将确定!

关注了就能看到更多这么棒的文章哦~mseal() gets closerBy Jonathan CorbetJanuary 19, 2024Gemini translationhttps://lwn.net/Articles/958438/2023 年 10 月首次提出的 mseal() 系统调用引发了一些争议。自那以后,它一直静悄悄地开发演进,并且似乎已经达到了相关评论者愿意接受的程度。预计会在...

Linux News搬运工 517

因果推断(二):因果推断涉及的ITE、ATE、CATE等效应

因果效应也称为**处理效应(Treatment effect)**是用于评判干预与否的结果差异的指标(处理变量对结果变量的影响)。比如在接受治疗组中,如果这些人不接受治疗,这组人接受治疗和不接受治疗的效应差异是多少。定义为实验组中每个个体的处理效应差异,比如一个个体在接收治疗和不接受治疗的两个处理方式的健康程度得分的差。但是一个人因为不可能。比如我们想探究接受治疗的男性用户和不接受治疗的男性用户的平均效果差异就是CATE。前面说ITE是无法观测的,是因为一个人不能同时接受治疗又不接受治疗,这里关键的就是。

Y1n的博客 3712

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

关注了就能看到更多这么棒的文章哦~mseal() and what comes afterBy Jonathan CorbetOctober 20, 2023ChatGPT translationhttps://lwn.net/Articles/948129/Jeff Xu提出了新增一个名为mseal()的系统调用的提案,该系统调用将允许应用程序阻止对选定内存映射(memory mapping...

Linux News搬运工 987

2026软件测试面试题全解析:从用例设计到接口自动化与性能实战

在软件测试岗位的招聘考察中,面试官越来越看重候选人解决实际问题的工程能力,而不仅仅是背诵概念。从最基础的测试用例设计出发,覆盖功能测试、接口测试、自动化测试、性能测试、数据库与Redis一致性等核心知识体系,是应对中高级岗位面试的关键路径。理解Postman抓包、Python脚本、Pytest框架、JMeter压测指标背后的原理,能帮助测试人员构建完整的质量保障思维。当AI辅助测试成为行业新趋势时,掌握数据校验链路与风险识别意识,更能体现资深测试工程师的竞争力。本文围绕2026年高频软件测试面试题,梳理了从

weixin_28676289的博客 244

物理与工程中的‘黑话’:Kronecker delta和Levi-Civita符号到底简化了什么?

本文深入解析了物理与工程中常用的Kronecker delta和Levi-Civita符号的简化作用。通过对比传统表示与张量表示,展示了这些符号在向量运算、矩阵迹计算及流体力学模拟中的高效应用,显著提升计算效率和代码可读性。特别适合理论物理和工程数学领域的学习者与从业者。

weixin_27215403的博客 397

LWN:在GNU C库实现内存封印!

关注了就能看到更多这么棒的文章哦~Memory sealing for the GNU C LibraryBy Jonathan CorbetJune 12, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/978010/mseal()系统调用允许进程阻止其地址空间未来进行任何更改(因此被称为“密封 sealing”);它借鉴了...

Linux News搬运工 1736

Nuvoton OpenTitan开源安全芯片技术解析与应用

硬件安全模块(HSM)作为可信计算基的核心组件,其设计透明度和可验证性正成为行业焦点。RISC-V架构凭借开源特性,为构建可审计的安全芯片提供了新范式。OpenTitan项目通过开放Verilog源码和形式化证明,实现了从物理不可克隆函数(PUF)到分层安全启动的全栈透明。该方案在lowRISC Voyager开发板上实测显示,安全启动时间小于200ms,性能损耗仅7%,显著优于传统黑盒方案。目前该技术已应用于Chromebook和数据中心,其40nm工艺版本更将功耗降至5μA待机水平,为物联网和边缘计算提

weixin_36303807的博客 397

【数据结构】基于比较的排序算法 - 交换排序

本文介绍交换排序中的冒泡排序与快速排序。冒泡排序通过相邻元素比较交换,实现升序,时间复杂度最坏为O(N²),空间复杂度O(1),稳定且适合小规模有序数据。快速排序采用分治思想,以基准值划分区间,平均时间复杂度O(N log N),空间复杂度O(log N),但不稳定,实际应用中性能优异,可通过随机基准、小区间优化等提升效率。

careathers的博客 329

DA14531之如何Debug(在线调试、Jlink仿真、串口打印)

在线调试和串口打印调试。在线调试是Keil软件配合Jlink编译、烧录、仿真为一体的,其操作包括:运行、停止、打断点,单步运行等。而串口打印调试,只需打开相关配置,让arch_printf()函数正常输出串口数据。若想在初始化完成后打印arch_printf(“goto Loop\r\n”);波特率为115200,接收到串口消息goto Loop。连好线后,点击仿真按钮,在线Jlink调试。

hejinwu1314的博客 1792

stop pin/ignore pin/exclude pin/float pin

stop pin、ignore pin、exclude pin、float pin的区别

m0_61544122的博客 7288

pandas 深度入门:从数据结构到一份真实销售报表

本文系统讲解Pandas核心应用,从三分钟安装到完整月度报表生成,涵盖数据读取、清洗、筛选、分组聚合、表连接、透视表与时间序列等13个关键环节。强调“先看数据再动手”,掌握Series/DataFrame/Index结构本质,熟练运用loc/iloc、merge校验、agg/transform区别,通过真实案例实现高效报表自动化,告别手动Excel操作。最后提供性能优化与高频报错解决方案,助力读者快速上手,真正实现“写二十行代码,跑三秒出结果”。

信息安全领域优质创作者|操作系统领域专家 265

SAP Gateway 中事务码 /IWFND/MAINT_SERVICE 的用法介绍

本文系统梳理了SAP Gateway中/IWFND/MAINT_SERVICE事务码的核心功能与运维实践。作为OData服务管理中樞,它支持服务注册激活、ICF节点配置、系统别名绑定、批量处理等关键操作。文章详解了服务目录、ICF节点、系统别名的配置要点,提供了批量激活、缓存清理、性能监控等实用技巧,并针对常见陷阱(如传输配置、删除残留)给出解决方案。通过制造业批量激活、零售业OAuth集成等案例,展示了事务码在企业级应用中的实际价值,为SAP Gateway运维提供了一套完整的治理清单。

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

工单系统的数据结构化:故障分类体系设计与报表可用性

很多团队上完工单系统半年,会发现一个尴尬的事实:单子照常在走,报表却始终出不来。导出的 Excel 几千行,看不出趋势、算不出口径、答不了"哪类故障占大头"。问题几乎都不在系统,而在数据模型的第一层——。这篇文章把这件事拆开讲:自由文本为什么会失效、分类体系怎么分层、表怎么建、老数据怎么迁、上线前怎么验收。

ITyunwei0987的博客 278

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[C++高阶数据结构·图论下] 最短路径:为什么“挑最小的”一定正确?

本文系统对比最小生成树与最短路径的核心差异,聚焦三类最短路算法:Dijkstra(非负权、贪心确认)、Bellman-Ford(可负权、反复松弛)、Floyd(全源、分层中转)。核心区别在于:MST 关注“连通所有点”的最小代价(边数固定),而最短路关注“两点间路径最短”(边数可变)。关键反直觉点是:负权对 MST 无害,却使 Dijkstra 失效——因“绕远更近”破坏贪心前提。算法本质反映三种处理不确定性的策略:确认式(Dijkstra)、迭代修正(Bellman-Ford)、分层逼近(Floyd)。强

Tairitsu_青云 510

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构:9.Map和Set

有的讲解会说这里key是标识作用,这种说法其实没有太大意义,就算知道了他是标识value的作用又如何,在实际的使用过程中,我们只会根据具体的效果选择使用的方法等,不会执着于“标识”这种说法。2.由于哈希函数的设计原则太过理论,它仅仅是在认为:这些通过关键码算出来的index不同 的情况下设计的,然而这种理论化的设计原则在遇到冲突时,恰恰就出现了问题,而我们能做的,就是降低冲突率。虽然哈希表的使用过程中存在冲突,但是在实际的使用过程中,哈希表的冲突率是不高的,冲突的个数是可控的。

2602_95646088的博客 192

[C++高阶数据结构·图论上] 最小生成树:为什么“选边”和“选点”是两条路?

本文系统讲解最小生成树(MST)的核心思想与两大算法:Kruskal与Prim。强调MST目标是用最小权值总和连接所有顶点形成一棵树,而非单边最小。通过三条构造准则(用图中边、恰n-1条边、无环)统一框架。Kruskal按边贪心,依赖并查集判环,适合稀疏图;Prim按点扩张,利用割集特性天然避免成环,需起点,适合稠密图。两算法本质差异在于“判环”机制与数据结构选择,且与最短路径问题在连通性、负权处理上截然相反,需分篇厘清。

Tairitsu_青云 221

Vue3 低代码移动表单设计器实战(二):缩放画布下的拖拽系统与树状级联数据结构

本文深入剖析Vue3低代码表单设计器在缩放画布下的拖拽失效问题,揭示SortableJS在CSS Transform下坐标崩溃的数学根源。通过自研独立视觉克隆壳层与逆向几何补偿算法,实现精准拖拽;采用扁平数据存储+运行时树状计算结构,解决级联依赖与深克隆难题,确保逻辑一致性与性能优化,为复杂低代码系统提供可复用的工程范式。

NanChen的博客 337

排序算法深度笔记(上):比较类排序的思想演进与代码实现

与。本文聚焦前者 —— 也就是通过元素间两两比较来确定相对顺序的排序算法,从最朴素的 O (n²) 基础排序,到工业级主流的 O (nlogn) 进阶排序,逐层拆解设计思想、带注释的代码实现与边界细节。当我们理解了比较排序的性能边界,也就自然引出了非比较排序的存在意义。所有代码均遵循统一的实现规范:入口函数前置空数组与单元素边界校验,基于数组原地修改,主函数附带可直接运行的测试用例,与练习代码风格完全对齐。

2401_87069538的博客 607

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 81

【数据结构】树和二叉树(下):讲透四种遍历、递归返回值与经典题

🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。

星光编译者的技术博客,专注 C/C++、Linux、数据结构与算法。 394

数据结构:双向链表实现,链表与顺序表的对比

本节讲解数据结构双向链表,链表和顺序表的特点对比,顺便解释了一下什么是CPU缓存和内存碎片

lei_jiale的博客 369

【数据结构-2】顺序表的实现

线性表是一种数据结构,它分为逻辑结构和物理结构,在逻辑结构上线性表是呈线性的,数据是是连续存储的;在物理结构(物理空间)上,线性表不一定是连续存储的。线性表的实现,主要分为数组和链式结构。顺序表是线性表的一种实现方式,顺序表在逻辑结构和物理结构上都是连续的。顺序表的底层实现是数组。

weixin_44218929的博客 207

数据结构(2)

不同点顺序表链表(单链表)存储空间上物理上一定连续逻辑上连续,但物理上不一定连续随机访问支持:O(1)不支持:O(N)任意位置插入或删除元素可能需要搬移元素,效率低 O(N)只需修改指针指向插入动态顺序表,空间不够时需要扩容和空间浪费没有容量的概念,按需申请释放,不存在空间浪费应用场景元素高效存储 + 频繁访问任意位置高效插入和删除。

likexuec的博客 150

数据结构—B树

一棵m(m>2)阶的B树,是一棵平衡的M路平衡树,可以说空树或满足以下6点。1.根节点至少有两个孩子2.每个分支节点都包含k-1个关键字和k个孩子,ceil(m/2)<=k<=m;孩子比关键字多一个ceil向上取整3.每个叶子节点都包含k-1个关键字,ceil(m/2)<=k<=m;4.所有的叶子节点在同一层。5.每个节点中的关键字从小到大排列,节点当中k-1个元素正好是k个孩子包含元素的值域划分。6.节点的结构是{n,A0,K1,A1,K2,........Kn,An};

fish_xk的博客 131

数据结构:顺序表

顺序表是用一段地址连续的存储单元依次存储线性表的数据元素的线性结构。它是线性表的顺序存储实现,在C语言中通常用数组来实现。

2502_92937908的博客 340

数据结构:单链表

单链表是一种链式存储的线性表。它由一系列节点数据域:存放数据元素指针域:存放指向下一个节点的指针内存不连续,节点分散存储插入删除效率高(O(1),前提是已定位到位置)查找效率低(O(n)),不支持随机访问相比数组,多消耗指针域空间// 定义节点结构体int data;// 数据域// 指针域,指向下一个节点} Node;// 或者使用 typedef 简化int data;// LinkList 是指向 Node 的指针类型中必须写,因为此时 typedef 尚未生效,不能写Node。

2502_92937908的博客 475
上一篇: LWN:6.1内核开发数据(以及更多)!
下一篇: LWN:2022年底总结!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值