47、时间驱动缓存攻击的分析模型与实验验证

时间驱动缓存攻击的分析模型与实验验证

1. 分析模型

在关联攻击中,成功攻击所需的测量次数 $N$ 可按以下公式计算:
[N = 3 + 8 \cdot \left(\frac{Z_{\alpha}}{\ln\left(\frac{1 + \rho}{1 - \rho}\right)}\right)^2 \approx 2 \cdot \frac{Z_{\alpha}^2}{\rho^2}]
其中,参数 $\rho$ 是测量向量 $M$ 与从正确密钥片段 $K_{secret}$ 计算得到的估计向量 $E_{K_{secret}}$ 之间的相关系数;参数 $\alpha$ 是发现密钥的概率,$Z_{\alpha}$ 是标准正态分布对应概率 $\alpha$ 的分位数。当发现密钥片段的概率为 0.99 时,$N$ 可近似为 $11 / \rho^2$。

要确定一个实现的抗攻击能力,可通过以下两步:
1. 对测量进行建模;
2. 计算估计值与建模测量值之间的相关系数:
[\rho = \frac{E (E_{K_{secret}} \cdot M) - E (E_{K_{secret}}) \cdot E (M)}{\sqrt{E (E_{K_{secret}}^2) - E (E_{K_{secret}})^2} \sqrt{E (M^2) - E (M)^2}}]

测量的分析模型基于以下 5 个假设构建:
1. 缓存中在加密操作开始前不包含与加密操作相关的数据,即操作开始前缓存是“干净”的。
2. 加密操作中使用的不同表之间没有冲突,每个表映射到的缓存区域相互不相交。
3. 加密操作期间的缓存访问是随机且相互独立的。
4. 加密操作不间断进行,不受外部影响。
5. 加密操作的执行时间与缓存未命中次数成正比。

由于执行时间与缓存未命中次数成正比,分析模型可基于缓存未命中次数而非执行时间。使用精确的缓存未命中次数可确保 $N$ 的下限,因为实际测量的缓存未命中次数比实际值更具噪声。

接下来推导公式 3 的各个组成部分。由于缓存访问是独立的,缓存未命中次数的一阶和二阶矩等于加密操作中使用的 $T$ 个表的矩之和:
[E (M) = \sum_{t = 1}^{T} E (M_t)]
[E (M^2) = \sum_{t = 1}^{T} E (M_t^2)]
其中,$M_t$ 表示访问表 $t$ 导致的缓存未命中次数。

一个占用 $l$ 个缓存行的表在 $k$ 次访问后恰好有 $j$ 个缓存行被访问的概率 $P_{k, l}(j)$ 可表示为:
[P_{k, l}(j) = \frac{C_{j}^{l} \sum_{i = 1}^{j} (-1)^{j - i} C_{i}^{j} i^{k}}{l^{k}}]
其中,$C_{r}^{n}$ 是二项式系数,表示从 $n$ 个元素中选择 $r$ 个元素的组合数。

使用这些概率,可分别计算 $k$ 次访问占用 $l$ 个缓存行的表时,缓存未命中次数的期望值 $E(M)$ 和方差 $E(M^2) - E(M)^2$:
[\mu_{M}(k, l) = \sum_{j = 1}^{l} j \cdot P_{(k, l)}(j) = l - l \cdot \left(\frac{l - 1}{l}\right)^{k}]
[\sigma_{M}^2(k, l) = \sum_{j = 1}^{l} j^2 \cdot P_{(k, l)}(j) - \mu_{M}^2(k, l)]

为便于计算,将估计调整为:预测缓存命中输出 1,预测缓存未命中输出 0。这只会改变相关系数的符号。

估计的一阶和二阶矩可根据估计值为 1 的概率 $P(E = 1)$ 计算。对于表索引估计,两次独立访问表使用相同表索引的概率为 $1 / r$($r$ 为表中元素的数量);对于缓存行估计,两次独立访问使用相同缓存行的概率为 $1 / l$($l$ 为表占用的缓存行数)。估计的缓存未命中次数的期望值 $E(E)$ 和方差 $E(E^2) - E(E)^2$ 分别为:
[\mu_{E|TIE} = \frac{1}{r}]
[\mu_{E|CLE} = \frac{1}{l}]
[\sigma_{E}^2 = \mu_{E} - \mu_{E}^2]

最后,对于 $E(E \cdot M)$,需区分感兴趣的表和加密操作中的其他表。对于不感兴趣的表,估计和测量是独立的,$E(E \cdot M) = E(E) \cdot E(M)$;对于感兴趣的表,只有估计值为 1 时才对矩有贡献,$E(E \cdot M) = P(E = 1) \cdot 1 \cdot \mu_{H}(k, l)$,其中 $\mu_{H}(k, l)$ 是在正确估计缓存命中时,$k$ 次访问 $l$ 个缓存行的预期缓存未命中次数,可忽略第一次访问,即 $\mu_{H}(k, l) = \mu_{M}(k - 1, l)$。

估计值与观察 $T$ 个表缓存未命中的测量得分之间的相关系数为:
[\rho = \frac{\mu_{E} \cdot \left(\sum_{t = 1}^{T - 1} \mu_{M}(k_t, l_t) + \mu_{H}(k_T, l_T)\right) - \mu_{E} \cdot \sum_{t = 1}^{T - 1} \mu_{M}(k_t, l_t)}{\sigma_{E} \sqrt{\sum_{t = 1}^{T} \sigma_{M}^2(k_t, l_t)}} = \frac{\mu_{E} \cdot \mu_{D}(k_T, l_T)}{\sigma_{E} \sqrt{\sum_{t = 1}^{T} \sigma_{M}^2(k_t, l_t)}}]
其中,$\mu_{D}(k_T, l_T) = \mu_{H}(k_T, l_T) - \mu_{M}(k_T, l_T) = \left(\frac{l_T - 1}{l_T}\right)^{k_r - 1}$。

结合公式 2 和公式 11,得到时间驱动缓存攻击的分析模型:
[N = \frac{2 \cdot Z_{\alpha}^2}{\mu_{E}^2 \sigma_{E}^2 \cdot \frac{\mu_{D}^2(k_T, l_T)}{\sum_{t = 1}^{T} \sigma_{M}^2(k_t, l_t)}}]

例如,对于使用缓存行估计对运行在 64 字节缓存行处理器上的 OpenSSL AES 实现进行最后一轮关联攻击,除了对占用 16 个缓存行的感兴趣表 $T_{e4}$ 进行 16 次访问外,还对其他 4 个表 $T_{e0}$、$T_{e1}$、$T_{e2}$ 和 $T_{e3}$ 各进行 36 次访问。当成功概率为 0.99 时,成功所需的预期测量次数 $N$ 预测为 6592:
[N|\alpha = 0.99 = \frac{11}{\frac{1}{16^2} \left(\frac{1}{16} - \frac{1}{16^2}\right) \cdot \frac{\mu_{D}^2(16, 16)}{4 \cdot \sigma_{M}^2(36, 16) + \sigma_{M}^2(16, 16)}} = 6592]

在同一平台上的同一实现中,缓存行估计攻击比表索引估计攻击大约有效 $r / l$ 倍。对于两个不同实现 A 和 B 在同一平台上的相同攻击,抗攻击能力的增加可表示为信号 - 噪声比的比值:
[\frac{N_B}{N_A} = \frac{\frac{\mu_{D}^2(k_{T_A}, l_{T_A})}{\sum_{t_A = 1}^{T_A} \sigma_{M}^2(k_{t_A}, l_{t_A})}}{\frac{\mu_{D}^2(k_{T_B}, l_{T_B})}{\sum_{t_B = 1}^{T_B} \sigma_{M}^2(k_{t_B}, l_{t_B})}} = \frac{SNR_A}{SNR_B}]

2. 实验结果

为验证分析模型的正确性,使用了以下 5 种 AES 实现或攻击场景:
1. OSSL(OpenSSL):使用 5 个长度为 1024 字节的查找表 $T_{e0}$、$T_{e1}$、$T_{e2}$、$T_{e3}$ 和 $T_{e4}$ 的原始 OpenSSL AES 实现。
2. CLR(Compact Last Round):OSSL 但最后一轮使用长度为 256 字节的单个紧凑 S 盒表代替表 $T_{e4}$。
3. NOT4(NO table $T_{e4}$):OSSL 但最后一轮不使用表 $T_{e4}$,而是使用表 $T_{e0}$、$T_{e1}$、$T_{e2}$ 和 $T_{e3}$。
4. 2ENC(2 ENCryptions):OSSL 被一个只能观察 2 次加密聚合效果的有限攻击者观察。
5. OT4(observe Only table $T_{e4}$):OSSL 被一个能够观察单轮的强大攻击者观察。

所有实验在来自 2 个不同处理器制造商的 3 个不同平台上重复进行,使用 2 种不同的操作系统。平台 A 和平台 B 的 L1 缓存行长度为 32 字节,平台 C 的 L1 缓存行长度为 64 字节。

实验采用单进程设置进行最后一轮关联攻击。在加密随机明文数据前清理缓存,并在加密前后读取被编程为计数 L1 缓存未命中的性能计数器状态。单个测量输出包括密文和 L1 缓存未命中次数的测量得分。

性能计数器仅在高特权模式下可访问,但可安装设备驱动程序和应用程序接口以在任何特权级别使用。因此,实现的安全评估应基于性能计数器提供的测量得分。

以下是成功的表索引估计攻击所需的测量次数:
| 实现 | 32 字节缓存行(预测) | 32 字节缓存行(测量,A) | 32 字节缓存行(测量,B) | 64 字节缓存行(预测) | 64 字节缓存行(测量,C) |
| ---- | ---- | ---- | ---- | ---- | ---- |
| OSSL | 105K | 150K/230K | 140K/220K | 112K | 160K/270K |
| CLR | 2.06M | 2.23M/3.85M | 2.03M/4.00M | 66.8M | 109M/160M‡ |
| NOT4 | 430K | 420K/880K | 440K/830K | 1.52M | 1.64M/3.30M |
| 2ENC | 234K | 290K/520K | 340K/510K | 278K | 450K/825K |
| OT4 | 12.4K | 15.0K/26.0K | 17.0K/26.0K | 30.1K | 38.0K/79.0K |

以下是成功的缓存行估计攻击所需的测量次数:
| 实现 | 32 字节缓存行(预测) | 32 字节缓存行(测量,A) | 32 字节缓存行(测量,B) | 64 字节缓存行(预测) | 64 字节缓存行(测量,C) |
| ---- | ---- | ---- | ---- | ---- | ---- |
| OSSL | 12.7K | 21.1K/35.6K | 20.0K/32.5K | 6.59K | 10.0K/17.5K |
| CLR | 56.5K | 55.0K/125K | 82.0K/148K | 787K | 1.23M/2.18M‡ |
| 2ENC | 28.5K | 35.0K/75.6K | 33.7K/75.0K | 16.3K | 28.7K/49.4K |
| OT4 | 1.50K | 1.87K/3.75K | 2.12K/3.75K | 1.77K | 4.12K/7.00K |

实验结果表明,模型准确预测了所需测量次数的严格下限。为获得中位数所需测量次数的预测,应增加置信水平。

由于分析模型能准确预测所需测量次数,现在可以评估那些因需要太多测量次数而无法获得实验结果的缓解实现。例如,将 OpenSSL 实现改为在第一轮和最后一轮使用长度为 256 字节的单个紧凑 S 盒表,对于能够观察单轮加密的攻击者,在 64 字节缓存行的当代平台上,所需测量次数增加到 $9 \cdot 10^9$;而在每一轮都使用单个紧凑表的实现中,所需测量次数增加到 $10^{23}$。

综上所述,该分析模型为密码学家和软件开发人员提供了一个评估加密算法或软件实现抗时间驱动缓存攻击能力的工具,其准确性已通过不同实现、攻击场景和平台的具体测量结果得到证实。

3. 分析模型与实验结果的深入解读

从实验结果的表格中可以看出,不同的 AES 实现和攻击场景下,所需的测量次数有很大差异。这反映了不同实现方式对时间驱动缓存攻击的抵抗能力不同。

例如,在表索引估计攻击中,CLR 实现(使用紧凑 S 盒表代替 $T_{e4}$)在 64 字节缓存行平台上所需的测量次数大幅增加,预测值达到 66.8M,测量值中位数更是高达 160M。这表明使用紧凑表的实现方式在一定程度上增强了对缓存攻击的抵抗能力。

再看缓存行估计攻击,OT4 场景(仅观察 $T_{e4}$ 表)所需的测量次数相对较少,这说明攻击者如果能够精准地观察关键表,攻击的效率会更高。

为了更直观地理解不同实现和攻击场景之间的关系,我们可以用 mermaid 格式的流程图来表示:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B{选择实现方式}:::decision
    B -->|OSSL| C(表索引估计攻击):::process
    B -->|CLR| D(表索引估计攻击):::process
    B -->|NOT4| E(表索引估计攻击):::process
    B -->|2ENC| F(表索引估计攻击):::process
    B -->|OT4| G(表索引估计攻击):::process
    B -->|OSSL| H(缓存行估计攻击):::process
    B -->|CLR| I(缓存行估计攻击):::process
    B -->|NOT4| J(缓存行估计攻击):::process
    B -->|2ENC| K(缓存行估计攻击):::process
    B -->|OT4| L(缓存行估计攻击):::process
    C --> M(测量次数评估):::process
    D --> M
    E --> M
    F --> M
    G --> M
    H --> M
    I --> M
    J --> M
    K --> M
    L --> M
    M --> N([结束]):::startend

这个流程图展示了不同实现方式在表索引估计攻击和缓存行估计攻击下,最终都会进行测量次数的评估。

4. 实际应用与建议

在实际的软件开发和密码学应用中,我们可以根据分析模型和实验结果来优化加密算法的实现,提高其抗时间驱动缓存攻击的能力。以下是一些具体的建议:
1. 选择合适的表结构 :从实验结果可以看出,使用紧凑的表结构(如 CLR 实现中的紧凑 S 盒表)可以显著增加攻击者所需的测量次数,从而提高系统的安全性。
2. 限制攻击者的观察能力 :尽量减少攻击者能够观察到的信息,如采用多轮加密、隐藏关键表等方式,使攻击者难以准确获取缓存未命中的信息。
3. 合理配置缓存 :根据不同的平台和应用场景,合理配置缓存的大小和缓存行长度,避免因缓存配置不当而增加被攻击的风险。

为了更好地说明这些建议的实施步骤,我们可以用列表的形式呈现:
- 选择合适的表结构
- 分析加密算法中使用的表的大小和访问模式。
- 尝试使用紧凑的表结构,如将大表拆分为多个小表或使用更高效的编码方式。
- 进行实验验证,比较不同表结构下系统的抗攻击能力。
- 限制攻击者的观察能力
- 采用多轮加密,增加加密过程的复杂性。
- 隐藏关键表,避免攻击者直接观察到关键表的缓存未命中情况。
- 对加密过程进行混淆,使攻击者难以准确分析缓存未命中的信息。
- 合理配置缓存
- 了解平台的缓存特性,包括缓存大小、缓存行长度等。
- 根据加密算法的特点和应用场景,选择合适的缓存配置。
- 进行性能测试,确保缓存配置在提高安全性的同时,不会对系统性能造成过大影响。

通过以上的分析和建议,我们可以在实际应用中更好地利用分析模型和实验结果,提高加密系统的安全性,抵御时间驱动缓存攻击。

综上所述,时间驱动缓存攻击的分析模型为我们评估加密系统的安全性提供了有力的工具,而实验结果则验证了模型的准确性,并为我们在实际应用中提供了宝贵的参考。在未来的软件开发和密码学研究中,我们可以进一步优化分析模型,探索更多有效的防御策略,以应对不断变化的安全挑战。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值