研究人员在Linux内核中发现了一个存在多年的严重漏洞,该漏洞位于系统最敏感的核心架构环节——x86页错误处理机制中。当处理器检测到未经授权的内存访问尝试时,这一关键机制需要内核以绝对精确的方式进行干预。自2020年以来,该逻辑一直存在一个微妙但根本性的缺陷:硬件中断未能按照系统预期保持禁用状态。
漏洞发现与修复方案
该修复补丁已被纳入Linux 6.19分支,并计划向后移植到旧版稳定版本中。漏洞由英特尔工程师Cedric Xing发现,他在审查异常处理代码时提出了更健壮的解决方案。
问题的核心在于x86架构do_page_fault()函数中一个过时的注释。多年来,文档暗示在处理内存访问错误(特别是涉及用户空间地址的错误)时可能会重新启用中断。文档承认,验证所有可能的退出路径以确保正确的中断状态几乎是一项不可能完成的任务,开发者不得不在"组合补丁噩梦"与彻底逻辑重构之间做出选择。
漏洞本质与风险场景
实际情况证明,注释内容和相关逻辑都存在谬误。该漏洞不仅限于用户地址错误,处理程序混淆了两个不同概念:地址范围(内核与用户)和执行上下文。虽然二者在直觉上相关,但功能上并不等同。在某些场景下,内核地址可能在用户上下文中被访问,导致某些执行分支启用了本应在返回低级异常处理程序前保持禁用的中断。
典型示例出现在__bad_area_nosemaphore()分支中,该分支试图通过切换中断来恢复"正确"状态,但操作并不一致。这造成了危险的不对称性:根据具体执行路径,内核预期应禁用中断的地方可能仍保持激活状态。
最终解决方案
工程师最终得出结论,对各分支进行增量"修补"是徒劳的。他们实施了最稳健的防护措施:在返回到低级页错误处理程序前的一个确定位置,无条件且冗余地禁用中断。通过放弃选择性逻辑而采用通用规则——确保无论错误地址如何都重置中断状态——他们消除了这个可追溯至2020年Linux 5.8合并窗口的缺陷。对终端用户而言,这并非性能提升,而是在罕见但可能灾难性的场景中对内核可预测性的关键加固,因为在这种场景下,微小不对称的代价极其高昂。