Vulnerability-wiki

CPU 侧信道漏洞(CPU Side-Channel Vulnerabilities)

漏洞概述

CPU 侧信道攻击并不直接利用软件漏洞,而是通过观测 CPU 执行过程中的物理特征(如缓存行为、功耗、电磁波、执行时间等)来获取敏感信息,例如加密密钥、口令、指令流等。

它是硬件级别的攻击,突破了软件层的安全边界,特别是在共享计算资源(如云计算环境)中影响严重。


攻击原理

CPU 为了提高性能,采用了多种优化机制,这些机制往往会在无意中泄露信息。攻击者可以从以下侧信道中推断敏感数据:


典型漏洞

名称 年份 漏洞编号 描述
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 内部缓冲区泄露数据

影响


漏洞利用过程示意一(以 Spectre 为例)

// 攻击者代码:
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;
}

当攻击者猜测密码时,每猜一个字符,程序进行一次比较。如果字符正确,比较继续进行;如果错误,立即返回。攻击者通过多次测量函数执行时间,能够发现字符匹配越多,执行时间越长。通过不断调整输入,攻击者最终可以逐字符还原出密码。

防御与缓解

软件层防御

并行硬件层防御

云计算防御


总结

CPU 侧信道漏洞打破了传统的安全边界,是软件与硬件设计之间交互的灰色地带。尤其在云环境中,多租户共享资源使得这些漏洞带来的威胁更加严重。