Spectre 旁路攻击¶
Spectre 是一类旁路攻击,它利用现代 CPU 上的分支预测和推测执行来读取内存,可能绕过访问控制。推测执行旁路攻击不会修改内存,而是尝试推断内存中的特权数据。
本文档涵盖 Spectre 变体 1 和 Spectre 变体 2。
受影响的处理器¶
推测执行旁路攻击方法影响范围广泛的现代高性能处理器,因为大多数现代高速处理器都使用分支预测和推测执行。
以下 CPU 易受攻击
Intel Core、Atom、Pentium 和 Xeon 处理器
AMD Phenom、EPYC 和 Zen 处理器
IBM POWER 和 zSeries 处理器
高端 ARM 处理器
Apple CPU
高端 MIPS CPU
可能包括大多数其他高性能 CPU。请联系您的 CPU 供应商了解详细信息。
处理器是否受影响可以从 sysfs 中的 Spectre 漏洞文件中读取。参见 Spectre 系统信息。
问题¶
CPU 使用推测操作来提高性能。这可能会在处理器的高速缓存、缓冲区和分支预测器中留下内存访问或计算的痕迹。恶意软件可能会影响推测执行路径,然后利用推测执行在 CPU 高速缓存和缓冲区中产生的副作用来推断推测执行期间访问的特权数据。
Spectre 变体 1 攻击利用条件分支的推测执行,而 Spectre 变体 2 攻击则利用间接分支的推测执行来泄漏特权内存。参见 [1] [5] [6] [7] [10] [11]。
Spectre 变体 1 (边界检查绕过)¶
边界检查绕过攻击 [2] 利用了绕过用于内存访问边界检查的条件分支指令(例如,检查数组索引是否导致有效范围内的内存访问)的推测执行。这导致在验证检查解决之前,推测性地对无效内存(超出边界索引)进行内存访问。这种推测性内存访问可能会留下副作用,创建旁路,从而向攻击者泄漏信息。
Spectre 变体 1 攻击有一些通过网络读取数据的扩展,参见 [12]。然而,此类攻击难度大、带宽低、脆弱,并被认为风险较低。
请注意,尽管名为“边界检查绕过”,但 Spectre 变体 1 不仅仅涉及用户控制的数组边界检查。它可能影响任何条件检查。内核入口代码中断、异常和 NMI 处理程序都具有条件 swapgs 检查。这些在 Spectre v1 的上下文中可能存在问题,因为内核代码可以推测性地以用户 GS 运行。
Spectre 变体 2 (分支目标注入)¶
分支目标注入攻击利用了间接分支的推测执行 [3]。处理器内部用于猜测间接分支目标的间接分支预测器可能受到攻击者的影响,导致 gadget 代码被推测执行,从而暴露受害者接触到的敏感数据。在推测执行期间留在 CPU 缓存中的副作用可以被测量以推断数据值。
在 Spectre 变体 2 攻击中,攻击者可以通过毒化用于预测间接分支地址的 CPU 分支目标缓冲区,将受害者中的推测间接分支引导至 gadget 代码。这种毒化可以通过间接分支到现有代码来完成,间接分支的地址偏移在攻击者的控制之下。由于受影响硬件上的分支预测不能完全区分分支地址并使用偏移量进行预测,这可能导致特权代码的间接分支跳转到具有相同偏移量的 gadget 代码。
最有用的 gadget 接受攻击者控制的输入参数(例如寄存器值),以便可以控制内存读取。没有输入参数的 gadget 可能是可能的,但攻击者对可以读取的内存控制很少,从而降低了攻击揭示有用数据的风险。
另一个变体 2 攻击向量是攻击者毒化返回栈缓冲区 (RSB) [13],以导致推测性子例程返回指令执行跳转到 gadget。攻击者不平衡的子例程调用指令可能会“毒化”返回栈缓冲区中的条目,这些条目随后会被受害者的子例程返回指令消耗。这种攻击可以通过在上下文切换或虚拟机 (VM) 退出时刷新返回栈缓冲区来缓解。
在具有同步多线程 (SMT) 的系统上,攻击可能来自同级线程,因为一级缓存和分支目标缓冲区 (BTB) 可能会在 CPU 核心中的硬件线程之间共享。运行在同级线程上的恶意程序可能会影响其对等线程的 BTB,以将其间接分支推测引导至 gadget 代码,并测量推测执行在一级缓存中留下的副作用以推断受害者的数据。
另一个变体 2 攻击向量是攻击者毒化分支历史缓冲区 (BHB),以推测性地将间接分支引导至特定的分支目标缓冲区 (BTB) 条目,即使该条目未与间接分支的源地址关联。具体来说,即使存在增强型 IBRS,BHB 也可能跨特权级别共享。
此前已知的唯一真实世界 BHB 攻击向量是通过非特权 eBPF。进一步的研究发现了不需要非特权 eBPF 的攻击。为了完全缓解 BHB 攻击,建议设置 BHI_DIS_S 或使用 BHB 清除序列。
攻击场景¶
以下列出的攻击场景已预料到,但可能未涵盖所有可能的攻击向量。
1. 用户进程攻击内核¶
Spectre 变体 1¶
攻击者通过寄存器或通过系统调用期间内存中的已知地址将参数传递给内核。此类参数可能稍后被内核用作数组的索引或用于导出 Spectre 变体 1 攻击的指针。索引或指针无效,但在用于推测执行的代码分支中绕过了边界检查。这可能导致特权内存被访问并泄漏。
对于已识别出数据指针可能受 Spectre 攻击影响的内核代码,使用新的“nospec”访问器宏来防止数据的推测性加载。
Spectre 变体 1 (swapgs)¶
攻击者可以训练分支预测器,以推测性地跳过中断或异常的 swapgs 路径。如果他们将 GS 寄存器初始化为用户空间值,并且推测性地跳过 swapgs,则推测窗口中后续与 GS 相关的 percpu 访问将使用攻击者控制的 GS 值完成。这可能导致特权内存被访问和泄漏。
例如
if (coming from user space) swapgs mov %gs:<percpu_offset>, %reg mov (%reg), %reg1当从用户空间进入时,CPU 可以推测性地跳过 swapgs,然后使用用户 GS 值进行推测性 percpu 加载。因此用户可以推测性地强制读取任何内核值。如果存在使用 percpu 值作为另一个加载/存储中地址的 gadget,则内核值的内容可能通过 L1 旁路攻击可见。
当从内核空间进入时,也存在类似的攻击。CPU 可以推测性地执行 swapgs,导致用户 GS 在推测窗口的其余部分被使用。
Spectre 变体 2¶
Spectre 变体 2 攻击者可以在发出系统调用之前 毒化 分支目标缓冲区 (BTB) 以发动攻击。进入内核后,内核可以在间接跳转时使用被毒化的分支目标缓冲区,并在推测执行中跳转到 gadget 代码。
如果攻击者试图控制在推测执行期间泄漏的内存地址,他还需要通过寄存器或内存中的已知地址向 gadget 传递参数。在 gadget 执行后,他可以测量副作用。
内核可以通过对所有间接分支使用返回跳板(也称为“retpoline”)[3] [9] 来保护自己免受消耗被毒化的分支目标缓冲区条目的影响。返回跳板将推测执行路径困在无限循环中,以防止在推测执行期间跳转到 gadget 代码。具有硬件中增强型间接分支限制推测 (Enhanced IBRS) 的 x86 CPU 应该使用该功能来缓解 Spectre 变体 2,而不是 retpoline。增强型 IBRS 比 retpoline 更高效。
固件中可能存在 gadget 代码,恶意用户进程可以利用 Spectre 变体 2 攻击来利用这些代码。为了缓解 x86 上的此类攻击,在内核调用任何固件代码之前,会启用间接分支限制推测 (IBRS) 功能。
2. 用户进程攻击另一个用户进程¶
恶意用户进程可以尝试攻击另一个用户进程,无论是通过同一硬件线程上的上下文切换,还是通过在同步多线程 (SMT) 系统上共享物理处理器核心的同级超线程。
Spectre 变体 1 攻击通常需要在进程之间传递参数,这需要数据传递关系,例如远程过程调用 (RPC)。这些参数在 gadget 代码中用于导出访问被攻击进程中特权内存的无效数据指针。
Spectre 变体 2 攻击可以由恶意进程通过 毒化 分支目标缓冲区来发起。这可能会影响受害者进程的间接分支目标,该受害者进程要么稍后在同一硬件线程上运行,要么与共享同一物理核心的同级硬件线程并发运行。
用户进程可以通过使用 prctl() 系统调用来禁用自身的间接分支推测,从而保护自己免受 Spectre 变体 2 攻击。管理员还可以通过禁用进程的间接分支推测来隔离不安全进程,使其不会污染分支目标缓冲区。这会因为不使用间接分支推测和清除分支目标缓冲区而带来性能开销。在 x86 上启用 SMT 时,对于禁用间接分支推测的进程,会启用单线程间接分支预测器 (STIBP) [4],以防止同级线程控制分支目标缓冲区。此外,在上下文切换到或从该进程切换时,会发出间接分支预测屏障 (IBPB) 以清除分支目标缓冲区。
在 x86 上,返回栈缓冲区在上下文切换时被填充。这防止了当返回栈缓冲区在切换到更深的调用栈时下溢时,分支目标缓冲区被用于分支预测。之前进程留下的任何被毒化的返回栈缓冲区条目也将被清除。
用户程序应该使用地址空间随机化,使攻击更困难(设置 /proc/sys/kernel/randomize_va_space = 1 或 2)。
3. 虚拟化客户机攻击宿主机¶
攻击机制类似于用户进程攻击内核的方式。通过超调用或其他虚拟化退出路径进入内核。
对于 Spectre 变体 1 攻击,恶意客户机可以通过超调用传递参数(例如在寄存器中),以在进入内核后导出无效指针,从而推测特权内存。对于已识别出此类内核代码的地方,使用 nospec 访问器宏来阻止推测性内存访问。
对于 Spectre 变体 2 攻击,恶意客户机可以 毒化 分支目标缓冲区或返回栈缓冲区,导致内核在推测执行路径中跳转到 gadget 代码。
为了缓解变体 2,宿主机内核可以使用返回跳板进行间接分支以绕过被毒化的分支目标缓冲区,并在 VM 退出时刷新返回栈缓冲区。这可以防止恶意客户机影响宿主机内核中的间接分支。
为了保护宿主机进程免受恶意客户机攻击,宿主机进程可以通过 prctl() 禁用间接分支推测。在上下文切换到此类进程之前,分支目标缓冲区会被清除。
4. 虚拟化客户机攻击其他客户机¶
恶意客户机可能会攻击另一个客户机以获取其他客户机可访问的数据。
如果参数可以在客户机之间传递,Spectre 变体 1 攻击是可能的。这可以通过共享内存或消息传递等机制完成。此类参数可用于派生受害者推测路径中 gadget 代码可访问的特权数据的数据指针。
Spectre 变体 2 攻击可以由恶意客户机通过 毒化 分支目标缓冲区或返回栈缓冲区来发起。这些被毒化的条目可以用于影响受害者客户机中的推测执行路径。
Linux 内核通过在 VM 退出时刷新返回栈缓冲区,并在切换到 CPU 上的新客户机之前清除分支目标缓冲区,来缓解对运行在同一 CPU 硬件线程中的其他客户机的攻击。
如果使用 SMT,管理员可以通过 prctl() 关闭不受信任客户机的间接分支推测,从而缓解来自同级超线程中不受信任客户机的 Spectre 变体 2 攻击。客户机还可以通过在客户机内部启用基于微码的缓解措施(例如 x86 上的 IBPB 或 STIBP)来保护自己。
Spectre 系统信息¶
Linux 内核提供了一个 sysfs 接口,用于枚举系统当前对 Spectre 的缓解状态:系统是否易受攻击,以及哪些缓解措施处于活动状态。
显示 Spectre 变体 1 缓解状态的 sysfs 文件是
/sys/devices/system/cpu/vulnerabilities/spectre_v1
此文件中可能的值为
“Not affected”(不受影响)
处理器不受影响。
“Vulnerable: __user pointer sanitization and usercopy barriers only; no swapgs barriers”(易受攻击:仅有 __user 指针清理和 usercopy 屏障;无 swapgs 屏障)
swapgs 保护已禁用;否则,内核中在特定情况下通过显式指针清理和 usercopy LFENCE 屏障提供保护。
“Mitigation: usercopy/swapgs barriers and __user pointer sanitization”(缓解:usercopy/swapgs 屏障和 __user 指针清理)
内核中在特定情况下通过显式指针清理、usercopy LFENCE 屏障和 swapgs LFENCE 屏障提供保护。
然而,这些保护措施是针对具体情况实施的,并不能保证涵盖 Spectre 变体 1 的所有可能攻击向量。
spectre_v2 内核文件报告内核是否已使用 retpoline 缓解编译,或者 CPU 是否具有硬件缓解,以及 CPU 是否支持额外的进程特定缓解。
此文件还报告微码启用的 CPU 功能,以缓解用户进程之间的攻击
间接分支预测屏障 (IBPB),用于在不同用户进程之间增加额外隔离。
单线程间接分支预测器 (STIBP),用于在同一核心上运行的 CPU 线程之间增加额外隔离。
这些 CPU 功能在使用时可能会影响性能,并且可以根据具体情况为每个进程启用。
显示 Spectre 变体 2 缓解状态的 sysfs 文件是
/sys/devices/system/cpu/vulnerabilities/spectre_v2
此文件中可能的值为
内核状态
“Not affected”(不受影响)
处理器不受影响
“Mitigation: None”(缓解:无)
易受攻击,无缓解
“Mitigation: Retpolines”(缓解:Retpolines)
使用 Retpoline 蹦床
“Mitigation: LFENCE”(缓解:LFENCE)
使用 LFENCE 指令
“Mitigation: Enhanced IBRS”(缓解:增强型 IBRS)
以硬件为中心的缓解
“Mitigation: Enhanced IBRS + Retpolines”(缓解:增强型 IBRS + Retpolines)
以硬件为中心 + Retpolines
“Mitigation: Enhanced IBRS + LFENCE”(缓解:增强型 IBRS + LFENCE)
以硬件为中心 + LFENCE
固件状态:显示在调用固件时是否使用间接分支限制推测 (IBRS) 来防御 Spectre 变体 2 攻击(仅限 x86)。
“IBRS_FW”
调用固件时针对用户程序攻击的保护
间接分支预测屏障 (IBPB) 状态,用于不同用户进程之间的保护。此功能可以通过 prctl() 按进程控制,或通过内核命令行选项控制。这是仅限 x86 的功能。有关更多详细信息,请参阅下文。
“IBPB: disabled”(IBPB:已禁用)
IBPB 未使用
“IBPB: always-on”(IBPB:始终开启)
在所有任务上使用 IBPB
“IBPB: conditional”(IBPB:条件性)
在 SECCOMP 或间接分支受限任务上使用 IBPB
单线程间接分支预测 (STIBP) 状态,用于不同超线程之间的保护。此功能可以通过 prctl 按进程控制,或通过内核命令行选项控制。这是仅限 x86 的功能。有关更多详细信息,请参阅下文。
“STIBP: disabled”(STIBP:已禁用)
STIBP 未使用
“STIBP: forced”(STIBP:强制)
在所有任务上使用 STIBP
“STIBP: conditional”(STIBP:条件性)
在 SECCOMP 或间接分支受限任务上使用 STIBP
返回栈缓冲区 (RSB) 保护状态
“RSB filling”(RSB 填充中)
已启用上下文切换时的 RSB 保护
EIBRS 后屏障返回栈缓冲区 (PBRSB) 保护状态
“PBRSB-eIBRS: SW sequence”(PBRSB-eIBRS:SW 序列)
CPU 受影响且已启用 VMEXIT 时的 RSB 保护
“PBRSB-eIBRS: Vulnerable”(PBRSB-eIBRS:易受攻击)
CPU 易受攻击
“PBRSB-eIBRS: Not affected”(PBRSB-eIBRS:不受影响)
CPU 不受 PBRSB 影响
分支历史注入 (BHI) 保护状态
BHI: Not affected(BHI:不受影响) |
系统不受影响 |
BHI: Retpoline(BHI:Retpoline) |
系统受 retpoline 保护 |
BHI: BHI_DIS_S(BHI:BHI_DIS_S) |
系统受 BHI_DIS_S 保护 |
BHI: SW loop, KVM SW loop(BHI:SW 循环,KVM SW 循环) |
系统受软件清除序列保护 |
BHI: Vulnerable(BHI:易受攻击) |
系统易受 BHI 攻击 |
BHI: Vulnerable, KVM: SW loop(BHI:易受攻击,KVM:SW 循环) |
系统易受攻击;KVM 受软件清除序列保护 |
全面缓解可能需要 CPU 供应商提供微码更新。当没有必要的微码时,内核将报告漏洞。
启用 Spectre 变体 1 和 Spectre 变体 2 的缓解措施¶
1. 内核缓解¶
Spectre 变体 1¶
对于 Spectre 变体 1,易受攻击的内核代码(由代码审计或扫描工具确定)会逐一进行标注,以使用 nospec 访问器宏进行边界剪裁 [2],以避免任何可用的泄露 gadget。然而,这可能无法涵盖 Spectre 变体 1 的所有攻击向量。
copy-from-user 代码有一个 LFENCE 屏障,以防止 access_ok() 检查被错误推测。该屏障由 barrier_nospec() 宏完成。
对于 Spectre 变体 1 的 swapgs 变体,在需要时,LFENCE 屏障被添加到中断、异常和 NMI 入口。这些屏障由 FENCE_SWAPGS_KERNEL_ENTRY 和 FENCE_SWAPGS_USER_ENTRY 宏完成。
Spectre 变体 2¶
对于 Spectre 变体 2 缓解,编译器将内核中的间接调用或跳转转换为等效的返回跳板 (retpolines) [3] [9] 以跳转到目标地址。retpolines 下的推测执行路径被困在无限循环中,以防止任何推测执行跳转到 gadget。
要在易受攻击的 CPU 上启用 retpoline 缓解,内核需要使用支持 -mindirect-branch=thunk-extern -mindirect-branch-register 选项的 gcc 编译器进行编译。如果内核使用 Clang 编译器编译,则编译器需要支持 -mretpoline-external-thunk 选项。内核配置 CONFIG_MITIGATION_RETPOLINE 需要启用,并且 CPU 需要运行最新的微码。
在 Intel Skylake 时代的系统上,这种缓解措施涵盖了大多数情况,但不是全部。有关更多详细信息,请参见 [3]。
在具有 Spectre 变体 2 硬件缓解(例如 x86 上的 IBRS 或增强型 IBRS)的 CPU 上,retpoline 在运行时会自动禁用。
支持增强型 IBRS (eIBRS) 的系统在引导时通过设置 IBRS 位一次性启用 IBRS 保护,并且它们自动受到某些 Spectre v2 变体攻击的保护。BHB 仍然可以影响间接分支预测器条目的选择,尽管当 eIBRS 启用时分支预测器条目在模式之间是隔离的,但 BHB 本身在模式之间不是隔离的。支持 BHI_DIS_S 的系统将设置它以防范 BHI 攻击。
在 Intel 的增强型 IBRS 系统上,这包括 SMT 系统上的跨线程分支目标注入 (STIBP)。换句话说,Intel eIBRS 也启用了 STIBP。
AMD 自动 IBRS 不保护用户空间,并且传统 IBRS 系统在退出用户空间时清除 IBRS 位,因此两者都显式启用了 STIBP。
retpoline 缓解默认在易受攻击的 CPU 上开启。管理员可以通过内核命令行和 sysfs 控制文件强制开启或关闭它。参见 内核命令行上的缓解控制。
在 x86 上,间接分支限制推测默认在调用任何固件代码之前开启,以防止使用固件的 Spectre 变体 2 漏洞利用。
使用内核地址空间随机化(内核配置中的 CONFIG_RANDOMIZE_BASE=y 和 CONFIG_SLAB_FREELIST_RANDOM=y)使对内核的攻击通常更困难。
2. 用户程序缓解¶
用户程序可以使用 LFENCE 或“边界剪裁”来缓解 Spectre 变体 1。有关更多详细信息,请参见 [2]。
对于 Spectre 变体 2 缓解,单个用户程序可以使用返回跳板编译间接分支。这可以保护它们免受恶意软件留下的分支目标缓冲区中被毒化条目的影响。
在旧版 IBRS 系统上,返回用户空间时,隐式 STIBP 会被禁用,因为内核会清除 IBRS 位。在这种情况下,用户空间程序可以通过 prctl() 禁用间接分支推测(参见 Documentation/userspace-api/spec_ctrl.rst)。在 x86 上,这将在用户程序运行时启用 STIBP 以防御来自同级线程的攻击,并在切换到/从程序时使用 IBPB 刷新分支目标缓冲区。
限制用户程序上的间接分支推测也将阻止该程序在 x86 上发起变体 2 攻击。管理员可以通过内核命令行和 sysfs 控制文件更改该行为。参见 内核命令行上的缓解控制。
禁用间接分支推测的程序将具有更大的开销并运行更慢。
用户程序应该使用地址空间随机化(/proc/sys/kernel/randomize_va_space = 1 或 2)来使攻击更困难。
3. 虚拟机缓解¶
在内核内部,来自恶意客户机的 Spectre 变体 1 攻击在 VM 退出路径中逐案缓解。易受攻击的代码使用 nospec 访问器宏进行“边界剪裁”,以避免任何可用的泄露 gadget。但是,这可能无法涵盖所有变体 1 攻击向量。
对于来自恶意客户机对内核的 Spectre 变体 2 攻击,Linux 内核使用 retpoline 或增强型 IBRS 来防止消耗恶意客户机留下的分支目标缓冲区中的被毒化条目。它还在每次 VM 退出时刷新返回栈缓冲区,以防止返回栈缓冲区下溢,从而可以使用被毒化的分支目标缓冲区,或者攻击者客户机在返回栈缓冲区中留下被毒化条目。
为了缓解同一 CPU 硬件线程中客户机对客户机的攻击,在切换到 CPU 上的新客户机之前,通过刷新分支目标缓冲区对其进行清理。
上述缓解措施在易受攻击的 CPU 上默认开启。
为了缓解当使用 SMT 时来自同级线程的客户机对客户机的攻击,管理员可以通过 prctl() 禁用运行在同级线程中的不受信任客户机的间接分支推测。
内核还允许客户机使用它们选择的任何基于微码的缓解措施(例如 x86 上的 IBPB 或 STIBP)来保护自己。
内核命令行上的缓解控制¶
通常,内核会为当前 CPU 选择合理的默认缓解措施。
Spectre 默认缓解措施可以通过内核命令行上的以下选项禁用或更改
nospectre_v1
nospectre_v2
spectre_v2={option}
spectre_v2_user={option}
spectre_bhi={option}
有关可用选项的更多详细信息,请参阅 内核命令行参数
缓解选择指南¶
1. 信任的用户空间¶
如果所有用户空间应用程序都来自可信来源,并且不执行外部提供的不可信代码,则可以禁用缓解措施。
2. 保护敏感程序¶
对于包含秘密(例如加密密钥)的安全性敏感程序,可以通过在程序运行时禁用间接分支推测来提供针对 Spectre 变体 2 的保护(参见 Documentation/userspace-api/spec_ctrl.rst)。
3. 沙盒不可信程序¶
可能成为攻击源的不可信程序可以通过在它们运行时禁用其间接分支推测来隔离(参见 Documentation/userspace-api/spec_ctrl.rst)。这可以防止不可信程序污染分支目标缓冲区。此行为可以通过内核命令行和 sysfs 控制文件更改。参见 内核命令行上的缓解控制。
3. 高安全模式¶
所有 Spectre 变体 2 缓解措施都可以在引导时强制对所有程序开启(参见 内核命令行上的缓解控制 中的“on”选项)。这将增加开销,因为所有程序的间接分支推测都将受到限制。
在 x86 上,当切换到新程序时,分支目标缓冲区将通过 IBPB 刷新。STIBP 始终保持开启,以保护程序免受源自同级线程上运行的程序的变体 2 攻击。
或者,STIBP 可以仅在运行其间接分支推测被显式禁用的程序时使用,而 IBPB 仍然在切换到新程序时始终使用以清除分支目标缓冲区(参见 内核命令行上的缓解控制 中的“ibpb”选项)。此“ibpb”选项的性能开销低于“on”选项,后者始终保持 STIBP 开启。
Spectre 参考资料¶
Intel 白皮书
[1] Intel 对推测执行旁路攻击的分析。
[2] 边界检查绕过。
[3] 深入探讨:Retpoline:一种分支目标注入缓解措施。
[4] 深入探讨:单线程间接分支预测器。
AMD 白皮书
[5] AMD64 技术间接分支控制扩展。
[6] AMD 处理器上的推测管理软件技术。
ARM 白皮书
[7] 缓存推测旁路攻击。
[8] 缓存推测问题更新。
Google 白皮书
[9] Retpoline:一种用于防止分支目标注入的软件构造。
MIPS 白皮书
[10] MIPS:对推测执行和旁路漏洞的回应。
学术论文
[11] Spectre 攻击:利用推测执行。
[12] NetSpectre:通过网络读取任意内存。
[13] Spectre 归来!使用返回栈缓冲区的推测攻击。