雷锋网编者按:经常主打安全概念的区块链到底是不是安全的?作为多年研究区块链的专家,如何看待频出的安全事件?这背后的原因有哪些?
在 ISC2018上,由众享比特主办的区块链与安全论坛中,来自中科院的博士赵赫就结合近年来众多著名的区块链安全事件来剖析背后的原因。赵赫本人不仅从事区块链的学术研究,同时也深耕行业,目前是中科智链的联合创始人,他当天的演讲是那场分论坛中反响最大的之一,现将其整理,以飨读者。
以下为赵赫(钟隐)在ISC2018区块链与安全论坛上的演讲,雷锋网编辑整理。
首先自我介绍一下,我是来自中科院的一名科研人员,从2013年开始就进入区块链和加密数字货币领域。
直接切入正题。为什么很多人都说区块链技术很安全,属于一种数据安全保护,或者软件系统安全架构的一种技术。
可能许多人都已经听说过了,包括像数据公开透明、记录不可篡改,还有经常说的分布式共识,相信代码,相信数学,相信组织,今天很多老师和同学都已经分享过了。
我们重点还是讲讲它不安全的地方。为什么我们要说区块链还不是很安全?
实际上就是区块链的现状导致的。区块链的现状等于黑客的提款机,很容易变现,前面的老师也说过,基本跟钱是一回事,而且很难追踪。我们把区块链里面的各种攻击,各种漏洞的形态也分成了三个大类,与大家也探讨一下,分享一下,最后再给出我们的建议或者最佳实践的一些内容。
首先,第一个是应用层的攻击,主要是讲钱包合乎智能合约,像这两个范围内的攻击手段。
第二个是和区块链相关的交易所和在线服务提供商。
第三种是特别针对于区块链本身系统里面的攻击手段。比如说共识算法、加密学的基础、P2P网络等等内容。
第一部分,应用侧的攻击,这个可能是爆发最多的,对于普通用户来说是最容易体会到,有一种很强烈的威胁感存在。这个币存在哪好呢?有可能存着存着就丢了。
这是以太坊非常流行的一个钱包,攻击的方式非常多,比如说被域名劫持,因为它是一个在线的情况,在网站上访问了之后,输入私钥就可以将以太币或者以太坊上面的Token都可以收发,很方便,但是黑客也就抓住了这个方便,把安全也就很容易把币转到他手里。比如钓鱼事件,现在有统计,统计了5000多种攻击,同时有1000多种都是针对于在线钱包的攻击。
第二种类型也是最古老的攻击手段,就是本地钱包地址替换的情况。大家可能听说过2014年好莱坞艳照门的事件,黑客把很多好莱坞的私密照片发到了网上,最后留了一个地址,希望大家给他打赏,结果这个地方出了一个问题,很多人把自己的地址给换了,最后没得到多少币。对于用户来说,我们这里看到代码逻辑非常简单,直接把内存里面监测到,把钱包直接给换掉。
最新的360安全卫士已经增加了预警功能,这个值得点赞,如果发现钱包的地址被换了会提示,黑客会不停的收到币。比较普遍的方式是针对手机邮箱的,是基于社会工程学的一种东西,2016年年底的时候,国内的区块链大V在手机上被黑了,当时不仅自己损失了一大笔钱,而且造成了市场剧烈的振荡。智能合约的攻击事件我就不多说了。
我们再讲讲第二部分,系统层面的攻击。比如交易所的攻破,这个听说的也比较多,怎么比特币又被黑了,比特币又被偷了,比特币本身没错,是交易所被黑了。第二种比较大的类型是监守自盗,内鬼做案的事情,国内也出现过,应该是2014年的时候,如果进入这个圈子比较早的同学应该知道有一个比特币存钱罐,存一个比特币一年给你1.1个还是1.2个,过了一段时间存了几千个币之后跑了。第三种是针对于区块链底层BUG被利用的攻击。门头沟的盗币,监守自盗,也有一小部分被人利用了比特币交易延展性的攻击,偷了几千个比特币。
我们再看第二类,针对非交易所的,是一些在线服务商的安全事故,这样类型的也非常多。在去年的一个ICO的项目被攻击的原理是,服务器上有一个网站,很多程序员都知道,结果没有打好补丁,被人找到了一个漏洞,上传了木马,拿到服务器权限之后,把里面的币全都给转走了。
我想多说一说这一块。很多人觉得区块链是代码写好就OK了,人的因素攻击还是蛮严重的隐患。BTP是硅谷的一个名企,属于支付商。如果你在网上用比特币买东西,比如在国外海淘付款,有可能你用的支付就是他们提供的。他们的首席财政官有一天收到一个邮件,这个邮件是黑客给他发的,他当然不知道。他说我们是一个币圈人或者链圈的一个媒体,需要提供一个答案,他就真的点了邮件里面的链接,没有这么简单,点了链接之后让他输一个帐号密码。输进去之后黑客拿到了邮箱的登陆帐号。拿到了邮箱登陆帐号,黑客很鸡贼,先去学习,先学习邮箱里的所有软件,发邮件是什么样的内容,有什么规定,掌握完了之后黑客模仿CFO的身份给CEO发了一个邮件,我们现在有一个大客户,用什么缘故要转100个比特币,我已经检查过了没有什么问题,请您批示一下。没有多想就给他批准了,黑客拿到这个币之后,一而再在二三偷了三次,偷了一共5个亿。这个是针对人的攻击。最后BTP找保险公司索赔了,但是没有获得赔偿。
第三种是针对云平台或者云服务器的攻击,这也是早前发生过的一个案例。国外有一个云平台,类似阿里云、腾讯云,当时国际上也有很多矿池的云平台服务,当时它的管理权限被人获取了,有好几个比较早的创业企业被偷了2万多个比特币。
我们重点讲一讲第三部分,很多人觉得这个技术像比特币,很多年没有出过大的安全问题,所以这个数字货币是非常可信的。其实这个数字不是特别严谨,不是没有出现过,而且出现过不仅一次,各种因素化险为夷了。第一个案例,德国的一个码农,发现比特币的脚本程序里面有一处潜在的破坏力极强的BUG,这个BUG基本内容是,右上角是原始代码的逻辑,case,黑客利用BUG可以调用语句,使得可以用之前钱包里面的比特币。如果我能花你钱包里的钱,这个钱还值钱吗?
这个BUG最早的时候是没有被公开的,这个程序员发了一个邮件给比特币的创始人,在邮件里讲,对于不知道BUG的人,千万别讲BUG的名字,如果你是很熟悉的人,你一听就知道到底怎么调用这个BUG,你可以想想当时的影响到底有多大。
这个BUG没有被公开,悄悄被修复。悄悄的来,悄悄的我又走了,这个BUG后面的比特币升级其它的内容,就是常规性的内容更新的时候,把问题给悄悄的修复了,修复完之后在所有的节点,大部分都更新了之后才被公之于众。所以这个程序员也是比特币或者区块链历史上最鲜为人知的大救星,他第一次救了比特币。也有一种说法,因为他自己也持有比较多的比特币,他不想自己的币贬值,所以他写了这个邮件。这也是加密经济学里面的角度考虑。
比特币天量刷币漏洞,比特币诞生半年到一年的时候,仅过了一个月出现了第二个BUG,是美国的一个码农程序员(Jeff),他发现比特币的区块链里面7400多个区块有一个很异常的交易,有三个收款地址,有两个收了900多亿比特币,一共是1800多亿个。知道比特币的同学都知道,在求和的这个逻辑里面,有一个求和溢出,当时是没有被处理的。发现这个BUG之后,这个时候比特币已经在运营当中了,而且是比较严重的BUG,结果社区表现出来比较强的能力。开发者出了修复BUG的版本之后,号召大家赶紧在Node的版本上去挖矿,哪一个链最长,才是最终被认可的链,结果带有补丁版本的区块链的程度最后赶上并且超越了原来有BUG的这个链,最终才化险为夷。
说完核心代码的一些漏洞之后,我们来聊一聊共识机制的问题。先讲一个,大家可能都知道,51%攻击的问题,现在发现它是现实的存在,原来以为是理论的存在。我们提出一种方案,他可以避免双花。通过什么呢?通过PUW,是有前提的。恶意用户不能超过50%。比特币的历史上曾经有过这种担忧,2014年的时候有一个矿池,不停的增长,几乎已经达到甚至要超过一半了,结果就说大家别在我这儿挖了,我这儿已经变成一个中心化的矿池了,我要提高手续费了,后面慢慢也就没有出现51%攻击的隐患。
现在有很多诟病说中国的几家矿池联合起来也是可以完成51%攻击的,这也是理论上的可能。但是比特币没有真正被51%攻击成功过。有一个比方,为什么说安全没有被51%攻击,因为它的代价太大了,如果对它产生足够的挑战。我以前看了一个数据,需要全国Top500的怪兽级的超散,包括中国的神威、美国的泰坦集合在一起才可能发起有一定威胁性的攻击。现在差距可能更大了。
51%攻击的风险在于其它的币种,而不是比特币,这种攻击是史诗级的,或者是毁灭级的攻击。大部分都是一些所谓的空气币或者是山寨币。BitcoinGold、Zencash、Vnrge,这些币种都比较小,没有特别强的保护措施,很容易被人通过租用云端算力,租用大量算力冲进来到这个小比重里面去挖矿,超过原始整个网络的算力,一下就造成了51%攻击双花。我们预计未来可能会越来越多。也有学者做过研究,ETC采用的共识算法和挖矿的机制和以太币是完全一样的。巴西的学者研究出来,可能5000多万的攻击成本就有可能造成10个亿的收益。
刚才讲过门头沟被盗其实有一部分被交易延展性比特币的BUG给坑了,根据这个基础协议上的,我没确认吗?黑客这部分的交易被确认了,我就把这个币再重发一遍,就是发币过程有问题。造成的影响还是挺大的,比特币的协议升级已经把这个问题解决掉了。第二个是日蚀攻击,也是很常见的一个手段,在比特币和以太坊的节点里都被找出了BUG,都被人修复了,原理也是通俗易懂的,节点在连上区块链网络的时候需要有很多连接来看,比如说现在的区块高度是多少,现在网上哪些交易已经被确认了,相关的交易有没有被确认,交易的是什么,你连接的节点都是黑客控制的节点,他可以告诉你某一个交易的时间根本就没有,现在的高度是某一个区块高度,其实你根本就不是这个高度,浪费了你的算力,告诉你的时间冲也是不对的等等,这个问题就在于,如果说我们写新的系统的时候,比特币和以太坊都出过这种BUG。
下面讲一下漏洞算法的问题。这个漏洞发生过程也很有意思。2017年5月份,IOTA是集DOT做的一个区块链系统,请MIT的研究组来审计代码,本来是一个好事,MIT的研究者就做了检查,两个月之后他们发现确实好,这个里面还有问题,我一开始也上当了,IOTA创始人我们是Curl被骗了,是一个加密(哈西)值的漏洞。我可以构造两个不一样的原始数据,本来(哈西)要避免的事情,在这个里面竟然有这样一个问题,显而易见,导致数字签名的安全性是无法保障的。9月份MIT,因为这个BUG已经修复了,就公布了漏洞审查的报告,没成想出现了戏剧性的一幕,IOTA马上表示强烈的抗议,MIT违反学术道德,我们是故意把它放在你们的,我放在你们是防止别人抄我们的代码。这个也是很有意思的,区块链漏洞系统里面的历史事件。
第二个是共识机制里面的攻击,这个叫IOTA缠结缝合攻击,缠结是区块链的一个名词,今年有一个科幻电影《湮灭》,IOTA经历了这样的事情,黑客造出来的各种垃圾交易,并且在这两个链之间不停的用链串联出来。这个造成什么结果呢?IOTA当时的共识算法是不需要交手续费的,交易的确认是需要打包前面两个交易,就造成了普通的用户去确认的时候,大家基本上都在确认大量的垃圾交易,黑客也在确认垃圾交易,这样造成整个网络是无法使用很长一段时间,整个系统等于是不可用了。后面通过共识机制的升级,才解决了这个问题。
其实我们聊了很多,还有大量的,今天时间关系没有办法和大家一起分享讨论。
我们再回到区块链的安全主题上来。区块链到底是不是重新定义安全,我们觉得区块链技术并不是安全的一个万能钥,区块链系统里面仍然会继承现有的互联网安全、软件安全等问题,同时还引用了新的攻击向量。
区块链确实在有些方面是显著提高安全性的。比如这里提出了两点,容忍部分节点做,但是系统还是不影响的。还有一个没列出来的,能够抗审查,在微博、微信上的东西可能被删,存在这个上面的东西是没法儿被删的。要达成这样的安全性显著提升的目标,有一个前提,在它的设计研发和运营之中还要要对问题充分的重视,做好防范。我们觉得现有的安全技术和区块链技术是相辅相成,良性循环的过程。区块链技术在很多方面补齐了现有安全技术不足的地方,但是现有安全技术又反过来可以促进区块链的技术提升,两个是相互促进良性循环的关系。
第一,如果你是区块链资产的持有者(用户),私钥还是权利,以前你的法币的资产,或者什么东西丢了,去警察局报个案,去银行冻结谁动了你银行的卡好。这个是币圈或者老人说的一句话,如果说你买了币,第一时间把它提出来不要放到交易所,交易所里面的币都是欠条,你并不真正拥有这些币,它只是一个符号。不要重复使用密码,尽量使用自动生成的密码,很多人就是几位数的密码,最好都通过软件自动生成它,开启短信认证,这个是比短信验证码更安全的机制,学会识别各种推广链接,百度的,谷歌的,仔细阅读安全提示的相关内容,大额资产建议大家是离线存储,或者是考虑硬件钱包,当然硬件钱包也不一定安全,可能是比直接在电脑上直接存着被偷的概率低一些,最好是硬件存储。我的一个老朋友,是一个老兵,把私钥存到记事本里面,传到云盘上去,在本地把文件就删了,结果把删除的这一步步骤同步到云盘上去了,这样做也是非常危险的。保管好邮箱帐号是显而易见的。最后建议大家考虑优先使用苹果手机,我也很喜欢用安卓,只不过因为这些年安卓的碎片化是比较严重的,除了刚刚发布的第一年安全更新比较频繁,比较快,稍微老一点的安全更新很多做的是不到位的,不仅仅钱包有风险,短信验证码,包括两步验证的APP都有可能会被窃取里面的信息。
如果您是一位区块链项目的开发者,几位前辈都讲过这个问题,最好是能自己去看看里面的代码逻辑,里面到底是不是真的,不要信某个牛人或者某个泰斗,在数字货币或者区块链的这个领域里面蛮有反叛性精神的,没有所谓的权威在这里面,大家还是自己去看是最保险的方式。用去中心化的思维,没有以前的服务器客户端的架构,没有BS架构,CS架构了,各种攻击都可能在里面出现,你要考虑这个方面,不要去尝试自己设计一种加密算法,这是一个很大的坑。好像自己天不知道地不知道,只有我自己安全。
谨慎对待慈基数或者时间戳这样的变量和数值,这样的在区块链的编程也是非常难的。我也在思考这个问题,让用户参与进来提供周边的环境信号,包括麦克风或者传感器的数据,混合本地的随机数据,这样也许会安全一点。时间戳也是一样的,重视安全用例的编写,一定要重视你写的每一个Library,哪怕是别人写的智能合约里面有BUG,您这个系统仍然是可能会被找到漏洞,会被击溃的。如果您的工作是基于比特币、以太坊的区块链去做的,不用重复发明文字,一定要同步去更新像比特币、以太坊攻击的安全代码,一般能够比较快的及时响应里面的安全问题,如果你的工作是基于他们的工作基础上来做,你又没有去跟进,等于是告诉黑客,比特币和以太坊等于是告诉黑客,告诫自己智能合约很难写,很难写的好写的安全,一定要谨小慎微,补齐密码学的基础知识。您开发的系统有多安全,这个取决于您。
第三个类别,如果您是一位区块链相关产品的创业者,如果你以前不是做这一块的,现在来做这一块,我们的建议是,如果您的项目还没有开始,还是问一问自己,是不是一定要用区块链。第二个,如果项目已经开始了,可以重新从安全的角度审查一下各个方面。应该充分了解,在区块链领域特别是这样的,要投入大量的人力、物力、财力是看不到的,一旦出现事故之后是影响很大的,追悔莫及。针对于自己,针对于关键团队成员,甭管C什么O,这里面一个关键人物出了问题,可能也会造成影响。非区块链服务系统的漏洞,这也是容易忽视的一个问题,服务器上放上您的代码,操作系统的漏洞就不用说了,他的问题也会导致您这个系统的问题。划拨资金池,最好还是有一个单独的资金,这样更多的放在社区里面会更有动机去介入进来,他会觉得这个项目是比较友好的,他也乐意去帮助你,聘任顾问,来审计第三方产品。建议使用两组人员,两种不同的语言来进行开发,把协议约定好。以太坊采用了这种路线,所以避免了好几次大的问题。同样也是针对供应链,开源才是最安全的,但是千万别等到明天上线今天宣布开源,上线的时候是开源产品,这样其实是最危险的,今年有几个数字货币就出现过这个问题,官方的钱包出现,第一天就找到了BUG。最后,做好思想准备,您这个系统一定会有漏洞,有漏洞就一定会有攻破的,至少有一个安全专员,要有一个应急预案。
以上演讲来自ISC2018区块链与安全论坛,雷锋网整理。