什么是 Linux 中的受污染内核?

bwD*_*aco 116 linux kernel-modules linux-kernel proprietary-drivers

在某些情况下,Linux 内核可能会受到污染。例如,将专有视频驱动程序加载到内核中会污染内核。这种情况可能在系统日志、内核错误消息(oops 和 panics)中以及通过诸如 和 之类的工具可见lsmod,并且会一直保持到系统重新启动。

这是什么意思?它会影响我使用系统的能力吗?它会如何影响我的支持选项?

bwD*_*aco 149

当内核被污染时,意味着它处于不受社区支持的状态。大多数内核开发人员会忽略涉及受污染内核的错误报告,社区成员可能会要求您在他们继续诊断与内核相关的问题之前更正受污染情况。此外,当内核受到污染时,某些调试功能和 API 调用可能会被禁用。

在大多数涉及专有驱动程序的情况下,您可以放心地忽略污染条件,但某些导致内核污染的情况可能表明存在严重的系统问题。

该功能旨在识别可能难以正确解决内核问题的情况。例如,加载专有模块会使内核调试输出不可靠,因为内核开发人员无法访问模块的源代码,因此无法确定模块可能对内核做了什么。同样,如果内核之前遇到过错误情况或发生了严重的硬件错误,则内核生成的调试信息可能不可靠。

内核可能因多种原因中的任何一个而受到污染,包括(但不限于)以下原因:

  • 使用专有(或非 GPL 兼容)内核模块——这是内核受污染的最常见原因,通常是由于加载专有 NVIDIA 或 AMD 视频驱动程序所致
  • 使用暂存驱动程序,这是内核源代码的一部分,但没有经过全面测试
  • 使用未包含在 Linux 内核源代码中的out-of-tree模块
  • 强制加载或卸载内核模块(例如强制插入不是为当前内核版本构建的模块)
  • 在某些不受支持的单处理器 CPU(主要是较旧的 AMD Athlon 处理器)上使用 SMP(多处理器)内核
  • 覆盖ACPI DSDT,有时需要纠正电源管理错误(请参阅此处了解详细信息)
  • 某些严重的错误情况,例如机器检查异常内核 oopses
  • 内核必须解决的系统固件(BIOS、UEFI)中的某些严重错误

这些条件中的每一个都由内核中的特定标志表示。一些 Linux 供应商,例如 SUSE,添加了额外的污点标志来指示条件,例如加载供应商不支持的模块。

内核文档中提供了更多信息。那里列出的污点标志是(带有 _ 代表“空白”)

  • G|P : G 如果加载的所有模块都具有 GPL 或兼容许可证,否则已加载专有模块。没有 MODULE_LICENSE 或具有不被 insmod 识别为 GPL 兼容的 MODULE_LICENSE 的模块被假定为专有的。
  • F|_:如果任何模块被“insmod -f”强制加载,否则如果所有模块都正常加载。
  • S|_:如果 oops 发生在 SMP 内核上,该内核运行的硬件尚未经过认证可安全运行多处理器。目前,这仅发生在各种不具备 SMP 功能的 Athlon 上。
  • R|_:如果模块被强制卸载rmmod -f,否则如果所有模块都正常卸载。
  • M|_:如果任何处理器报告了机器检查异常,否则没有发生机器检查异常。
  • B|_:如果页面释放函数发现了错误的页面引用或一些意外的页面标志。
  • U|_:如果用户或用户应用程序特别要求设置污染标志。
  • D|_ : 如果内核最近死了,即有OOPS或 BUG。
  • A|_:如果 ACPI 表已被覆盖。
  • W|_:如果内核先前已发出警告(尽管某些警告可能会设置更具体的污点标志。)
  • C|_:如果已加载暂存驱动程序。
  • I|_:如果内核正在解决平台固件(BIOS 或类似的)中的严重错误。
  • O|_:如果已加载外部构建(“树外”)模块。
  • E|_:如果一个未签名的模块已加载到支持模块签名的内核中。
  • L|_:如果系统之前发生过软锁定。
  • K|_:如果内核已经实时修补。

  • 我将添加至少一个“未签名模块”场景的重要可能性——内核 rootkit 被加载到内核中或内核漏洞刚刚执行。 (4认同)