Linux 7.0 敲定 AppArmor 核心更新:全新权限标签与防伪装审计机制解析
Linux 7.0 版本的代码合并窗口收到了 AppArmor 安全模块的更新提交。AppArmor 维护者 John Johansen 向内核主线提交了针对 Linux 7.0 的拉取请求。
这次合并的代码此前已经在 linux-next 树和 Ubuntu 内核中完成了构建与回归测试,变动内容主要集中在代码清理和缺陷修复,并附带了三项功能特性的调整。
更新引入的一项重点特性是增加了对加载逐权限标签的支持。这项补丁由 John Johansen 在近一年前编写,直到现在才合入内核主线。
该机制用于处理元数据标签,能够结合上下文与调试信息来标注接受状态。它同时也支持规则污染和触发器操作。这些标签属于低频辅助数据,代码将其打包成了紧凑的格式。
这种结构能够让不同权限复用相同的字符串内容。虽然在读取时会增加一点基于索引的间接查找操作,但能够有效减少内核层面的内存占用。
标签本身只是普通的字符串,缺少上下文就无法发挥作用。它们主要在审计、调试和域控制相关的场景里起效。
由于邮件列表和目前的资讯里没有提供这项机制在实际高并发场景下的基准测试跑分,其实际性能开销变化情况存在不确定性,目前缺乏数据印证。
另一项功能改动是在用户命名空间审计模块里加入了执行路径记录。在旧版本内核中,审计相关的字段只能抓取并显示二进制可执行文件的名称。
这种做法存在一定缺陷,假如目标文件没有被放在系统环境变量指定的目录里,或者磁盘上有多个名字相同的文件,系统在发生安全拒绝事件时就很难追踪具体的触发源。
另外,应用程序可以在运行时篡改这个名称字段,直接把自己伪装成其他的进程名字。加入了独立的执行路径字段后,系统能够提供完整的文件物理路径,大幅提升了定位触发操作的二进制文件的可靠程度。
第三项新增特性主要面向开发环境,代码库里添加了特定的 kunit 配置文件,方便该安全模块后续开展更便捷的内核级单元测试。
本次拉取请求的大量代码变动其实属于代码清理。开发者剔除了缓冲区管理模块里不再被使用的每 CPU 临界区代码,并且给内存分配相关的函数加了溢出保护机制。
系统代码里很多老旧且被弃用的字符串处理函数也得到了清理,全面换成了更安全的内存拷贝和格式化函数。
缺陷修复部分处理了 unpack_tags 函数里的符号报错、非对齐数据表的兼容解析问题、Unix 套接字相关的空指针解引用漏洞等底层问题。
从代码整体的变动统计来看,这波更新涉及了 21 个文件,新增了 687 行代码,同时删除了 240 行旧代码。
AppArmor 安全模块背后主要的推手是 Canonical 公司。这次 Linux 7.0 的更新节点有着非常明确的系统发版意义,因为 Linux 7.0 是下一代长期支持版系统 Ubuntu 26.04 LTS 将要使用的底层内核。
提前把这批代码优化合并进内核主线,可以显著降低后续 Ubuntu 团队维护外挂补丁的技术工作量。
John Johansen 在提交代码的邮件里也提到,由于这次合并请求提交的时间节点偏晚,为了防止改动过多被拒,他其实还准备了一个纯修 Bug 的代码分支作为备用方案,不过最终包含新特性的完整版本顺利被主线接纳。
信息来源:
- • https://lore.kernel.org/lkml/53c39cf4-d9e4-4ccf-ae16-dc5b143c9681@canonical.com/
- • https://www.phoronix.com/news/Linux-7.0-AppArmor