CPU 侧信道攻击并不直接利用软件漏洞,而是通过观测 CPU 执行过程中的物理特征(如缓存行为、功耗、电磁波、执行时间等)来获取敏感信息,例如加密密钥、口令、指令流等。
它是硬件级别的攻击,突破了软件层的安全边界,特别是在共享计算资源(如云计算环境)中影响严重。
CPU 为了提高性能,采用了多种优化机制,这些机制往往会在无意中泄露信息。攻击者可以从以下侧信道中推断敏感数据:
Flush+Reload、Prime+Probe。| 名称 | 年份 | 漏洞编号 | 描述 |
|---|---|---|---|
| Meltdown | 2018 | CVE-2017-5754 | 利用非法内存访问的延迟,泄露内核空间数据 |
| Spectre | 2018 | CVE-2017-5753 / CVE-2017-5715 | 利用分支预测与投机执行泄露内存 |
| Foreshadow | 2018 | CVE-2018-3615 等 | 针对 SGX Enclave 的缓存攻击 |
| ZombieLoad | 2019 | CVE-2018-12130 等 | 从 CPU 内部缓冲区泄露数据 |
// 攻击者代码:
if (x < array1_size) {
temp = array2[array1[x] * 512]; // array2 大小足够大,用来构造缓存通道
}
在 x 不合法但被投机执行访问的情况下,如果 array1[x] 指向敏感地址,则会通过 array2 影响缓存状态。攻击者随后通过缓存探测技术还原 array1[x] 内容。
在许多程序中,密码验证往往是逐字符依次比较的,如果密码验证在遇到第一个不匹配字符时立即返回错误,那么通过测量比较过程的时间差异,攻击者可以推断出密码的长度以及每个字符是否正确。这就是经典的时间侧信道攻击(Timing Side-Channel Attack)。
假设有如下简化的密码匹配代码:
bool check_password(const char *input, const char *password) {
for (int i = 0; i < strlen(password); i++) {
if (input[i] != password[i]) {
return false; // 发现第一个不匹配字符立即返回
}
}
return true;
}
当攻击者猜测密码时,每猜一个字符,程序进行一次比较。如果字符正确,比较继续进行;如果错误,立即返回。攻击者通过多次测量函数执行时间,能够发现字符匹配越多,执行时间越长。通过不断调整输入,攻击者最终可以逐字符还原出密码。
lfence 指令)CPU 侧信道漏洞打破了传统的安全边界,是软件与硬件设计之间交互的灰色地带。尤其在云环境中,多租户共享资源使得这些漏洞带来的威胁更加严重。