可变时间比较总是加密代码中的安全风险吗?

信息安全 密码学 定时攻击 侧信道
2021-08-21 15:23:03

我遇到了 cryptography python 包,并注意到它有以下关于报告安全漏洞的内容:

我们不会考虑安全问题的示例:在某处使用可变时间比较,如果无法阐明任何会导致信息泄露问题的特定程序。

我认为没有可变时间比较是密码学实现确保安全的事情之一。这应该是所有安全密码库的目标吗?如果不是,在什么情况下是否使用恒定时间比较对安全性没有影响?

4个回答

不,它们并不总是有风险的,事实上,不可能建立一个每个函数都是恒定时间的实用密码库。

以解密函数为例。在现实世界的密码库中,解密 10 字节的消息比解密 10 GB 的消息要快。理论上,您可以创建一个库,其中解密对于任何受支持大小的消息都是恒定时间,但这很荒谬,因此您有一个可变时间函数会泄漏(无用)有关被解密消息大小的信息。这不是问题的具体原因之一是假设攻击者可能将有关消息大小的信息内置到安全证明中。安全属性通常设计为仅假定特定大小的消息的安全性,并且由于它们不适用于不同大小的消息,

在其他情况下,时间可能很敏感,但可以设计一个函数来消除攻击者可能针对该函数使用的任何信息。双MAC'ing就是一个例子。MAC 的评估绝对是一个对定时攻击敏感的函数。在(例如)加密然后 MAC 方案中,您将使用密文发送的 MAC 与针对密文新计算的 MAC 进行比较,定时攻击可能允许攻击者重复提交修改后的密文/MAC 组合并迭代计算有效的 MAC 而无需知道正确的密钥。但是,如果在每次比较时都使用临时密钥重新 MAC 并重新比较,那么是否存在时间问题并不重要。

可变时间比较会泄露信息。如果显示正在比较的数据没有害处,那么使用可变时间比较就没有问题。如果保密至关重要,则使用恒定时间比较。

一些理论上可以利用的可变时间比较在实践中可能难以利用。黑客能够收集的计时数据的质量可能不足以让计时攻击在某些现实世界环境中成功。

例如,如果处理秘密信息的软件在已经具有不一致、不可预测的运行时间(对于相同的输入)的硬件上运行,则定时攻击会更加困难;即使有人可以访问纳秒级精确计时数据。

如果秘密信息也不是那么敏感并且寿命很短,那么与这种定时攻击相关的风险可能太小而无需担心。

但是,有一些方法可以解决嘈杂的时序数据。也许黑客使用其他侧通道来补充计时数据。也许他会向您的服务器发送特定请求,从而使时间更可预测。当然,他可以多次执行攻击并平均化噪音。

(作为开发人员,如果您不确定,请使用恒定时间操作。不要只是假设它很难被利用。)


绝对不应该使用可变时间算法比较的事情:

  • 秘密(对称)密钥或私有(非对称)密钥
  • 消息认证标签
  • 包含秘密的消息(或消息的散列)
  • 硬编码(或用户可配置)的秘密

可能或可能不重要的例子

  • 公钥
  • 密文
  • 公共 IP 地址
  • 公共标识符(不包括个人身份信息)

请记住,损害用户隐私可能是一个安全问题。(即使您个人认为不需要对某些信息保密。)因此开发人员仍应考虑旁道攻击,即使在处理您可能认为不那么敏感的数据时也是如此。

首先,密码学是一个广义的术语,Pythoncryptography库不仅包括原语,还包括 X.509 处理等。

主要问题是攻击者是否可以使用时间问题来获取秘密或降低问题的复杂性,从而将获取秘密的时间降低到使攻击变得现实的值。这意味着攻击者首先可以以足够的粒度测量时间。例如,复杂的 Web 应用程序通常不会出现这种情况,其中网络延迟和 SQL 查询的执行时间等的变化可能会使加密操作中的微小时间差异无法从远程测量。请注意,TLS 握手中密码学的早期使用仍然可能受到影响,因为在这个早期阶段,应用程序中的所有其他开销和变化还没有太大影响。

这也意味着攻击者可以运行足够的实验以最终提取秘密。细节取决于从时间差异中实际泄漏了多少信息,但实际上通常是不可行的。

然后可能会出现不太复杂的攻击。如果它是一个本地应用程序,那么对其进行逆向工程可能会更便宜,而不是将其主要视为一个黑匣子。当然,如果应用程序例如包含在某些防篡改外壳中(如智能卡),那么定时攻击或其他侧通道(如辐射、使用功率的变化......)实际上可能是唯一的方法。

总而言之:如果 a) 可以以足够的粒度测量时间差,并且 b) 可以进行足够的实验,并且 c) 没有明显更便宜的攻击是可能的,那么对时间攻击的抵抗力是相关的。鉴于 a) 和 b) 在很大程度上取决于实际用例,因此加密原语具有抵抗力更为重要,因为它们可能用于各种各样的用例。

避免可变时间比较的主要目的是防止意外的信息泄露导致对应用程序的基于时间的攻击。

例如,看看Padding Oracle attackTime based Blind SQL Injection attack清除程序中的所有可变时间比较需要一定的成本,密码学 python 包试图避免这种成本,因为由于这些情况,它们没有看到任何信息泄露。

很容易错过安全相关代码的此类用例,因此我更愿意避免可变时间比较。