4月14日,在厦门举办了第七期【Chainge】技术沙龙,邀请到了火币CTO程显峰、比特派合伙人王超、慢雾安全团队海贼王、Keywolf、 imToken首席安全官Blue、币派CEO胡园泉,以“区块链技术的安全隐患”为话题,对区块链技术中存在的风险和安全隐患进行了深入讨论。
这是慢雾科技安全团队首次公开对外展示,提出了 “区块链生态的安全就是一切”。慢雾科技专注于区块链生态安全,3月20日披露的以太坊生态缺陷导致的一起亿级代币盗窃大案在行业引起高度关注。区块链生态安全防护,刻不容缓。在活动现场,慢雾科技以视频的方式,复现了 The DAO事件整个过程。同时展示了其自主研发的墨子(MOOZ)系统对以当前太坊网络安全的实时监测情况。针对以太坊生态安全缺陷,慢雾科技提出了 6大安全防御建议。
以下为嘉宾演讲内容,做了不改变原意的整理:
非常荣幸能够代表慢雾科技,我的分享主题是《生态安全缺陷之以太坊黑色情人节》。今天是4月14号,也是黑色情人节,感谢活动主办方的用心。
我们3月20号对外公布了“以太坊黑色情人节”,相信大家都有听说,但是对于慢雾科技,大家始终是有一个很大的问号。我今天在这里就正式的对外介绍一下慢雾科技。
慢雾科技致力于做区块链生态安全的专家,我们的主营业务有安全审计,包括矿池、交易所、钱包以及智能合约的审计。其次是安全顾问,针对各种区块链产品的实际情况,提供相应的服务。再次是防御部署,因地制宜,为大家的安全保驾护航。 最后是地下黑客风向标追踪,对恶意盗币地址的实时追踪和收集。针对这块,我们做了一个恶意地址库。
在这里介绍一下我的小伙伴——启富。他会配合我做相关视频以及我们内部监控平台的的展示。我是海贼王,我们是慢雾科技的安全研究员,针对区块链生态安全研究,我们也是以太坊黑色情人节的披露者。
今天要讲的主题是以太坊黑色情人节,这个话题绕不开“The DAO”事件,今天在这里我们会通过视频演示,复现The DAO事件的整个盗币过程。The DAO事件是以太坊历史上第一个重大安全事件,价值6000多万美金的以太坊在这次事件中丢失,这个事件还导致了一个非常恶劣的后果,就是以太坊分叉。
分叉包括硬分叉和软分叉。软分叉用一句话概括就是不管矿工是否愿意升级,始终是在一条链上,需要考虑旧节点接受新节点产生的交易和区块,新节点产生的交易和区块不兼容旧版本。硬分叉是所有节点都必须升级(不升级就形成两条链),不需要考虑旧节点是否接受新节点产生的交易和区块。
“Show me the code,no code no BB”,我是程序员出身,这段代码来源于网络,是模拟The DAO事件的第一个智能合约。
代码有很多问题,第一个问题是没有加以太坊版本的限制。还有一个问题出现在合约的判断语句“if(msg.sender.call.value……”以及“userBalances[msg.sender]=0”这两部分。
第二个合约是攻击合约,这个合约里有一个亮点就是while循环,attackCount的初始化是2,会循环两次。
下面由我的小伙伴启富给大家演示一下The DAO攻击事件。(视频展示)
我举个简单例子解释一下攻击过程。通过刚才的演示我们发现,银行账户里面原来有100块钱,这个人又往银行账户存了10块钱,账户总资金变成了110块钱。接着他用ATM机取款,连续按了两次“取款”键,竟然神奇地取出来200块钱。在现实中,肯定不会发生这种现象。但是在智能合约里面会出现这种问题,怎么造成的呢?
这个是 The DAO的源码,这两个箭头的位置大家留意一下,后续会讲到。
The DAO 事件出现以后,The DAO官方在GitHub提供了修复方案。在这里,他把paidout这部分移动到了上面,也就是在你提款之前先判断余额,从而不会出现提款额多于余额的情况。
针对The DAO事件背后所隐藏的智能合约漏洞问题,我们在提出三点建议:
第一,尽量避免不可信的外部调用。
第二,转账。转账有三种方法可以实现:someAddress.transfer()、someAddress.send()、someAddress.call.value()() 。前两种是安全的,第三种方法是不安全的。
举个例子,比如一对夫妻去超市买瓶矿泉水,需要支付两块钱。男士身上只有1块9,扫码的时候余额不足扣款失败。女士扫了一下,钱包1万块钱的余额被全部转走。这是因为前两种方法会有gas限制,第三种方法在调用的时候,合约里面的所有的余额都可以被攻击者转走。
第三,回退函数(Fallback)。回退函数是合约里的特殊函数:没有名字、不能有参数、没有返回值、有且仅有一个。回退函数被触发的条件是:没有匹配到函数签名、调用没有带任何数据时被自动调用、send() 成功后。
通过以上的The DAO案例,我们可以总结出来:区块链生态的安全就是一切。为什么这样说?其实不管是交易所还是项目方,大家在网上操作的都是真金白银。
下面进入以太坊黑色情人节环节,这次事件发生于2016年2月14号。
上图显示的是以太坊的节点。总数有15000多个,分布在世界各个国家。当我们扫描全球所有的IPV4的网络,发现有那么多问题节点,我们是怎样判断的?接下来我们会把整个发现的过程,以及安全防御建议分享给大家。
其实在一年前,慢雾科技就已经在接触和研究区块链安全,我们在全球各个洲都会有自己的蜜罐服务器,监测对以太坊的攻击行为。通过分析攻击代码,我们发现这些行为都是一些代码自动化的攻击和调用,时间和频率是非常高的,可见攻击者已经用了最新的技术自动化从互联网上“捡钱”。
从蜜罐监控看,有3个命令的调用频率是非常高的:net_version、eth_accounts、eth_getBalance。
net_version是判断这个网络到底是主网还是测试网。因为主网节点钱包节点的资产才是真的钱。
我们扫描出来的结果是,有3000多个以太坊主网节点存在问题,这是相当可怕的,里面有多少钱不得而知。
eth_accounts是查看当前该区块链中共有几个账号,以及每个账号的公钥地址。我们扫描全球的以太坊网络,统计到大概有1000万个钱包地址是直接暴露在公网上的。也就是说我只要等待到合适的时机,这些钱包里的钱,就可以随时转走。
eth_getBalance是查看钱包余额。
通过盗币的地址以及结合其他方面的数据,我们统计出,到目前为止有46000多个以太坊被盗,按照最新价格约合2000万美金。
尽管以太坊黑色情人节事件被披露出来后,我们团队面临诸多质疑,我们还是觉得必须要披露出来,否则后续问题会越来越严重,对整个生态来说都是非常大的损失。
为什么会发生?其实问题主要点就是unlockAccount(解锁钱包)这个方法,在这种情况的时候,其实我们会把自己的私钥,导入到钱包里面来。但是以太坊在设计的时候,默认是300秒,也就是说五分钟的时间内,你只要转账过一次,其他人也可以随时从你的账户转账。其他敏感的细节这里就不展开了。
这是我们公开爆料以太坊网黑色情人节之后,用全球扫描引擎墨子(MOOZ)对以太坊问题节点的统计。我们也做了一个页面,展示了以太坊黑色情人节被盗币的实时情况。
这里有请我的小伙伴,为我们展示一下慢雾科技的监控平台对被盗以太坊数量及地址的实时监控。
大家好,我是启富。我们在披露以太坊黑色情人节之后,我们觉得有必要持续追踪这起盗币事件,所以我们开发了一个程序对关注的几个攻击者账户实时采集。
这是我们内部的监控平台,它会实时统计有多少币被盗,涉及的市值以及被盗钱包数。我们对盗币攻击行为分析,发现攻击者不管你的钱包有多少资产,只要有余额,都会把你的资产转走。排名第一的攻击者地址是0×95开头,总共发起了4000余次攻击,43000个以太坊的80%都是由这个攻击者账号盗取……
再次感谢我的小伙伴。
我们继续,在这里做一个思考,为什么以太坊会有这个问题,而比特币到目前为止还没有发现类似问题?其实,这主要跟以太坊和比特币的生态相关。
因为以太坊支持矿池、钱包、web3、 Smart Contract、Dapp,为了整个生态的方便,减少了认证和鉴权环节,可以直接调用智能合约。BTC生态包含矿池、钱包、Lightning Network,有认证环节,所以在这方面相对安全。
不过,BTC同样存在安全问题,这是BTC开发文档上的一串代码:
h = BitcoinRPC.new
(‘http://user:[email protected]:8332′)
在这里,HTTP并不安全,因为我只要抓包获得这个地址,就可以进行下一步的操作。
针对以太坊安全漏洞事件,我们提出了以下防御建议:
1. 更改默认的 RPC API 端口,配置方法如:–rpcport 8377 或 –wsport 8378
2. 更改 RPC API 监听地址为内网,配置方法如:–rpcaddr 192.168.0.100 或 –wsaddr 192.168.0.100
3. 配置 iptables 限制对 RPC API 端口的访问,举例:只允许 192.168.0.101 访问 8545 端口:
iptables -A INPUT -s 192.168.0.101 -p TCP –dport 8545 -j ACCEPT
iptables -A INPUT -p TCP –dport 8545 -j DROP
4. 账户信息(keystore)不要存放在节点上
5. 任何转账均用 web3 的 sendTransaction 和 sendRawTransaction 发送私钥签名过的 transaction
6. 私钥物理隔离(如冷钱包、手工抄写)或者高强度加密存储并保障密钥的安全
我们有自己的蜜罐服务器,也有通过其他生态合作伙伴给我们提供的IP,上图是一部分top50攻击者的IP。
最后,特别感谢我们的生态合作伙伴,他们对于我们披露这次事件做了非常大的帮助,我们也希望更多伙伴加入我们的安全生态。
谢谢大家。