
无论是比特币,以太坊还是衍生的EOS等数字货币,其核心的信任根是用户的私钥(基于椭圆曲线非对称算法产生的一段随机数)。私钥在,币在,私钥无,币无。黑客当然很清楚这个道理,随着数字货币价值的上升,私钥的攻击和盗取成为他们最热衷的工作。
近期,美国信息安全组织nccgroup在一些开源算法库中发现了通过侧信道攻击的方式获取ECDSA或者DSA私钥的漏洞,现在让我们看看大概的过程:
侧信道攻击(side channel
attack 简称SCA),又称边信道攻击或旁路攻击:是利用加密应用在运行过程中的时间消耗、功率消耗或电磁辐射之类的侧信道信息泄露而对加密设备进行攻击的方法。这类新型攻击的有效性远高于密码分析的数学方法,因此给密码应用带来了严重的威胁。比如处理器中体系架构运行状态的变化,功耗变化或电磁辐射等都为SCA提供攻击源。由于这些威胁的存在,许多实施方法已经被硬化用以抵御这些攻击。
工作组研究了一种针对ECDSA和DSA的新型侧信道攻击,攻击是通过在许多开源密码库中找到的常见算法实现。结果发现,被测试的算法库中大概一半都表现出或多或少的脆弱性。在对最新版本的OpenSSL进行攻击演示中,发现可以使用简单的内存缓存旁路攻击,它可以在大约一分钟内恢复256位ECDSA密钥。
这些算法库的漏洞允许基于侧信道的攻击者恢复ECDSA或DSA私钥。当这些加密库使用私钥创建签名(如TLS或SSH连接)时,它们会无意中通过内存缓存泄漏信息。在同一台计算机上运行的非特权攻击者可以从几千个签名中收集信息并恢复私钥的值。
漏洞位置与原理
该缺陷位于计算签名函数的代码中:
s=k-1(m + r * x) (mod q)
在许多库中,执行模块化加法和取模等运算的代码不会在固定时间内运行,这就给了侧信道攻击可乘之机。这些易受攻击的算法库有一个共同的特点,在关键的取模运算和签名运算都按照以下流程实现。
//大部分的ECDSA签名算法库流程如下:
1:function Mod(a,q) //Return the value of 𝑎 reduced modulo 𝑞
2: if𝑎<𝑞then
3: return 𝑎
4: else
5: 𝑞𝑢𝑜𝑡𝑖𝑒𝑛𝑡, 𝑟𝑒𝑚𝑎𝑖𝑛𝑑𝑒𝑟 ← DivRem(𝑎, 𝑞) //Get remainder after dividing by 𝑞
6: return 𝑟𝑒𝑚𝑎𝑖𝑛𝑑𝑒𝑟
7:functionSign(msg,x,q) //Compute a signature over 𝑚𝑠𝑔 using private key 𝑥
8: 𝑚 ← Hash(𝑚𝑠𝑔)
9: 𝑚 ← Mod(𝑚, 𝑞)
10: 𝑘 ←RandomInteger(1, 𝑞− 1)
11: 𝑘𝑖 ← Inv(𝑘, 𝑞) 12: 𝑟←F(𝑘)
13: if 𝑟=0 then
14: return error
15: 𝑟𝑥 ← Mul(𝑟, 𝑥)
16: 𝑟𝑥 ← Mod(𝑟𝑥, 𝑞)
17: 𝑠𝑢𝑚 ← Add(𝑚, 𝑟𝑥)
18: 𝑠𝑢𝑚 ← Mod(𝑠𝑢𝑚, 𝑞)
19: 𝑠 ← Mul(𝑘𝑖, 𝑠𝑢𝑚)
20: 𝑠 ← Mod(𝑠, 𝑞)
21: if 𝑠=0 then
22: return error
23:return (𝑟, 𝑠)
我们分析一下以上流程会发现,,mod函数(取模)并不是一直在循环运行的。如果递减的参数已经在[0,𝑞 - 1]的范围内,则此函数在不调用DivRem的情况下提前返回。如果旁道探测到DivRem被此函数调用,则攻击者就能获悉有关参数𝑎的信息。
这种漏洞的影响因使用应用程序的方式而异。攻击者和受害者需要在同一台机器B上运行代码才能获得侧信道(自己的网络时间数据对于实际攻击是不够的)。也就是说:当攻击者和受攻击者共享服务器或者都使用在同一物理硬件上调度的基于云的虚拟机时可能会发生这种情况。比如当攻击者和受害者都在云计算环境中运行并且他们的虚拟机被分配共享相同的物理主机时,攻击者可以使用跨VM虚拟通道攻击,窃取SSH服务器密钥或TLS私钥。
攻击者首先需要识别托管站点的云提供商,然后使用该云供应商创建虚拟机,直到其中一台虚拟机与受害站点共享相同的物理处理器。接下来,攻击者启动TLS连接以触发ECDSA签名过程,并使用跨VM侧通道监视泄露的信息,然后使用此信息恢复站点的私钥。攻击者拦截站点和用户之间的数据,修改TLS数据包的内容并使用被盗私钥伪造签名。
这个问题最危险的一面是缺陷库的实现方法被普遍应用,关键信息可能通过简单的旁路方式泄露。这个问题可能存在于我们没有考虑侧通道攻击更实际的实现中,因此对这些系统的影响可能更大。
目前通过分析了几个开源加密库的源代码,梳理出的易受攻击的算法库如下: CryptLib(Both),LibreSSL(Both),Mozilla NSS(Both),OpenSSL(Both),Botan(ECDSA),WolfCrypt(ECDSA),Libgcrypt(ECDSA),LibTomCrypt(ECDSA),LibSunEC(ECDSA), MatrixSSL(ECDSA),BoringSSL(DSA)
概念验证
为了证明攻击的可行性,在最新版本的OpenSSL上实现了Flush + Reload攻击。攻击目标是基于Intel i7-6600u CPU平台上的运行的Ubuntu 18.04版本。攻击者重复刷新cache中的特定地址并监视重新加载地址的时间。如果地址上的内存仍然被清除,则访问时间很长,但如果“肉鸡”在刷新和重新加载之间访问内存,则内存访问时间较短。由于Linux内核的copy-on-write行为,未授权的攻击者进程将相同的共享库映射为特权受害进程,因此攻击者能够检测肉鸡何时在64字节L1指令高速缓存行粒度上加载特定代码。 备注:Flush + Reload是缓存侧信道攻击(Cache side-channel attack)的一种,缓存侧信道攻击是一种利用缓存引入的时间差异而进行攻击的方法,在访问memory的时候,已经被cache的数据访问会非常快,而没有被cache的数据访问比较慢,缓存侧信道攻击就是利用了这个时间差来偷取数据的。各种各样的缓存攻击技术已经被提出并证明有效。
安全建议
大量受影响的供应商今天正在发布补丁。这对于侧通道攻击不是主要问题,只需在发布补丁时应用即可。对于ECDSA和DSA签名代码的维护人员,需确认代码是否遵循易受攻击的模式并实施相应的缓解措施。
Lubanso安全实验室的伙伴们也同步进行了仔细分析,在某些情况下,系统性的打补丁可能很困难,并且旁路攻击是一个普遍问题。我们看到,只要把数字货币私钥放在手机软件钱包APP或者电脑APP中都存在被旁路攻击盗币的风险。具备硬核安全算法引擎算法的硬件钱包大大降低了被旁路攻击的可能性。并且在固件验证与强刷保护的机制下,硬件钱包(参考:lubanso
x1)将私钥保存在专用的安全芯片中,也最大限度的保护了私钥与数据的安全。所以,将私人签名密钥存储在可信执行环境中的嵌入式设备是一个比较好的选择。总的来说,我们建议在构建任何密码系统时需要考虑旁路攻击,实施纵深防御缓解措施使这些攻击更加困难,并且了解如何处理泄露的密钥。

网友评论