2026-06-07 内核社区日报

今天的内存修改在多个层面推进:arm64 修复了 ptep_try_set() 缺失的 PTE complete 屏障,直接影响 bpf arena 的锁竞争路径;iommufd 要求 writable MAP_FILE 映射必须有写访问权限,堵上一个潜在的权限提升通道;DAMON 删除了久拖未决的冗余锁;SLAB_NO_MERGE 终于得到了正式文档。文件系统方面 fanotify 迎来新的 pidfd 限制解除版,网络子系统则有一批实时性相关补丁(802.1Qat、OA TC6)继续成熟。

🧠 重点 · 内存

1. arm64:ptep_try_set() 补全 __set_pte_complete() 修复缺失屏障导致缺页问题

发生了什么:
ptep_try_set() 使用 try_cmpxchg() 安装新条目,但与 __set_pte() 不同,它从未调用 __set_pte_complete()。在 arm64 上,安装有效内核 PTE 后需要屏障,以便后续访问能观察到新条目。缺少这些屏障时,访问可能因观察不到新安装的页面而触发缺页。补丁在成功 cmpxchg 后调用 __set_pte_complete(),与 __set_pte() 保持一致。

为什么重要:
此修复确保了 arm64 上 lockless empty-slot 安装路径中 PTE 存储的可见性,避免因屏障缺失导致的意外缺页,使该机制在 arm64 上正确工作。

来源

2. iommufd:可写 MAP_FILE 映射的权限检查讨论

发生了什么:
Yiming Qian 在补丁中为 IOMMU_IOAS_MAP_FILE 的可写映射(IOMMU_IOAS_MAP_WRITEABLE)添加了权限检查,包括检查 file->f_mode & FMODE_WRITE 并调用 mapping_map_writable()。Jason 回复认为这是一个合法问题,所有使用 memfd_pin_folios() 的用户都可能存在类似 bug,并建议为该功能设计配套 API(start/pin/destroy)来管理此类映射,而非开放编码。
来源

为什么重要:
该讨论指出 IOMMU_IOAS_MAP_FILE 的可写映射可能绕过文件写入权限检查,而引入配套 API 有助于为 iommufd 建立更严格的权限模型,防止未授权写入。

3. DAMON/vaddr:删除冗余的 mmap_read_lock()

发生了什么:
damon_va_three_regions() 在调用 __damon_va_three_regions() 之前获取了 mmap_read_lock(),但后者已经使用 VMA iterator 在 rcu_read_lock() 下遍历 VMA,不再需要 mmap lock。补丁直接删除了外层的 mmap_read_lock() 和对应的解锁。

为什么重要:
这是一个纯粹的去重优化。DAMON 对每个 target 地址空间都会调用此函数,减少一次锁获取/释放操作,虽然单次开销很小,但在大量 target 或高频采样时可以累积效果。

来源

4. Docs/mm:正式文档化 SLAB_NO_MERGE 隔离机制

发生了什么:
补丁在 slab.rst 中添加了关于 SLAB_NO_MERGE 的文档,解释何时及如何使用该标志来保护安全关键的 slab cache 免受 cross-cache 堆利用。文档覆盖了使用时机、验证合并状态、内存与性能权衡,以及与其他缓解措施(如 CONFIG_RANDOM_KMALLOC_CACHESSLAB_TYPESAFE_BY_RCUslab_nomerge 启动参数)的关系。

为什么重要:
正式文档为开发者提供了选择使用 SLAB_NO_MERGE 的明确指引,说明了其在安全隔离中的应用场景和权衡。
来源

5. KHO 系列:补丁拆分文件是否必要的讨论

发生了什么:
Pasha Tatashin 的 RFC v1 系列尝试将 KHO 的 vmalloc 和 radix tree 拆分为独立文件。Reviewer Mike Rapoport 认为该拆分是不必要的变动,建议尽量减少此类碎片化以利于 git blame 和 backport。作者 Tatashin 则辩护拆分的必要性,理由包括 KHO 尚年轻、此时模块化更易维护、未来添加更多子系统时重构难度会更高等。

为什么重要:
该讨论直接涉及 KHO 代码结构的发展方向:是保持现有单文件紧凑布局,还是趁早期拆分清晰模块。两种路线将影响后续所有 KHO 子系统的组织方式与维护成本。双方未达成一致,需后续版本进一步收敛。

来源

🔧 其它子系统

文件系统

  • fanotify 报告线程级 pidfd 及已回收任务 pidfd(v5)FAN_REPORT_PIDFD 原本只能创建 leader 的 pidfd,该系列补丁允许 FAN_REPORT_TID 报告 event-generating 线程的 pidfd;同时通过向 pidfs 注册 event pid 并移除 pid_has_task() 检查,允许用户获得已回收任务的 pidfd。 来源
  • isofs: 限制 Rock Ridge 符号链接组件长度不超出 SL 记录剩余字节get_symlink_chunk() 和 SL 处理循环未验证组件长度(slp->len + 2)不超出 SL 记录剩余字节(slen),导致越界读取。v2 补丁添加了长度校验,逾界时返回 NULL 或跳出循环。 来源
  • ntfs: 完成索引根属性验证(v5):该系列补丁完成对 $INDEX_ROOT 属性的全面验证,包括拒绝非 resident 记录、增长/收缩时更新 index.allocated_size、以及 allocated_size 与 resident 值的交叉检查。 来源

网络

  • geneve GRO:基于 socket 配置的 completion hint 限制geneve_gro_complete() 直接调用 geneve_opt_gro_hint_off() 解析 hint 选项,即使 socket 未启用 gro_hint 也扩充 completion 偏移量。攻击者可构造携带合法 hint 的包,使 completion 回调访问超出 GRO 接收验证范围的数据。补丁改用 geneve_sk_gro_hint_off(),仅在启用 hint 的 socket 上处理 hint。来源
  • psample:清零 PSAMPLE_ATTR_DATA 的 netlink 填充字节psample_sample_packet()skb_put() 预留 nla_total_size(data_len) 空间,但只写入 NLA_HDRLEN + data_len 字节;当 data_len 不是 4 的倍数时,尾部对齐填充字节保留未初始化的 slab 内容,可能泄露内核堆内存。补丁在拷贝后使用 memset() 清零填充字节。来源
  • vlan:阻止跨命名空间 promisc/allmulti 传播vlan_dev_change_rx_flags()vlan_dev_set_rx_mode() 在 VLAN 设备移至其他网络命名空间后,仍会向其原命名空间的真实设备传播 IFF_PROMISC/IFF_ALLMULTI 及地址同步,破环命名空间隔离。补丁添加 net_eq(dev_net(vlan_dev), dev_net(real_dev)) 检查,若不在同一命名空间则直接返回。来源
  • mvpp2 XDP RX 缓冲区处理修复(v5):系列包含 4 个补丁:在硬件包头偏移处同步 RX 数据;将 XDP 帧大小限制为 RX 缓冲区实际大小;在 XDP 或 skb 使用前重新填充 RX 缓冲区(避免 BM 池深度降低);在 XDP_PASS 时从 XDP 调整后的数据构建 skb。已在 mvpp2 硬件上通过 tools/testing/selftests/drivers/net/xdp.py 测试。来源

eBPF

  • PTR_TO_FLOW_KEYS 常量偏移越界修复:verifier 未正确遍历 PTR_TO_FLOW_KEYS 的常量偏移,允许程序读取 flow_keys 之外的内存。已合入 bpf-next。 来源
  • 拒绝 sleepable BPF_LSM_CGROUP 程序加载:LSM cgroup 上下文中 sleepable 程序未经支持,直接加载会导致未定义行为。补丁在 bpf_lsm_cgroup attach 点拒绝 FLAG_SLEEPABLE 标志,已合入。 来源
  • bpf_task_from_vpid() 空指针修复(v3):当 pid 命名空间中无对应 task 时,bpf_task_from_vpid() 返回 NULL,但未检查即解引用。加入空指针检查。 来源
  • 动态内层 array 查找可空性保持(v2)ARRAY_OF_MAPS 中 flag BPF_F_INNER_MAP 允许替换内层 map,但 verifier 在查找后未将结果标记为 nullable。后续 dereference 无 NULL 检查时可能 OOB。补丁添加了正确的 nullable 推理。 来源

👀 值得追的讨论 / Patch

  • exec: spawn templates 系列:Gabriel Krisman Bertazi 的 RFC 允许在 io_uring 上下文中预缓存可执行文件状态,加速重复启动。有内核对 io_uring 与 exec 交互安全性的担忧。 来源
  • liveupdate: guest_memfd 保持(RFC v1):Ackerley Tng 提议在 live update 中保存和恢复 guest_memfd。这是 KVM 端使用 liveupdate 的关键组件,目前处于早期讨论阶段。 来源
  • 802.1Qat 流预留准入控制(bridge):网络补丁系列在 bridge MDB 中添加动态预留条目,用于时间敏感网络(TSN)。reviewer 建议将预留表放在更合适的位置而非改造 MDB。 来源

⚡ 一句话速览

  • Btrfs 修复:修复了 __btrfs_free_extent 中当 extent 引用计数零时可能发生的 UAF。 来源
  • erofs 修复:修复了 erofs_fill_super 中当设备不满足 blksz 对齐时的空指针解引用。 来源
  • Loop修复lo_rw_aio() 中由时序竞争导致的 NULL 指针解引用修复(v4)。补丁通过引入 I/O 请求刷新宽限期(grace period)来防止崩溃,并在 CONFIG_KCOV 下打印 BUG 信息以帮助开发者定位未等待 I/O 完成的调用者。 来源
  • TLS sk_msg sg.copy 修复:tls_split_open_record 在分裂记录时未将原 sk_msgsg.copy 位图状态复制到新 sk_msg,本补丁引入 sk_msg_sg_copy_one 辅助函数修复该问题。另外,作者指出 sk_msg_shift_left/right 未同步 sg.copy 是独立预存问题,可能导致 BPF 程序获得错误读写权限(如写入外部页缓存),但该补丁不涉及。来源
  • bpf verifier BTF 校验btf_repeat_fields() 在计算展开字段数时使用 u32 乘法(field_cnt * (repeat_cnt + 1)),恶意 BTF 可让该计算回绕,使剩余容量检查误判通过,进而导致 memcpy 越界写。补丁改用 check_add_overflowcheck_mul_overflow 拒绝非法计数,防止内核崩溃(KASAN 已报 vmalloc-out-of-bounds)。 来源
  • hfs BUG() 替换hfs_write_inode() 中遇到损坏的 HFS 文件系统元数据时不再调用 BUG(),改为返回 -EFSCORRUPTED,避免内核崩溃并与其他主要文件系统保持一致。 来源
  • Cramfs XIP 边界检查:直接映射读取路径未校验 offset 是否超出 image 大小,补丁添加了安全阀。 来源
  • FDDI 最小长度检查fddi_type_trans() 在读取头部前未验证 skb 长度,可能导致 OOB read。 来源
  • NFC NCI 参数提取边界检查nci_extract_activation_params_iso_dep() 等函数未验证 data_len 是否足以包含内层长度,添加了校验。 来源
  • MLX5 LAG 重构:为 SD LAG(无硬件 LAG 支持的虚拟 LAG)实现基于软件的 vport LAG,通过 egress ACL 反弹规则在从属节点上创建流量反弹规则,并在 shared_fdb 中调整 lag_demux 检查以支持 SD LAG 模式。 来源
  • Realtek Otto MDIO:RTL931x(Mango 系列)MDIO 支持,高端口数模式寄存器。 来源
  • SUNRPC 空指针检查rpc_sockaddr2uaddr() 返回 NULL 时,rpcb_register_inet4/6 未检查直接解引用。 来源
  • IPv4 devconf sysctl 集中化:将分散的 sysctl 处理逻辑统一到中央路径,并处理 netlink 更新时缺失的 post-set 动作。 来源
  • IPv4 devconf 参数一次设置多个: ip link set dev enp8s0 inet forwarding on proxy_arp off 现在可以一次设置多个 IPv4 devconf 参数,需要 NLA_F_NESTED 标志。 来源
  • seg6 End.M.GTP6.D.Di 行为:Andrea Mayer 评审该补丁,指出其与 patch 4 大量代码重复(SRH 检查、GTP-U 分发、外层剥离等),且 teidqfi 变量属死代码,建议通过共享辅助函数减少重复,并允许 seg6_mobile_parse_gtpu 接受 NULL 以消除未使用的变量。来源
  • Pahole DW_TAG_GNU_annotation 支持:Vineet Gupta 为 pahole 添加 DW_TAG_GNU_annotation 支持,gcc 16 首发此 tag。 来源