用户
搜索

该用户从未签到

版主

推荐组组员(最帅的那个)

Rank: 7Rank: 7Rank: 7

32

主题

45

帖子

354

魔法币
收听
0
粉丝
1
注册时间
2018-4-12

i春秋推荐小组

Arizona 版主 推荐组组员(最帅的那个) i春秋推荐小组 楼主
发表于 2018-7-23 16:09:57 34345
本帖最后由 Arizona 于 2018-7-23 08:13 编辑

用70美元的示波器从TERZOR中提取私钥

原标题:Extracting the Private Key from a TREZOR with a 70 $ Oscilloscope
标签(空格分隔): 硬件钱包


在reddit上有一些关于TREZOR的讨论,TREZOR是一个安全存储比特币的硬件钱包。TREZOR能被像功率波动,电磁辐射或类似的边信道攻击。(译者注:边信道攻击(side channel attack 简称SCA),又称侧信道攻击:针对加密电子设备在运行过程中的时间消耗、功率消耗或电磁辐射之类的侧信道信息泄露而对加密设备进行攻击的方法被称为边信道攻击。这类新型攻击的有效性远高于密码分析的数学方法,因此给密码设备带来了严重的威胁。)

这种攻击允许用于检索访问存储于TREZOR上比特币的私钥。通常讨论边信道攻击都会提及签署比特币交易的代码。要在TREZOR上签署交易,您需要先输入PIN码。因此,攻击者在可以物理访问访问设备但不知道PIN码的情况下是没法使用的。

然而,生成公钥过程时也许会通过边信道泄露一些信息。直到固件1.3.2版本及之前,TREZOR也没有对PIN码进行保护。因此,我研究了是否可能使用边信道从公钥计算中恢复私钥。

我首先告诉了Satoshi实验室我的成果,这就是为什么当固件1.3.3计算公钥时会请求PIN码。此外,他们还在此固件中采纳了我建议的补丁。这些补丁将减少在计算公钥、签名和解密期间通过边信道泄露的信息。

本文章介绍了如何从TREZOR恢复私钥,如果它仍然使用固件1.3.1运行。本文遗漏了一些关键的步骤以使任何阅读本文的人都不会太轻易的完成该攻击。尽管如此,还是希望激励您尽快更新您的TREZOR。此外,如果你有密码保护功能,即使在固件1.3.1中这种攻击仍不会奏效,因此你也可以考虑增加密码保护。

安装

我找到了便宜的示波器(Hantek 6022BE)62欧元。(到目前为止,亚马逊上的的价格已经上涨至73欧元)。示波器的目标是测量我的TREZOR随着时间推移的功耗,看看是否可以检测它正在执行哪些代码甚至恢复私钥。
为了测量功耗,我测量了通过USB电缆的电流。由于示波器只能测量电压,我在USB电缆上插入了一个10欧姆的电阻(0.05欧元)。因此,该电阻器上的电压与通过电阻器的电流成正比,这与TREZOR的功耗或多或少成比例。
此处输入图片的描述

第一个结果

此处输入图片的描述

上图显示了启动TREZOR时,功耗随时间的变化。横轴是以秒为单位的时间,纵轴是电阻上的电压。当网站mytrezor.com在后台打开时,TREZOR已连接。当检测到TREZOR时,PRC将向TREZOR询问公钥。如果TREZOR没有密码保护,它将被唤醒,从种子计算主私钥,然后从私钥计算公钥。
在上图中,可以区分不同的阶段。常规尖峰(单击图像以获得更大的版本)是由显示器引起的,显示器以大约90Hz的频率运行。显示器的功耗取决于当前行中的白色像素的数量。因此,它在显示进度条的区域中最高。在图中间计算主私钥时,您可以看到尖峰越来越高,因为进度条被填充。显而易见的是,显示屏向左滑动并在此过程中清除时,在这些地方,功耗会慢慢下降。

为了计算管理员的私钥,将执行一个叫做PBKDF-2的算法。在此期间,处理器的功耗将超过当算法暂停刷新显示器时的功耗(它执行8次)。在最后一次刷新之后,开始计算TREZOR的公钥。当缩放到不同的部分时,可以将PBKDF-2算法与计算公钥的部分区分开来。

此处输入图片的描述

在这里我们放大了曲线关于PBKDF-2的部分。这是来自pbkdf的第一部分,其中进度条尚未填充。在中间您可以看到调用函数oledRefresh的较低功耗的一部分。您还可以清楚地看到由显示器的90Hz刷新引起的常规周期。每个循环包括两个尖峰。这些尖峰是由进度条上方和下方的线条引起。有几个小峰值,这是由PBKDF-2算法执行的SHA-512操作引起的。下图更详细的显示它们。

此处输入图片的描述

此图显示了单个显示器刷新周期,大约需要11毫秒。在该图中,除了包含处理器信号的显示器功耗(由显示进度条引起)之外,各个sha-512周期清晰可见。
尽管单个周期清晰可见,但它们看起来非常相似。小的扭曲可能是由显示器引起的。几乎不可能获得有关SHA-512计算中使用的实际值的任何信息。功耗的变化主要是由不同的指令,不同的高速缓存未命中或分支误预测引起的,而不是输入数据中的不同位。

分析key推导函数

我更感兴趣的是测定私钥。因此,在本节中,我将研究密钥的生成。为了避免显示屏噪音,我设置了一个空白的主屏幕。您可以将此视为作弊,因为更改主屏幕需要PIN。然而,一个不道德的攻击者可能只是需要打破这个盒子并扯掉显示器就可以达到同样的效果。下图显示了主公钥的计算m/44'/0'/0'/0。

此处输入图片的描述

在上面的图形中,有四个尖峰,标志着bip32推导步骤的开始。如果仔细计算两者之间的小峰值,则可以确定用于计算每个公钥的point_adds的数量。为了了解这一部分的内容,我将密钥生成函数的伪代码放在这里。

    hdnode_private_ckd_cached(HDNode * inout,int * i,int count){
        ...一些代码在缓存中查找密钥..
        for(j = 0; j <count; j ++)
          hdnode_private_ckd(inout,i[j])
    }

    hdnode_private_ckd(HDNode * inout,int     i){
       ... data = private / public key + i ...
       I = hmac_sha512(inout-> chaincode,data)
       inout-> chaincode = I [32:]
       inout-> private_key + = I [0:32];
       inout-> public_key = scalar_multiply(inout-> private_key)
    }

    //计算point private_key * G.
    scalar_multiply(bignum256 * private_key){
       iszero = 1
       for(int i = 0; i <255; i ++){
          if(privatekey&(1 << i)){
             //一次计算两个比特。
             twobits =(privatekey>> i)&3;
             //在一张大表里查找twobits * 2 ^ i * G.
             toadd = bigtable [twobits] [i];
             if(iszero){
            res = toadd;
                iszero = 0;
             } else {
                res = point_add(res,toadd);
             }
             i++; //跳过另一个比特位
          }
       }
       return res;
    }

    point_add(point * a,point * b){
       ......一些通常是错误的条件......
       bn_inverse(b-> x  -  a-> x);
       ...一些乘法......
    }

    bn_inverse(bignum256 * a){
       ......一些健谈函数泄漏了很多关于输入a的随机信息到我的边信道...
    }

下图更详细地显示了密钥生成步骤的第一部分,并比较了算法的不同运行。

此处输入图片的描述

第一行和第二行显示了在两个不同的运行设备中计算同一私钥的公钥。第三行显示了对不同私钥的公钥的计算。您可以清楚地看到我们已经在pbkdf-2算法的放大部分中看到的SHA-512周期。BIP32算法需要这些来计算子私钥。在这些循环之后,公钥的计算开始。为了计算公钥,该函数scalar_multiply 为出现在私钥中的每一比特位调用point_add函数。你可以通过一个小尖峰看到这部分的开始。point加法的大部分时间是消耗在bn_inverse函数。这是一个特别有趣的函数,因为它正在执行的代码依赖于输入,并且对于调用它的每个输入看起来都不同。你可以看到它产生的是随机的特征。最后会有一些乘法,这将再次形成两个常规的小尖峰,然后是一个大的尖峰,下一个point的加法开始。

如果比较三行,您可以看到特征是由bn_inverse函数调用引起的,每轮看起来非常不同,但如果在同一输入上调用它,则与在第一行和第二行中完成相同。

如何恢复私钥

一个可以清晰看到的事情是,在私钥中的每一个比特位会引起point加法的调用。我希望看到的一个事情是私钥中没有一个比特位被scalar_multiply跳过。然而这些操作因为时间太短而看不见。所以从波形图直接读取比特的方法不起作用。

然而,输入依赖于bn_inverse函数的指纹足够恢复密钥。这个主意是首个bn_inverse函数的输入只依赖于首次两个point在scalar_multiply的加法循环。此时,该函数将仅处理私钥的几个最低位,为密钥的最低位生成所有可能的值,计算参考TREZOR上的相应公钥,并记录指纹bn_inverse。这些可以与受害者TREZOR的指纹进行比较。平均而言,必须检查26.5个指纹,直到找到匹配的指纹,从而找到最低位。后面的步骤变得更加容易;对于攻击者来说,平均只需要检查5.5个指纹。

我已经恢复了128位私钥作为POC。我花了大约两个小时才恢复后一半。主要问题是需要一个参照TREZOR并使用它来检索bn_inverse函数的必要指纹。每个私钥都必须重复这项工作。

无需扩展访问你想要破解的TREZOR。简单记录一个密钥推导(能在几秒钟之内完成),提供所有您需要从TREZOR获得的信息。但确切的指纹取决于确切的固件。因此,我想函数的对齐很重要,例如,它是否跨越缓存行。然而,即使固件不同,指纹也足够接近于识别它。

改进固件

针对这些结果,计算公钥时增加了PIN保护。这应该可以防止大多数侧通道攻击。

此外,我建议对固件进行一些改进,以解决此问题。第一个改进是只打算分给一个稍微好一点的性能bn_inverse的功能;我甚至没有删除输入相关的时序。尽管如此,但它使我的示波器完全看不到该功能。为什么会这样?我的最佳猜测是,因为我删除了一些重复的代码,所以在整个内循环中使用相同的代码路径,但是之前的代码在U和V代码路径切换取决于输入。

但是,函数的确切时间仍取决于输入。因此,仍然可以通过观察调用point_add的持续时间来恢复私钥。

此处输入图片的描述

这段开始于get_public_node包被收到时。这段开始处还有HMAC-SHA256计算。正如你可以看到调用bn_inverse产生一个几乎平坦的信号。峰值是在point_add中最终调用乘法引起的。在第二个补丁集给出了几乎恒定时间的scalar_multiply函数。唯一与时间相关联的输入是最终的一个 bn_inverse 调用。并且仅在处理完密钥时在最后调用。这应该使得无法恢复有关私钥的任何信息。这个补丁的另一个副作用是信号更加安静。

此处输入图片的描述

此段开始于结束scalar_multiply调用时。您可以看到四个调用,从jacobian_to_point调用的bn_inverse,跟着调用point_jacobian_add。

然后推导下一个公钥,并再次应用HMAC-SHA256。之后point_to_jacobian跟着一个point_jacobian_add的常规序列。在scalar_multiply中还有一个表查找。并且我不确定这是否会产生问题。原则上,通过检测高速缓存未命中,可以获得关于私钥的一些信息。但是,我无法通过硬件检测到缓存命中或未命中之间的差异。尽管代码并不完美,但它应该使侧通道攻击变得更加困难。使用我的技术(检查USB电缆的功耗),我看不到任何方法从scalar_multiply侧通道攻击中恢复私钥。分析电磁辐射或声学也不可行,因为它们的信息更少。通过打开设备并直接在处理器上测量功耗,可以恢复更多信息。但这要求可以物理访问,并且在这种情况下,你每个操作都需要PIN码。

下载

我将一些记录压缩成zip文件recordings.zip。这些是未压缩的wav文件。我发现用audacity观察它们更方便。上面的图形都是用这个程序创建的。
zip文件包含:

(1)默认主屏幕和空白主屏幕的初始序列的完整记录
(2)仅使用更高的采样频率记录bip32阶段
(3)记录bip32使用带有分支bignum_improvements的固件的空白主屏幕阶段。

原则上应该可以从该数据中提取私钥。我认为甚至有一些用于测试的币受这些密钥的保护,所以如果你恢复密钥,与它们玩得开心点儿:)

时间线

  • 2015-03-21:标记固件1.3.2。
  • 2015-03-24:固件1.3.2二进制文件已添加到webwallet-data存储库,但尚未发布。
  • 2015-03-24:我的示波器到了,期待我做好一切准备。
  • 2015-03-26:第一个结果。那个时候我告知stick和slush。他们要求延迟发布,直到他们能够在新固件版本1.3.3中解决问题。
  • 2015-03-29:我设法通过应用上面概述的技术来提取私钥的很大一部分。
  • 2015-03-30:PIN保护已添加到固件代码中。我对相关加密函数的补丁已合并到TREZOR存储库中。
  • 2015-04-07:发布固件1.3.3。
  • 2015-04-09:此页面已公布。

总结

侧通道攻击并不像许多人想象的那么困难。简单的功率分析只需要一个简单的示波器,很难称为昂贵的实验室设备。您还需要基本的焊接技能和对正在运行的代码的深入了解。只需一次记录公钥的计算,就可以恢复私钥。

从好的方面来说,这种简单的侧通道攻击可以通过使用恒定时间代码来缓解,正如我所展示的那样,这段代码不必运行得很慢。

新的固件1.3.3免受此攻击,因为它
(1)需要PIN来计算公钥。
(2)使用无分支计算从私钥导出公钥。
没有针对所有类型攻击的完美保护。如果您的TREZOR被盗并且没有密码保护(或者密码短语),您应该将硬币转移到另一个钱包。

还有其他攻击媒介,如故障注入仍然可以使用,并可能绕过PIN保护。基本上,他们现实中使用的是,如果电源或时钟信号被破坏,微处理器会发生意外情况。这些更难以执行,但它们可能比使用电子显微镜从芯片读取种子更便宜。此外,微处理器中可能存在允许绕过读出保护的错误。

声明

我没有加入Satoshi Labs或他们的任何竞争对手。我自己拥有两个TREZOR,我仍然认为硬件钱包是防止大多数攻击媒介的最好方法。任何新产品都会出现这样的问题,TREZOR现在还不到一年。更重要的是要及时修复这些问题。

如果你想支持我的工作,可以将比特币发送到1D2XuL4uH52qgy2FerzNkeX1jJ9gCJwqgq

作者:Jochen Hoenicke
翻译:i春秋翻译小组-海绵体VS括约肌
责任编辑:jishuzhain
翻译来源:https://jochen-hoenicke.de/trezor-power-analysis/

发表于 2018-7-24 11:57:41
本帖最后由 屌丝绅士 于 2018-7-24 03:59 编辑

想起了今年的先知白帽  的时序攻击,不过 前提是 你需要有这样一个比特币的冷钱包,,,
啥家庭啊    挖矿的啊

做自己的自己 和平年代的炮灰,战争年代的爆破鬼才
使用道具 举报 回复
首先你得花70美元买个示波器。。。
使用道具 举报 回复
支持一下~
使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册