Linux 内核 CPU 漏洞缓解的攻击向量控制(Attack Vector Controls)完全指南 📅 发布时间:2026/9/8 23:19:26 👁 浏览次数: Linux 内核 CPU 漏洞缓解的攻击向量控制Attack Vector Controls完全指南【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux导读mitigations内核命令行参数大家并不陌生但很少有人注意到它在近期版本中新增了按攻击向量attack vector细粒度控制的能力。本文将围绕内核文档 Documentation/admin-guide/hw-vuln/attack_vector_controls.rst讲解 Linux 如何把十余种 CPU 漏洞Spectre、Meltdown、MDS、GDS、L1TF 等的缓解措施归并为 5 类攻击向量并介绍如何仅针对系统真实面临威胁的路径开启缓解、关闭其余路径以挽回性能。读完本文你将掌握mitigationsauto,no_user_kernel一类参数的含义、优先级关系与底层实现原理能够按需定制自己的引导配置。一、什么是攻击向量控制过去十年x86/ARM 等平台不断曝出 CPU 微架构侧信道漏洞Meltdown、Spectre、MDS、Retbleed、GDS……内核为每一个漏洞都提供了一套或多套缓解手段也提供了各自的专用命令行参数。这让管理员面临一个难题既要缓解真正威胁到本机的攻击又不想为根本不可能发生的攻击场景白白牺牲性能。攻击向量控制attack vector controls正是为解决这一痛点设计的它把 CPU 漏洞的缓解措施按攻击者在哪里、目标在哪里划分为若干条攻击向量让管理员用极简的语法只开启与系统实际用途相关的缓解项从而在不影响安全的前提下尽可能回收性能。这套机制有两个鲜明的设计目标在内核文档中写得非常明确按用途配置管理员只需考虑我的系统会被哪些场景攻击就能决定保留或关闭哪些缓解。面向未来的自愈能力当内核发现新的 CPU 漏洞时会直接把该漏洞归入已有的攻击向量类别。只要管理员选定了攻击向量即使内核升级、新增了缓解项也不需要重新配置命令行参数——新缓解会依据已选定的攻击向量被正确地自动套用。当前内核共定义了5 组攻击向量前 4 组代表跨地址空间的数据泄露方向第 5 组代表跨超线程SMT的数据泄露方向user_kernel用户态 → 内核态user_user用户态 → 用户态guest_host虚拟机 → 宿主机guest_guest虚拟机 → 虚拟机smt / cross-thread跨 SMT 兄弟线程它们的开关由mitigations命令行参数统一控制详见 第三节。补充阅读本目录下还有针对具体漏洞的系列文档可参看 Documentation/admin-guide/hw-vuln/index.rst 中列举的 spectre.rst、mds.rst、l1tf.rst 等。二、五大攻击向量详解2.1 user-to-kernel用户态到内核态攻击形态恶意用户态程序试图利用某个 CPU 漏洞把内核数据泄露到用户态。泄露范围取决于漏洞本身——可能只是某块特定内核内存也可能包含系统中的全部内存如 Meltdown 这类影响物理内存映射的攻击。适用判断如果系统没有运行任何不受信任的用户态程序例如单用户系统就可以考虑关闭 user-to-kernel 缓解。一个重要事实Linux 所缓解的 CPU 漏洞绝大多数尚未被证实可从浏览器沙箱中被实际利用。因此user-to-kernel 缓解主要只在可能有不受信任的用户运行未知用户态程序的场合如多用户服务器、开放终端环境才有意义。user-to-kernel 缓解默认开启。2.2 user-to-user用户态到用户态攻击形态恶意用户态程序试图影响另一个毫无防备的用户态程序的行为从而窃取其数据。目标程序的易受攻击性取决于程序自身及其暴露的接口例如它如何处理信号、共享内存、文件等。适用判断如果系统没有运行不受信任的用户态程序可以考虑关闭 user-to-user 缓解。关键限制务必注意由于 Linux 内核在地址空间中映射了全部物理内存physmap要真正阻止一个恶意用户态程序窃取另一个用户态程序的数据同时必须缓解 user-to-kernel 攻击——因为攻击者可以借道内核的内存映射完成跨进程窃取。也就是说关闭 user-to-kernel 会显著削弱 user-to-user 防护的完整性。user-to-user 缓解默认开启。2.3 guest-to-host虚拟机到宿主机攻击形态恶意虚拟机VM试图把宿主机hypervisor数据泄露进 VM。与 user-to-kernel 类似泄露范围依漏洞而定可能是受限数据也可能包含系统全部内存。适用判断如果宿主机没有运行不受信任的虚拟机可以考虑关闭 guest-to-host 缓解。guest-to-host 缓解在支持 KVM 的情况下默认开启。2.4 guest-to-guest虚拟机到虚拟机攻击形态恶意 VM 试图影响另一台无辜 VM 的行为以窃取数据。目标 VM 的脆弱性取决于其内部代码与对外暴露的接口。适用判断如果没有运行不受信任的 VM或者只运行单个 VM可考虑关闭 guest-to-guest 缓解。与 user-to-user 对称的限制同样由于 Linux 内核的 physmap 机制要阻止恶意 VM 窃取另一台 VM 的数据还需要同时缓解 guest-to-host 攻击。guest-to-guest 缓解在支持 KVM 的情况下默认开启。2.5 cross-threadSMT跨线程攻击形态恶意用户态程序或恶意 VM通过观察或影响运行在SMT 兄弟线程上的代码行为来窃取数据这是 MDS、L1TF、Retbleed 等利用 CPU 共享缓冲区/预测结构的典型场景。缓解档位很多跨线程攻击只有在关闭 SMT 时才能真正被缓解而关闭 SMT 意味着可用 CPU 核心数减半、整体性能下降因此内核为跨线程向量设置了部分缓解这一中间档配置状态行为完全开启auto,nosmt启用针对跨线程攻击的全部缓解内核视 CPU 实际存在的漏洞情况决定是否关闭 SMT部分开启auto启用跨线程缓解但不会关闭 SMT关闭不启用任何跨线程攻击缓解替代手段如果采用了core scheduling核心调度或类似技术保证不受信任的工作负载不会与可信负载跑到同一对 SMT 兄弟线程上那么即便不启用跨线程缓解也是安全的。可参阅 Documentation/admin-guide/hw-vuln/core-scheduling.rst 与 Documentation/admin-guide/hw-vuln/cross-thread-rsb.rst。跨线程缓解默认处于部分开启状态。三、mitigations命令行控制3.1 语法与全局选项所有攻击向量均通过mitigations这一个命令行参数控制。其格式为mitigations[global] mitigations[global],[attack vectors]先是一个全局选项之后可以跟逗号分隔的若干个攻击向量关闭选项。全局选项选项说明off关闭全部攻击向量的缓解auto开启全部攻击向量的缓解跨线程缓解为部分档不关闭 SMTauto,nosmt开启全部攻击向量的缓解跨线程缓解为完全档必要时关闭 SMT攻击向量选项选项说明no_user_kernel关闭 user-to-kernel 缓解no_user_user关闭 user-to-user 缓解no_guest_host关闭 guest-to-host 缓解no_guest_guest关闭 guest-to-guest 缓解no_cross_thread关闭全部跨线程缓解规则要点攻击向量选项可写多个用逗号连接全局选项省略时默认为auto全局选项off等价于关闭全部攻击向量当使用mitigations时需在内核引导命令行如 GRUB 的linux行中追加例如linux /vmlinuz-... root... mitigationsauto,no_user_kernel。3.2 官方示例逐条解析原文档给出了三个典型示例这里逐一展开示例 1只关闭用户态到内核态mitigationsauto,no_user_kernel开启除 user-to-kernel 外的所有攻击向量缓解跨线程为部分缓解SMT 保持开启。适合场景单用户工作站、无可信边界需求但运行了不受信任 VM 的环境等。注意关闭该向量后user-to-user 的完全防护也会因 physmap 机制而大打折扣见 2.2 节。示例 2全力防护 关闭虚拟机相关向量mitigationsauto,nosmt,no_guest_host,no_guest_guest开启所有攻击向量并启用完全跨线程缓解必要时关 SMT唯独关闭 guest-to-host 与 guest-to-guest。适合场景宿主机上不运行不受信任的虚拟机但要全力防护本机用户态威胁的多用户服务器。示例 3省略全局选项的写法mitigations,no_cross_thread全局选项省略等价于auto开启除跨线程外的全部攻击向量缓解。适合场景通过 core scheduling 等方法隔离了不可信负载与 SMT 兄弟线程的环境。3.3 与漏洞专用命令行选项的交互优先级必须牢记的一条铁律漏洞专用控制参数如retbleedoff的优先级高于所有攻击向量控制。也就是说无论攻击向量如何设置管理员都可通过各漏洞的专用命令行参数单独强制开启或关闭某个漏洞的缓解当攻击向量控制触发某漏洞的缓解时使用的是该漏洞的默认缓解选项如果希望使用非默认缓解方案请显式使用漏洞专用参数。例如mitigationsoff关闭全部攻击向量之后仍可用spectre_v2on单独为 Spectre v2 打开缓解反之mitigationsauto已开启某漏洞缓解时也可用mdsoff单独把它关掉。mitigations的完整官方说明位于 Documentation/admin-guide/kernel-parameters.txt 第 4099 行起。其适用范围为[X86,PPC,S390,ARM64,EARLY]且仅在CPU_MITIGATIONSy的内核构建下生效攻击向量形式的子选项则仅对 x86 架构生效。文档还列出了全局选项各档位展开后的等价参数集节选off等价于同时设定kpti0[ARM64]、gather_data_samplingoff、indirect_target_selectionoff、kvm.nx_huge_pagesoff、l1tfoff、mdsoff、mmio_stale_dataoff、no_entry_flush、no_uaccess_flush、nopti、nospectre_v1、nospectre_v2、reg_file_data_samplingoff、retbleedoff、spec_store_bypass_disableoff、spectre_bhioff、spectre_v2_useroff、srbdsoff、ssbdforce-off、tsaoff、tsx_async_abortoff、vmscapeoff等auto默认缓解所有 CPU 漏洞但保留 SMT即使 SMT 本身存在脆弱性auto,nosmt缓解所有 CPU 漏洞并在需要时关闭 SMT等价于l1tfflush,nosmt、mdsfull,nosmt、tsx_async_abortfull,nosmt、mmio_stale_datafull,nosmt、retbleedauto,nosmt等 [X86]。例外off对kvm.nx_huge_pagesforce场景不起作用。四、攻击向量-漏洞缓解汇总表下表是原文档的核心内容它列出了假设 CPU 确实存在该漏洞时开启某一攻击向量缓解后具体会缓解哪些漏洞。漏洞user-to-kerneluser-to-userguest-to-hostguest-to-guestcross-thread备注BHIXXITSXXGDSXXXX*注 1L1TFXX*注 2MDSXXXX*注 2MMIOXXXX*注 2MeltdownXRetbleedXX*注 3RFDSXXXXSpectre_v1XSpectre_v2XXSpectre_v2_userXX*注 1SRBDSXXXXSRSOXXXXSSBXTAAXXXX*注 2TSAXXXXVMSCAPEX脚注说明注 1GDS、Spectre_v2_user可以在不关闭 SMT的前提下得到缓解。注 2L1TF、MDS、MMIO、TAA当跨线程缓解被完全开启且 CPU 存在该漏洞时会关闭 SMT。注 3Retbleed当跨线程缓解被完全开启、CPU 存在该漏洞、且硬件不支持 STIBP时会关闭 SMT。关闭某攻击向量的连锁效应当一个攻击向量被关闭时上表中为该向量列出的全部漏洞缓解都会被关闭——除非该缓解同时是某个仍然开启的攻击向量所必需的或该缓解被漏洞专用命令行参数显式选中。举例关闭 guest-to-host 与 guest-to-guest 并不会连带关闭 user-to-kernel因为 Spectre_v2、L1TF 等仍需要 user-to-kernel 向量提供缓解而所有四个地址空间向量都关闭时MDS、TAA、MMIO 等跨地址空间漏洞的缓解才会全部失效。其中部分漏洞的代号与所属家族可对照本仓库文档确认BHIBranch History Injection参见 Documentation/admin-guide/hw-vuln/spectre.rst 中 spectre_bhi 部分、ITSIndirect Target SelectionIntel CPU 的间接目标选择缺陷参见 Documentation/admin-guide/hw-vuln/indirect-target-selection.rst 与kernel-parameters.txt中indirect_target_selection、GDSGather Data Sampling参见 gather_data_sampling.rst、RFDSRegister File Data Sampling参见 reg-file-data-sampling.rst、SRBDSSpecial Register Buffer Data Sampling参见 special-register-buffer-data-sampling.rst、SRSOSpeculative Return Stack Overflow参见 srso.rst、TAATSX Async Abort参见 tsx_async_abort.rst、TSAAMD Transient Scheduler Attackskernel-parameters.txt中对应tsa、VMSCAPEVMscape可将用户态 hypervisor 数据经推测侧信道泄露给 guest对应vmscape参见 vmscape.rst。五、源码级实现解析文档描述的是行为而真正落地这些规则的代码主要在kernel/cpu.c、arch/x86/kernel/cpu/bugs.c与include/linux/cpu.h中。读懂这三处代码就能透彻理解上文所有规则。5.1 攻击向量位图与默认值kernel/cpu.c攻击向量是否开启核心是一个静态位图数组kernel/cpu.c#ifdef CONFIG_CPU_MITIGATIONS static bool attack_vectors[NR_CPU_ATTACK_VECTORS] __ro_after_init { [CPU_MITIGATE_USER_KERNEL] true, [CPU_MITIGATE_USER_USER] true, [CPU_MITIGATE_GUEST_HOST] IS_ENABLED(CONFIG_KVM), [CPU_MITIGATE_GUEST_GUEST] IS_ENABLED(CONFIG_KVM), }; bool cpu_attack_vector_mitigated(enum cpu_attack_vectors v) { if (v NR_CPU_ATTACK_VECTORS) return attack_vectors[v]; WARN_ONCE(1, Invalid attack vector %d\n, v); return false; }这段注释与源码精准印证了文档的三条默认规则user-kernel、user-user恒为 true默认开启guest-host、guest-guest 仅在**编译期启用了 KVMCONFIG_KVM**时才默认为 true与文档若存在 KVM 支持则默认开启完全一致跨线程向量不在这张表里——它由独立的全局变量smt_mitigations表达见 5.2。向量的枚举定义在 include/linux/cpu.henum cpu_attack_vectors { CPU_MITIGATE_USER_KERNEL, CPU_MITIGATE_USER_USER, CPU_MITIGATE_GUEST_HOST, CPU_MITIGATE_GUEST_GUEST, NR_CPU_ATTACK_VECTORS, }; enum smt_mitigations { SMT_MITIGATIONS_OFF, SMT_MITIGATIONS_AUTO, SMT_MITIGATIONS_ON, };若内核未开启CONFIG_CPU_MITIGATIONS同一头文件会退化为内联桩函数cpu_attack_vector_mitigated()恒返回false、smt_mitigations恒为SMT_MITIGATIONS_OFF。5.2 参数解析mitigations的处理流程mitigations通过early_param()注册在引导早期完成解析kernel/cpu.c。解析逻辑非常清晰先用全局选项表global_mitigationsauto,nosmt/auto/offkernel/cpu.c匹配参数前缀若命中off把整个attack_vectors位图清零同时smt_mitigations SMT_MITIGATIONS_OFF——这正是文档所说off 等价于禁用所有攻击向量若命中auto,nosmtsmt_mitigations SMT_MITIGATIONS_ON表示必要时内核可直接关闭 SMT接着跳过逗号用向量选项表vector_mitigationskernel/cpu.c逐段解析no_user_kernel、no_user_user、no_guest_host、no_guest_guest、no_cross_thread五个子选项逐一将对应位图置 false 或把smt_mitigations置OFF该段逻辑额外要求CONFIG_ARCH_HAS_CPU_ATTACK_VECTORS这也是kernel-parameters.txt标注攻击向量子选项仅 [X86]的原因遇到无法识别的选项会输出pr_crit(Unsupported mitigations%s, system may still be vulnerable\n, ...)告警。此外cpu_mitigations_off()与cpu_mitigations_auto_nosmt()两个判断函数被EXPORT_SYMBOL_GPL导出kernel/cpu.c供全内核各处判断当前全局档位使用。5.3 漏洞到攻击向量的映射arch/x86/kernel/cpu/bugs.cx86 侧各漏洞缓解的择取逻辑集中在should_mitigate_vuln()arch/x86/kernel/cpu/bugs.c它会根据启动时选定的攻击向量决定某漏洞是否需要缓解其 switch 结构与我们第四节表格逐条对应static bool __init should_mitigate_vuln(unsigned int bug) { switch (bug) { case X86_BUG_SPECTRE_V1: return cpu_attack_vector_mitigated(CPU_MITIGATE_USER_KERNEL); case X86_BUG_SPECTRE_V2: case X86_BUG_RETBLEED: case X86_BUG_L1TF: case X86_BUG_ITS: return cpu_attack_vector_mitigated(CPU_MITIGATE_USER_KERNEL) || cpu_attack_vector_mitigated(CPU_MITIGATE_GUEST_HOST); case X86_BUG_SPECTRE_V2_USER: return cpu_attack_vector_mitigated(CPU_MITIGATE_USER_USER) || cpu_attack_vector_mitigated(CPU_MITIGATE_GUEST_GUEST); case X86_BUG_MDS: case X86_BUG_TAA: case X86_BUG_MMIO_STALE_DATA: case X86_BUG_RFDS: case X86_BUG_SRBDS: return cpu_attack_vector_mitigated(CPU_MITIGATE_USER_KERNEL) || cpu_attack_vector_mitigated(CPU_MITIGATE_GUEST_HOST) || cpu_attack_vector_mitigated(CPU_MITIGATE_USER_USER) || cpu_attack_vector_mitigated(CPU_MITIGATE_GUEST_GUEST); case X86_BUG_GDS: return /* 上述四个地址空间向量任一开启 */ || (smt_mitigations ! SMT_MITIGATIONS_OFF); case X86_BUG_SPEC_STORE_BYPASS: return cpu_attack_vector_mitigated(CPU_MITIGATE_USER_USER); case X86_BUG_VMSCAPE: return cpu_attack_vector_mitigated(CPU_MITIGATE_GUEST_HOST); ... } }几点值得注意的实现细节Spectre v1 只与 user-to-kernel 相关——代码注释解释内核中运行时可选用的 spectre_v1 缓解基本都围绕内核入口的 SWAPGS 防护展开因此只需针对用户态→内核态向量防护MDS/TAA/MMIO/RFDS/SRBDS 这类跨地址空间漏洞只要四个向量任一开启就需要缓解印证了文档表格中它们四列全为 XGDS 多了一个特例即使四个地址空间向量全部关闭只要smt_mitigations未处于 OFF即跨线程缓解至少部分开启GDS 仍会被缓解——因为如表格注 1所说GDS 无需关闭 SMT 即可缓解代价较小代码中should_mitigate_vuln()的注释也明确引用了本篇主角文档说明本文件正是该文档的行为实现者。各漏洞实际应用缓解的入口如mds_select_mitigation()、taa_select_mitigation()会先判断 CPU 是否存在对应X86_BUG_*特性位再调用should_mitigate_vuln()决定是否采用默认缓解档同时 SMT 是否关闭由全局smt_mitigations与各漏洞的*_nosmt标志协同决定例如 MDS 应用缓解时arch/x86/kernel/cpu/bugs.c在非MSBDS_ONLYCPU 上、且mds_nosmt || smt_mitigations SMT_MITIGATIONS_ON时会调用cpu_smt_disable(false)关闭 SMT。5.4 启动日志中的可观测信息系统启动时x86 会把最终生效的攻击向量打印出来arch/x86/kernel/cpu/bugs.c格式类似mitigations: Enabled attack vectors: user_kernel, user_user, guest_host, guest_guest, SMT mitigations: auto管理员可用dmesg | grep mitigations核对启动参数是否按预期生效。例如关闭 guest 相关向量后该行会变为Enabled attack vectors: user_kernel, user_user, SMT mitigations: ...若编译未含缓解或配置非法还可能看到Unsupported mitigations...一类的告警。六、实战决策建议综合文档规则与源码行为可按以下思路为自己的系统选择配置先评估威胁面这台机器是否会运行不受信任的用户态程序是否托管不受信任的 VM是否有敏感工作负载与不可信负载共享 SMT 线程对照默认值user-kernel、user-user 默认全开guest-host、guest-guest 在启用 KVM 的内核上默认全开跨线程默认仅部分开启保 SMT。逐个关闭无关向量单用户桌面可考虑mitigationsauto,no_user_kernel并意识到这会连带削弱 user-user 防护不跑 VM 的宿主机可追加no_guest_host,no_guest_guest用 core scheduling 隔离不可信负载时可追加no_cross_thread。需要极致安全则选auto,nosmt完全跨线程缓解内核在 CPU 存在 L1TF/MDS/MMIO/TAA/Retbleed 等漏洞且必要时会自动关闭 SMT代价是逻辑核减半。需要极致性能则选off等价于关闭全部攻击向量不推荐用于运行不可信代码或 VM 的系统。细粒度微调走专用参数攻击向量只决定是否采用某漏洞的默认缓解想选非默认缓解如mdsfull,nosmt、tsx_async_abortfull,nosmt、spectre_v2on等请显式叠加漏洞专用选项——它们的优先级更高且建议叠加前确认相应缓解语义各漏洞的详细语义可查阅本目录下的漏洞专题文档与 Documentation/admin-guide/kernel-parameters.txt。改动后用 dmesg 验证参考 5.4 节的启动日志核对实际生效的攻击向量。适用范围提醒攻击向量形式的子选项目前仅在 x86 架构、且以CPU_MITIGATIONSy构建的内核上可用其余架构仍沿用mitigationsoff/auto/auto,nosmt的全局三档。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考