深度拦截:Linux 内核引入 Firmware LSM 挂钩,eBPF 再下一城!

张开发
2026/4/18 19:06:39 15 分钟阅读

分享文章

深度拦截:Linux 内核引入 Firmware LSM 挂钩,eBPF 再下一城!
引言在现代高性能计算和云原生场景下用户空间与硬件设备的交互日益频繁。如何确保这些直接发送给固件Firmware的命令是安全的传统的 Linux 安全模型似乎遇到了瓶颈。近日内核社区提交了一项名为“Firmware LSM hook”的补丁集利用 eBPF 的灵活性为固件命令穿上了“防弹衣”。一、 溯源eBPF 的前世今生在深入补丁之前我们先聊聊 eBPF。起源BPF阶段1992 年BPFBerkeley Packet Filter诞生最初只用于高效的网络数据包过滤如经典的tcpdump 。进化eBPF阶段2014 年随着内核 3.15 版本的发布扩展型 BPFeBPF横空出世。它不再局限于网络而是演变成了一个通用的内核内执行引擎。安全守卫BPF LSM随后BPF LSM 允许开发者在不修改内核源码的情况下动态地编写安全策略挂载到内核的关键钩子上。二、 补丁集深度解析Firmware LSM Hook 是什么这次讨论的补丁集由 Chiara Meiohas 提出Leon Romanovsky 提交旨在引入一个新的BPF LSM 挂钩fw_validate_cmd专门用于验证用户空间触发的固件命令 。1. 工作原理该钩子的触发时机非常有讲究它运行在命令缓冲区Command Buffer构建完成之后但在正式提交给硬件固件之前。2. 关键参数fw_validate_cmd提供了一套丰富的元数据方便 BPF 程序进行精准判断in/in_len固件命令的输入缓冲区及其长度 。dev关联的设备指针 。class_id区分命令来源如FW_CMD_CLASS_UVERBS对应 RDMAFW_CMD_CLASS_FWCTL对应通用固件控制接口 。id类别特定的设备标识符 。三、 痛点直击为什么要引入它既然已有file_ioctl等成熟的 LSM 挂钩为何还要多此一举传统挂钩的“信息差”在 RDMA 或fwctl子系统中用户空间的属性往往是在驱动程序深处通过copy_from_user()复制的 。此时通用的file_ioctl根本无法知晓具体的固件命令内容自然无法做策略决定 。邮箱格式的“百家饭”不同厂商、甚至同一厂商不同版本的固件其“邮箱Mailbox”命令格式都各不相同 。要求 Linux 内核写死一套通用的 C 语言验证逻辑是不现实的。BPF 的天然适配性由于格式多变BPF 这种“按需编写、即插即用”的特性成了最佳选择允许安全管理员根据特定设备手册编写精细的过滤规则 。四、 社区“神仙打架”其他开发者的关注点正如所有重磅补丁一样该系列也引发了维护者们的热烈讨论架构之争 (Paul Moore - LSM 维护者) Paul 提出了严格的架构要求如果这只是一个纯 BPF 挂钩就不应该使用LSM_HOOK()宏也不该放在bpf_lsm.c中 。他强调除非它能成为一个通用的 LSM 接口否则应当作为独立的 BPF 钩子存在 。安全性逻辑的质疑 Paul 进一步质疑如果固件命令是“不透明”的即安全模块看不懂命令在干什么那如何制定有意义的安全策略仅仅拦截是不够的还需要能定义可理解的操作 。多协议类比 (Jason Gunthorpe) Jason 将固件命令比作网络协议。他认为这就像是内核中的“深度包检测DPI”。固件命令就像 IP 报文我们需要的是一套分类和标记逻辑类似于 iptables 的 secmark至于报文内部长什么样那是厂商程序和 BPF 逻辑的事 。多 LSM 并行原则 (Casey Schaufler) Casey 提醒大家任何新设计的 LSM 接口都必须考虑兼容性确保 SELinux、AppArmor 和 BPF LSM 能和谐共存 。结语Firmware LSM hook 的出现标志着 Linux 安全边界正在从系统调用层进一步下沉到硬件交互层。虽然社区在实现细节是作为纯 BPF 钩子还是通用 LSM上仍有分歧但“让固件命令不再裸奔”的目标已达成共识。

更多文章