45000ETH不翼而飞,以太坊大盗究竟是如何做到的?就在上周,美国知名的安全咨询公司Independent Security Evaluators(以下简称ISE)发布了一份关于以太坊区块链私钥的相关报告。报告中指出,一个(或许是一群)区块链大盗通过疑似“猜测”弱私钥的方法成功窃取了多达45000个以太币。尽管以太坊中已经建立了逾700个常常被许多人使用的弱私钥、尽管“猜测”这样的方式听起来似是天方夜谭,但摆在眼前的事实却是这些总价值超过700万美元的以太币的确不翼而飞了。
针对这一事件,ISE的高级安全分析师Adrian Bednarek向多家媒体发表了声明与解释,但这些被盗事件仍然没有得到根源性的解决。究竟这个大盗是通过技术手段跨越了加密的层层围墙,还是另寻门路来枉法取私?让我们来一探缘由。
01、趁“弱”打劫
ISE的团队只是偶然间发现了这个大盗的存在,彼时,他们正在为一个企业用户进行安全评估,该用户计划使用集成密钥生成算法来实现自己的钱包。而正是在这个安全评估的过程中,他们发现了其中端倪并为之展开研究。
在以太坊、比特币、乃至其他任何一个支持ECDSA(椭圆曲线数字签名算法)的主要区块链中,私钥皆由256位二进制的数字构成。这意味着单纯靠猜测去获得随机生成的以太坊私钥的概率为1/2256(这个分母的数字约等于宇宙中所包含原子的数量),其难度丝毫不亚于在一片广袤的沙漠中找出两粒相同的沙子。
但当Bednarek观察以太坊区块链时,他发现一些人将他们的以太币储存在更简单、更容易被猜测的钥匙上。这可能是由于代码编码错误进而导致密钥仅按预期长度的一小部分切断私钥,又或者是源于让没有经验的用户自行选择私钥,甚至还包含了恶意代码破坏以太坊钱包的随机数生成器(使钱包的开发人员很容易猜测密钥)这样的原因。
为了提高工作的可行性,Bednarek和他的团队在研究期间,将256位的私钥空间缩小划分为了8个32位的子区域。毕竟,在更大的区间范围内强制进行私钥的统计工作是不太现实的。
最终,他们的团队花费了整整一天的时间去扫描这8个32位的子区域,并发现这些区域总共包含有340亿个较弱的私钥。
但令人匪夷所思的是,他们还在这340亿个弱私钥中找到了732个可以被猜测的私钥,其中甚至不乏一些仅包含一位数字1的这种可以被称之为安全下限的私钥。
(用256位代码写入就是,0x0000000000000000000000000000000000000000000000000000000000000001)
这无疑是一个危险的信号。我们知道,私钥与银行账户不同,它既是用户的ID也是用户的密码。因此,当两个人使用相同的密码去建立一个BrainWallet(即需要密码作为生成私钥的一部分的钱包)时,这两个人就会拥有同一个的钱包。而使用上述所说的可以被猜测的私钥,无异于令账号财产门户大开。
事实上,被找到的这732个可以猜测的私钥共涉及49060笔交易,它们也曾一度拥有余额,但最终都被清空。尽管这些交易当中包含了一部分合法的转账,但也毫无疑问囊括了许多笔盗窃性质的交易,因为其中不少钱包的资金都被转入了某个特定的地址。
有12个地址似乎是被同一个窃贼洗劫一空,这些资金被转移至了同一个账户,而这个账户现在拥有多达45000个以太币,也就是我们在文章开头所提到的那位神秘的大盗。
02、扫描梳理,然后洗劫一空
Bednarek曾尝试将价值1美元的货币放进一个盗贼所知道的弱私钥当中,而这1美元在短短的几秒钟之内便消失了,更可怕的是,这笔资金最终的去向与先前这个私钥中被盗的资金的去向并不是同一个账户。
随后他们又试着将同样数额的资金放入一个盗贼先前并不知晓的弱私钥当中,其结果竟也是在数秒内就被清空,而这次被转移到的账户亦与刚才那次不同。
而当Bednarek在以太坊区块链中查看这些私钥的待处理交易时,他发现还有许多其它的盗贼试图窃取这笔资金,但因差以数毫秒的速度而未能成功。
由此我们可以推断正在进行这种盗窃行为的盗贼并不止一个,而且他们已经建立了一些节点或是预生成的密钥列,这些节点或密钥列能够自动地扫描区块链网络中的弱私钥并从中迅速筛选出可以被猜测的私钥进而将他们洗劫干净。
对此,Bednarek表示,“倘若这是一个手动的东西,那么这些交易的处理需要花上不少的时间。但事实却是当我们将资金一发出,我们再进入区块链浏览器时就能看到这笔资金被转移,整个过程仅仅只有几秒钟。所以,显然这些盗贼使用的是一个区块链节点,它是于某个地方设置的交易网络的一部分,一旦它扫描到交易中带有它所记录过得私钥或是可以被猜测的私钥,它就会发出转移资金的请求。”
针对这位已经盗取了45000以太币的以太坊大盗,ISE的工作人员还查看了他的以太坊账本,发现其在过去三年里已从数千个地址中成功窃取到了以太币,而在以太坊价值的高峰期时,这个大盗所售出的“战利品”总价值甚至达到了数千万美元。
从他的钱包地址的相关评论中,我们也能看到大量的负面言论,字里行间无不显露出这个家伙的斑斑劣迹。其中一条评论据说还是由ETH主要的钱包提供商之一MyEtherWallet(MEW)所提交的。遗憾的是,尽管这些盗窃性质的交易都可以被追溯,但是由于区块链交易的匿名保护性,相关技术人员并没能追踪到以太坊大盗的真实身份。
03、分析团队的道德困境
在安全报告中,安全分析师对以太坊大盗的“欺诈手段”进行了总结:“第一,这个窃贼时刻都在盯着那些弱私钥寻找下手机会。第二,他也密切关注着基于密码的钱包和配置错误的RPC(远程过程调用)并伺机攻击他们。所以用户们不应该暴露自己的Ethereum节点的RPC,但总有人有时会这样做,如果用户没能设置一个可靠的密码,那么基本上与这个用户的节点相关联的默认钱包就会被窃贼光顾。”
ISE的安全分析师还特意提到了他们在进行这次研究时所陷入的道德困境——如果他们发现了一个内含有大量资金但目前尚未被盗取的弱私钥,那他们应该怎么办?
如果把资金原封不动的留在那里,那么他们心知肚明这些资金背后是一个容易被猜测到的私钥,也就意味着它在将来很有可能会被窃贼盗取。这对于整个团队来说无疑是一种心理负担,因为他们知道这其中的盗取风险所以他们内心里认为自己有责任去保护这笔资产、去告知资产持有者危险所在。可是他们又应该通知谁呢?并没有一种简单的方法去帮助他们识别这些弱私钥的持有者到底是谁。
他们也可以选择将这些资金暂时转移到自己的账下以确保它们不会落入窃贼手里,可是也没有人能帮助他们证明自己是在保护这些资产而不是也干着和那些窃贼相同的勾当。这种做法背后涉及到太多法律和道德风险。
04、安全建议
从报告中我们可以看出,私钥遭到攻击一般是因为两个因素:一是负责生成私钥的钱包或者软件存在编码错误,二是密码持有者(用户自己)倾向于使用一些弱密码来获得相同的私钥(甚至不乏留空的现象出现)。
但从性质上来讲,这些因素最终都只是导向了弱私钥的使用以及由此所导致的盗窃的证据。它并不能帮助技术人员找到弱私钥产生的问题根源以及那些代码出错的钱包和恶意钱包。
所以我们不能断言究竟哪个钱包该为这些弱私钥被盗负责,即便我们定位到了这样一个产生弱私钥的钱包,也存在着用户自己的错误输入、钱包尚处于早期版本或者是某个开发人员的恶意行为等不能直接归咎于钱包本身的原因。
因此所谓的安全建议我们也只能从用户的主观角度出发:一是尽可能地选择普及性更高、口碑更好的钱包,二是更多地去使用冷钱包。而从开发者的角度,我们也只能提倡他们为钱包设置私钥复杂度的最低要求。如果能做到这一点,那么即使从最悲观的角度来讲,我们至少也能做到让那些窃贼偷起来没那么容易。