主页 > imtoken安卓版版本下载 > 15岁少年破解比特币钱包后,献上这份诚意破译教程
15岁少年破解比特币钱包后,献上这份诚意破译教程
近日,15岁的英国黑客Saleem Rashid透露,比特币硬件钱包Ledger Nano S存在严重安全漏洞。 它可能会被黑客控制,成为黑客安插在你身边窃取你比特币的“间谍”。
什么是 Ledger Nano S? 这是硬件钱包市场的明星产品。
此后,Rashid在个人博客上发布了他的破解教程,由区块链总部整理如下。 不可有害人之心,不可有防人之心。 希望这篇文章能让你提高警惕。
作者| 萨利姆·拉希德
编译 | 国喜
编辑| 小西
在这篇文章中,我将讨论我在 Ledger 硬件钱包中发现的一个漏洞。 Ledger 使用自己开发的架构来解决比特币硬件钱包的安全限制。 所以,这套安全系统难免会存在一些漏洞。
Ledger Nano S 比特币硬件钱包
由于这个漏洞,Ledger 硬件钱包变得极不安全。 黑客不仅可以在用户获取Ledger硬件钱包之前对其进行破解,在某些场景下还可以物理甚至远程从硬件钱包中窃取用户的私钥,这意味着黑客可以轻松窃取你的Ledger比特币。
那么,黑客是如何实现的呢?
如何窃取比特币
1. 播种前的物理接触
在本文中,我们将使用供应链攻击。 软件供应链是指由软件源代码编写、源代码编译、软件分发、软件下载、软件更新组成的流水线。 软件供应链攻击是在软件供应链的各个环节使用不同的技术对软件进行攻击。 使用供应链攻击不需要目标计算机上有恶意软件,甚至不需要用户确认交易。 我已经对 Ledger 的 Nano S 比特币硬件钱包实施了这种攻击。 另外,为了维护系统的安全,我在几个月前将源码发给了Ledger,让Ledger修复这个漏洞。
视频内容
从上面的视频中可以看出,我们可以轻松地执行供应链攻击,修改为恢复生成的种子。 由于所有私钥都来自恢复种子,黑客可以窃取硬件钱包上加载的所有数字资产。
2.安装后物理访问
这通常被称为邪恶女仆攻击。 攻击后,您可以在硬件钱包上提取 PIN、恢复种子和任何使用过的 BIP-39 密码。
如前所述,这不需要计算机上有恶意软件,也不需要用户确认任何交易。 它只需要黑客安装一个定制的MCU(Microcontroller Unit,微控制单元,也称为微控制器或微控制器,以下简称微控制器)固件,用户下次使用比特币硬件钱包时,私钥就会在他们的不知不觉泄露了。
3. 恶意软件(带有一些社会工程学)
这种攻击方式会要求用户升级感染病毒的计算机上的MCU固件。 这可以通过显示系统错误消息来误导用户来实现,该消息要求用户按住左键并重新连接比特币硬件钱包(以进入 MCU 的引导加载程序)。 然后恶意软件可以使用恶意代码更新 MCU 固件,从而允许恶意软件控制比特币硬件钱包的显示和确认按钮。
这种攻击发生过很多次,经常是在更新官方固件的时候。
概念证明
如果您不想错过创建漏洞的机会,可以在 Github 上找到我的概念证明。
如果按照说明将其安装在运行固件版本 1.3.1 及以下的 Ledger Nano S 比特币硬件钱包上,就可以实施视频中刚刚展示的攻击。 但是,由于这仅用于教育目的,我故意让您正在恢复的攻击变得不可靠。
比特币硬件钱包的前世今生
像比特币这样的加密货币使用公钥密码术(也称为非对称密码术,是使用一对公钥和私钥的密码术)来保证资金安全,只有拥有私钥才能使用资金。
这就给用户带来了一个问题,用户应该如何保护自己的私钥呢? 一般来说,人们,甚至是安全专家,都不擅长记住密码。
为了解决这个问题,出现了一种名为“比特币硬件钱包”的新设备。 顾名思义,这种硬件设备可以存储用户的私钥以防止恶意软件。 这种设备一般可以通过USB口连接到电脑上,但不会泄露电脑上的私钥,就像硬件安全模块(hardware security module)一样。 模块,HSM,可以理解为支持银行卡的U盾)。
然而,获取私钥并不是黑客窃取您心爱的比特币的唯一途径。 攻击比特币硬件钱包的黑客可以很容易地改变你的交易对象和交易金额,从而将你的钱转到他的账户中。 这是秘密进行的,许多用户直到为时已晚并且他们的比特币丢失时才意识到他们被黑客入侵了。
因此,比特币硬件钱包应该具备以下功能,以区别于笨拙的硬件安全模块。
比特币硬件钱包还需要防范各种攻击:
我们可以进一步将上次攻击的过程分为两步:窃取比特币硬件钱包和进行Wicked Sybil攻击,如果黑客能够窃取设备,那么他将有更长的时间来执行攻击,甚至可能使用它在实验室中是昂贵但高性能的裂解设备。 然而,在此期间用户可能会意识到比特币硬件钱包丢失并转出资金。
未存储在比特币硬件钱包中的加密数据等安全功能可以防止攻击者窃取您的资金,因为单纯的比特币硬件钱包不包含恢复用户私钥所需的完整信息。
另一方面,在邪恶女仆攻击中,黑客只能在有限的时间内执行攻击,而且没有实验室高性能设备的加持。 但是这种类型的攻击可能更加危险,因为它可以用于多种场景:
还有一种场景需要注意供应链攻击的可能性。 即:当您从经销商或第三方购买比特币硬件钱包时,您是否信任该设备? 正如我一开始所说,您的比特币硬件钱包可能已被盗用。
破解比特币硬件钱包
2014 年 9 月,Ledger 发布了 HW.1 比特币硬件钱包。 该钱包基于微控制器 ST23YT66,包含一张智能卡并支持 USB 连接。 不幸的是,这种设计有严重的局限性:钱包没有可靠的显示屏或按钮,这使得钱包使用起来很危险。
2016年7月,Ledger宣布推出一款名为Nano S的新型比特币钱包。这款钱包基于安全元件(Secure Element,通常以芯片的形式提供。为防止外部恶意分析攻击,保护数据安全,芯片具有加密/解密逻辑。)ST31H320 带确认按钮、可信显示、USB 连接。
2017 年 11 月,我决定仔细研究一下 Nano S 的安全性。
看一下Nano S的双芯片架构比特币钱包代付,ST31H320虽然没有公开的datasheet,但是单看数据汇总就知道这个SE是不支持显示的! 事实上,它甚至不支持 USB 连接,它唯一支持的接口是低吞吐量 UART(通用异步接收器/发送器,这是一种异步收发器,是计算机硬件的一部分)。
我勒个去? 显示器如何工作?
碰巧的是,Ledger 开发了一种新架构来解决这个问题,Nano S 添加了一个非安全微控制器 STM32F042K6,它充当安全元件的代理。 该微控制器驱动显示屏、按钮和 USB 接口。 两个芯片有自己的分工,安全元件存储私钥,非安全微控制器作为安全元件的接口。
为了便于描述,我们将 ST31H320 安全元件称为 SE,将 STM32F042K6 微控制器称为 MCU。 架构如下图所示。
Ledger Nano S 的架构
长话短说,安全元件只能直接与微控制器通信,但是,微控制器可以代表安全元件与外围设备通信。
secure element 的一个重要特性是我们可以进行密码验证来证明它运行的是官方的 Ledger 固件,这其实是 Ledger 的一个卖点:事实上,Ledger 认为这个安全特性非常强大,以至于 Ledger 比特币硬件钱包不需要防篡改标签,如商品随附的说明中所述:
其他公司的硬件钱包有防篡改标签
物品附带的说明
(大家有没有注意到我们的产品上没有防篡改标签,不用担心,Ledger的密码机制会在每次开机时检查固件的完整性,安全元件芯片可以防止各种入侵和物理损坏。我们的产品非常安全)
Ledger的首席技术官甚至告诉用户,Ledger比特币硬件钱包非常安全,不用担心购买的来源,可以放心大胆地从第三方平台购买Ledger比特币硬件钱包,例如作为易趣。
这带来了一个关键问题,我相信您已经发现,SE 上的软件已被证明是安全的,但微控制器不是安全芯片,而且,正如我们将在下面的教程中展示的那样,微控制器设备的固件可以被黑客篡改。
这里的问题是,要实现 Ledger 的安全保证,信任链必须锚定在安全元件中,这意味着安全元件必须验证不安全的微控制器上的固件。
如何篡改硬件?
虽然本文将重点介绍软件篡改,但请务必注意,即使没有软件漏洞,您仍然可以通过篡改硬件来破坏设备。
需要注意的是,为了确保这些比特币硬件钱包的安全,设备硬件必须经过全面验证。
由于Ledger的比特币硬件钱包和包装都不是防篡改的,黑客很容易对设备进行篡改,我不禁再重申一遍:如果你不验证物理硬件,你的资产就有风险!
当有人在未经您授权的情况下使用您的设备时,请务必重新进行身份验证,否则您将容易受到邪恶女仆的攻击。
Ledger 提供了验证物理硬件的说明,但我注意到它有两个问题。
网上图片的分辨率各不相同,Ledger 需要提供清晰显示每个组件的高分辨率图片。 设备的背面完全没有。
验证设备的背面很重要,因为这是微控制器的 JTAG 接头(调试接口)所在的位置。
即使解决了这两个问题,我认为如果黑客使用具有额外内存但引脚数与 STM32F042K6 相同的微控制器伪造 STM32F042K6,他们仍然可以破解比特币硬件钱包。
到这里我们已经在很多硬件上演示了破解比特币硬件钱包的可能性,现在我们回到软件破解比特币硬件钱包。
Ledger 的对策——验证微控制器固件
假设您已经仔细检查了硬件,并且它确实没有改变,如果攻击者只是修改了微控制器的固件会发生什么?
Ledger 考虑到这种攻击,为了防止这种情况,微控制器固件使用安全元素进行身份验证。
但事实证明,在非安全微控制器上验证固件并不是那么简单,安全元件只是一张智能卡,这意味着与微控制器通信的唯一方式是通过低吞吐量 UART,而不能直接访问微控制器。 控制器上的 RAM 或内存,安全元件如何验证其固件?
Ledger 的解决方案:安全元件要求微控制器传递其内存的全部内容,如下所述。
安全元件验证过程
乍一看这似乎有问题,原则上我们要求一个(可能被篡改的)微控制器来证明它正在运行 Ledger 的官方固件。 但是,如果微控制器被篡改了,它仍然可以发送Ledger的官方固件,怎么能确定它发送的是它现在正在运行的固件呢? 这是 Ledger 面临的挑战。
Ledger采用的解决方案是基于微控制器内存大小有限的事实。 为了让微控制器运行恶意固件,黑客还需要存储 Ledger 官方固件的副本以供安全元件检查。 因此,Ledger 的解决方案是限制内存大小,使这种攻击变得困难。
具体来说,通过验证整个内存(并用随机数据填充空白空间),Ledger 试图修复这个托管恶意固件但通过 SE 检查的漏洞。
这是一个了不起的想法,也许这个想法会成真。 但是,我完全不同意这个解决方案。
我的专属攻击
虽然可以使用一些直接的方法来攻击这种架构,比如通过电脑USB口向比特币钱包软件植入恶意代码,尝试自主研发一种攻击方式(比如利用供应链攻击攻破比特币硬件钱包)它看起来更有趣。
我使用的第一种方法是压缩代码,考虑到执行时间、内存使用和代码大小的组合,使用压缩算法如 DEFLATE 或 LZMA 是行不通的。 因为如果用户用了20秒才启动钱包,那他肯定会考虑是不是出现了异常。
更不用说,虽然压缩整个内存的结果令人满意,而且我对微控制器的结果感到欣喜若狂,但我不想为已经在内存中的微控制器更换引导加载程序,因为这两种方法都可以在比特币硬件钱包中安装新固件。
使用 JTAG,此调试接口专为嵌入式固件开发人员上传新固件而设计。 使用bootloader,Ledger用户通常使用它来升级固件,你可以在Github上找到Ledger为此设计的Python工具。
我使用了第二种方法,因为我不喜欢焊接东西。 如果我在更换引导加载程序时犯了一个错误,这将不起作用,并且除非使用 JTAG 接口修复,否则设备也会变砖。
因此更换bootloader并不是最好的选择,我们需要排除压缩的选择。
但还有另一种方法。 编译 C 程序时,工具链(编译程序的软件套件)会执行很多操作以确保编译成功。 例如,许多处理器没有大数除法指令,编译器通过插入除法运算软件来解决这个问题。 另一个例子涉及为函数中定义的变量声明初始值。 调用该函数时,编译器会在最开始插入额外的代码,以将该初始值复制到堆栈中。
编译器为执行这些任务而插入的额外函数称为“编译器内在函数”。 由于微控制器同时具有引导加载程序和固件,并且它们是完全独立的程序,因此这些内部函数将在内存中出现两次(每个程序中仅出现一次)。
这样做的结果是我们可以插入我们的恶意代码来替换编译器内联函数例程的冗余副本(特别是固件中的副本),因此我们保存了引导加载程序的完整副本。
由于bootloader中固有的内容与固件中的完全一致,当SE向微控制器询问其内存中的内容时,我们可以“拼凑”出正确的镜像,当固件需要使用固有内容时,我们可以跳转到bootloader中的内在内容。
从源构建引导加载程序和固件后,您可以使用此命令查询目标。
nm -S --size-sort -t d bin/token | grep -i " t "
该命令包含一些有趣的符号,这些符号在引导加载程序和固件中是相同的,不要惊讶,这三个符号都是编译器内部函数。
134228637 00000124 T memcpy
134228761 00000140 T memset
134228357 00000266 T __udivsi3
要使用我们隐藏的恶意代码,就必须将(hook,可以理解为一种通过改变程序的数据结构或代码结构来改变程序运行路线的方法)挂接到其他函数上。 我们通过在我们想要定位的函数中插入带有恶意代码的分支来做到这一点。 我们需要挂钩将内存内容发送到 SE 进行检查的函数,以便它发送正确的引导函数而不是我们的恶意代码。
我还选择挂钩到屏幕显示功能,这样我们就可以做各种有趣和令人兴奋的事情。 稍后我会谈到这个漏洞。
使用这两个钩子和__udivsi3作为我们的attack vector(攻击向量,指的是黑客用来攻击电脑或者web服务器的一种方法),我们利用的漏洞有点像这样:
作者利用的漏洞示意图
该方法释放了258字节的payload,所以即使我们将memcpy函数和memset函数放在payload中,我们也不得不优化代码占用的空间。
执行攻击
我们的有效载荷需要两部分:
1.修改发送到安全元件内存内容的代码来欺骗验证过程。
2.键盘生成器和密钥生成后门的攻击,对于我来说,我更倾向于加后门。
我们利用的漏洞是无法骗过安全元件的,那么如何添加后门呢?
Ledger 的安全元件固件包含一个用户界面程序,该程序管理设置并由配置信息进程(生成恢复种子的地方)调用。
如果我们可以修改这个用户界面,我们就可以在配置信息的过程中篡改恢复种子。 这个操作非常简单,因为用户界面是开源的,你可以在Ledger架构设计中修改。
正常情况下,设备会显示“UI不是官方”的警告,细心的用户会注意这个警告。
但是回想一下,我刚才说我们也可以篡改显示控制功能,这样我们就可以轻松隐藏这个警告。
为了更好的说明原理,一些黑客常用的方法我就不介绍了,比如控制设备生成一个看似随机但完全可以预测的恢复种子。 我会讲一些更具体的操作。
如果您熟悉 C,您会注意到我将随机数生成器替换为零熵的随机数生成器。
正如您在介绍性视频中看到的那样,它会生成一个恢复种子,其中丢弃了前 23 个单词(最后一个单词不同,因为它是校验和)。
由于私钥来自recovery seed,只要控制了recovery seed,就控制了比特币硬件钱包生成的所有比特币账户。
如果我们把上面的放在一起,我们会得到下面的攻击,我认为这非常巧妙。
作者使用的攻击方式示意图
当然,检查通过是因为安全元件误认为微控制器运行的是官方固件。 正如我之前提到的,这个过程绝对不需要篡改硬件。
由于黑客控制了受信任的显示和按钮,因此很难从比特币硬件钱包中查找和删除我们的恶意代码。
Ledger 如何修复漏洞
Ledger设计的架构造成了很大的问题。 只有改变架构才能修复这个漏洞。
Ledger 尝试采用多种阻止措施来防止黑客利用此漏洞。
首先,Ledger 优化并重新设计了微控制器的固件。 具体来说,新固件调用的是bootloader中的函数,而不是之前的直接copy。 虽然这样可以防止某些攻击方式,但据我所知,这种变化并不是天衣无缝的,可以攻破单片机的攻击方式有很多。
其次,安全固件要求检查微控制器内存内容的时间到了。 这是为了防止恶意代码使用压缩算法。 它还可以防止计算机通过 USB 接口传送代码。
然而,值得注意的是,安全固件的运行频率为 28MHz,而它所监控的微控制器的运行频率高达 80MHz,这引发了一个问题,即速度较慢的芯片是否可以准确地匹配速度更快的芯片。 防止它执行额外代码的时间,特别是考虑到它们仅通过慢速 UART 进行通信。
Ledger 拒绝给我提供更新的固件,所以我无法验证这些封锁措施是如何解决问题的,但这里有一个重要的问题。
真的可以通过结合使用时序策略和“难以压缩”的固件来确保模型中的安全性吗?
小插图:我与 Ledger 的互动
在计划披露此漏洞之前,我与 ledger 的 CEO 进行了一些交谈。 您可以在此处找到我们通信的存档副本。
在这些评论中,我与 Ledger 的首席执行官讨论了这些攻击是否严重。 Ledger 的评论有些非常主观,有些则非常客观。 我将在下面讨论一些评论。
我首先要说的是,利用这个漏洞需要一系列严酷的、看似不可能的条件。
Saleem(作者本人)报告的漏洞需要物理访问比特币硬件钱包,然后才能设置恢复种子、安装被篡改的微控制器固件、在用户计算机上安装恶意软件以及让用户确认交易。
我很困惑这个评论来自哪里? 从后来与 Ledger 的联系中比特币钱包代付,我得知 CEO 在 Reddit 上发表这些评论时不知道该漏洞。
正如我在文章开头所说的那样,可以通过三种方式来利用此漏洞,而这三种方式都不需要满足那些极其严格的条件。
我之前提到的恶意软件攻击很好地引导了我与 Ledger 首席执行官的对话。
当我们不认为该错误是“重要的安全更新”并决定忽略他的论点时,Saleem 显然很不高兴。
事实上,当您处理严重的安全问题时,您有两种选择:
这是避免引起黑客注意的有效方法,尤其是当 Ledger 现在面临的是一个不开源的产品时。
但这有一个缺点,大多数用户不会更新。 以windows 10为例,有多少人千方百计关闭自动更新,更不用说更新比特币硬件钱包了。
这通常用于开源软件,或者当开发人员发现一个严重的漏洞已经危及系统的安全时。
然而,这样做也有不利之处,因为开发人员对漏洞的早期预警可能会引起黑客的注意。 因此,用户必须第一时间更新,与黑客争分夺秒,抢占“先机”。
Ledger 使用了一种不安全的方法,它结合了这两种方法的缺点。 Ledger专注于开发固件安全更新来修复漏洞,但他们没有提醒用户更新,用户失去了与黑客较量的“先机”。
Ledger 的做法给了黑客足够的时间研究和利用漏洞,从而增加了用户被恶意攻击的风险。
我的担心不无道理,我接触过多个独立的白帽子,他们都是从Ledger发布的固件更新指令中通过逆向工程发现了这个漏洞。
附录:漏洞披露时间表
2017 年 11 月 11 日:我正式向 Ledger 的 CEO 报告了该漏洞,但 Ledger 没有接受我的报告。
2017 年 11 月 14 日:我用篡改的微控制器固件和用户界面编写了供应链攻击代码,并将源代码发送给了 Ledger 的 CEO。
2017 年 12 月 30 日:我通过篡改 Ledger Nano S 比特币硬件钱包的固件破解了 Nano S。
2018 年 3 月 6 日:Ledger 发布了 Nano S 的固件更新。
2018年3月20日:我正式发表这篇文章,披露漏洞。
在撰写本文时,尚未发布 Ledger Blue 的固件更新。