DRC积极应对智能合约账户遭受黑客攻击事件

本文内容比原文略微变更:

https://mp.weixin.qq.com/s/kTunEa9AdO3mTlBp0Np5-g

3月15日,DRC智能合约账户遭受黑客攻击,导致账户内的DRC Token被盗。DRC开发人员及时对该黑客钱包地址中的DRC Token进行了锁定,这部分代币将无法被转出。所有DRC Token的持有者不会因此次事件而遭受经济损失。

在全面分析本次黑客攻击事件后,决定采取封禁原有代币及合约,重新部署新代币及智能合约。此前接收过DRC Token的用户(3,543 addresses),DRC将在部署新的代币合约后,按原区块链浏览器上的地址和代币数重新打币。原接收的DRC Token销毁后将作废。

在分析黑客行为的过程中,发现该黑客在过去一年时间内对多个区块链项目进行持续的偷盗,累计金额达2000万美金。尽管有多位受害曾经通过不同媒体发布相关报道,但黑客行动仍在继续。因此在此提醒区块链项目的开发团队能够引以为鉴,将代码合约安全放在首位。

漏洞解析

此次遭遇的安全漏洞,实际上在早在2015年Ethereum 团队就给出过安全提醒,一年前My Ether Wallet的Founder也在etherscan的这个黑客地址下留言解释过,并给出了建议。

https://blog.ethereum.org/2015/08/29/security-alert-insecurely-configured-geth-can-make-funds-remotely-accessible/

下面这个链接是以太坊官方reddit论坛上关于这个漏洞产生的实际问题的讨论:

https://www.reddit.com/r/ethereum/comments/4z0mvi/ethereum_nodes_with_insecure_rpc_settings_are/

根据以太坊官方论坛讨论的内容以及我们对后台log的分析,这个安全漏洞的主要原理如下:

  1. 使用geth或者parity客户端在本机创建一个全节点来同步以太坊区块,同时提供HTTP RPC API 方便其他地方的机器通过geth或者parity客户端访问,这样其他地方的geth或者parity不用重复的在本地同步区块。通常HTTP RPC API的访问是通过首先连接 xxx.xxx.xxx.xxx:8545 这个URL,然后就能访问诸如“eth_accounts”,”eth_sendTransaction”等API了。 8545是geth开启RPC服务的默认端口,xxx.xxx.xxx.xxx是这个全节点的可被外网访问的IP地址。

2.这样做有安全漏洞,原因是黑客也可以连接这个服务,调用”eth_xxxxx”等API。举例来说,他会做下面三步操作:

1)首先call eth_getBlockByNumber(“0x00”, false),因为本机同步了所有区块,所以这个调用可以得到本地同步的区块高度。

2)接下来调用eth_accounts API,可以通过这个API得到当前本机节点导入的所有以太坊账户的地址列表。

3) 然后通过所有账户地址对外发送eth_sendTransaction 调用,这个API调用可以发送该账户地址下的所有数字资产到一个指定的以太坊地址。

以上这三步可以不停的重复,几乎可以达到每秒调用一次,这样就有可能正好碰上本机用户对自己的钱包地址执行unlockAccount方法,这个方法将使用自己的密码从本地的keystore里获取private key对要发起的交易进行签名,从而成功交易。而unlock状态会保持一个短暂的时间,也就是在这个短暂的时间段内,用户不用再次输入密码为交易签名,在这个时间段内所有发起的交易都可以自动签名,因此,在这个时间段内如果恰好黑客用这个地址所发起的eth_sendTransaction调用被执行到,那么黑客就成功的获取用户的签名权限并将该钱包地址上的数字资产转走。而且一旦交易成功,黑客应该能通过某种方式获得整个签名加密的信息,从而完全控制这个账户,只要这个账户仍然在geth上连接,黑客就能一直用这个账户地址发起交易并签名成功,直到这个账户退出geth客户端。

这就是通过HTTP RPC API发动黑客攻击的具体过程。如果要想避免这种行为带来的危害,首先,不要用默认端口(8545)开启HTTP RPC服务,也不要对Internet全网开放。但即使这样做了,黑客仍然有可能通过别的方法获取到端口或者IP地址成功的连上RPC服务,那么这就要求全节点使用者在对外提供HTTP RPC API的时候,一定不能使用unlockAccount方法来解锁本地的账户地址,而要用其他方式进行签名交易,比如每次通过调用web3接口的函数发起交易的时候,使用密码文件作为参数在函数调用语句中签名,或调用web3提供的Sign函数接口去签名交易。unlockAccount方法只能在测试环境或者是不提供HTTP RPC API服务的主机上使用。

这个漏洞对geth提供的WS API应该也是有效的,因为WS服务也可以对外公开。

另外,根据这次教训,有一条原则就是拥有大量数字代币的账户一定不要用来作为在主网上调用各种接口和智能合约的主体,因为一旦遭受攻击就会损失大量代币。应该使用其他独立的账户地址做这些事情,通过代币合约提供的approve()方法从拥有代币的账户地址得到授权,然后用这个独立的账户地址(可以是另一个智能合约的地址)去执行transferFrom()方法来分发代币,因为这样一来该地址得到的授权额度是有限的,二来黑客使用的sendTransaction API调用是不能调用到transferFrom这个方法的,因此会更安全。

无论是对于普通用户还是团体账户,谨记不要让某一个账户的余额特别高,如果有存储高额余额的需要,最好用冷钱包。如上所述,可以用代币合约的授权方法,授权给一些账户可以交易的额度,让这些授权账户去做实际的交易,这样就能规避这种黑客攻击的风险。因为这些授权账户地址里是没有实际的代币的,只是代替有余额的冷钱包账户对外发币。

黑客地址

该黑客的钱包地址为:

0x957cD4Ff9b3894FC78b5134A8DC72b032fFbC464

谷歌和百度黑客的地址,发现有若干条关于该地址的记录,国内外都有受害者。

使用etherscan.io对黑客地址进行查看后发现:

1、地址最早的Token Transfer记录可回溯到2016年2月14日;

2、地址中存在大量尚未上市流通的代币,但也有超过50个已上市流通的代币;

3、在已上市流通的代币中,有3个代币的交易笔数较多,分别是:Minereum(420笔)、PlusCoin(97笔)、Soarcoin(49笔);

4、除了两笔OUT外,其余均为IN。许多代币的转入具有固定模式:在同一时间段,以固定金额、固定笔数转入。例如,Minereum,每批次固定转入6笔,每批转入金额固定。

这种固定模式不仅发生在已上市流通的代币交易中,也广泛发生在未流通的代币交易中。因此,推测以这种模式转入的代币,亦为黑客盗取所得。

1、地址仅有的两笔OUT,是卖出soarcoin,一共卖掉了15278193.22 SOAR。其余关于soarcoin的记录均为转入,且累计转入=累计卖出。按照最后一笔卖掉的SOAR的价格,这个黑客变现了约42万美金;

2、地址中存在的可流通的代币里,价值最高的是UGT(约113万个,市值约65万美金),还有TNB(500万个,市值约13万美金)、NULS(约4万个,市值约10万美金)、KBR(约1万个,市值约6万美金)、OMG(约3千个,市值约3万美金)等。

我们诚恳邀请关注以太坊安全问题的读者,和我们一起深挖该黑客的行为路径。

黑客钱包地址:0x957cD4Ff9b3894FC78b5134A8DC72b032fFbC464

DRC社区采取应对措施

区块链技术仍然处于一个非常早期阶段、技术壁垒高的行业,几乎所有的团队都在学习和探索中。DRC团队经历此次事件后,深刻体会到安全风险无处不在,代币智能合约的开发只有更细致、更严密和更谨慎。

我们全面、深刻地分析整个事件始末,并积极采取措施改善与提升技术和管理,应对措施要点如下:

1、我们将联合国内、外顶级的代码审计团队,对代码进行更严格的审查;

2、邀请专家共同探讨关于智能合约、网络安全、代币管理、帐户管理等一系列相关主题,以寻求建立更严谨、更规范的管理体系,更加重视并优化内部操作管理流程;

3、加强开发规范与管理,将更积极的学习有关智能合约和代币相关的安全注意事项,加入以太坊与安全相关社区和论坛,更快的知晓有哪些安全漏洞需要注意,提前规避风险;

4、开发人员将避免在提供RPC服务的全节点上执行类似unlockAccount方法的操作,而使用Web3的Sign接口函数在发起交易时实时的签名,以规避账户风险;

5、提议并倡导建立智能合约安全联盟,为改善区块链行业的安全现状,DRC呼吁并号召成立行业安全联盟,集合项目方、安全团队、极客团队等加入,联合发起安全联盟,推动行业健康发展。联合相关专家与团队共同发起《区块链行业安全联盟公约发起函》。

6、DRC生态建设基金愿出资2000万DRC作为安全联盟专家费用,促进区块链行业有关智能合约、网络安全、法律法规等专题讨论,也欢迎更多有此志向的区块链项目团队和专家共同出资共建。

我们将此次事件进行披露公开,虚心接受大家的批评和建议,请大家多多指正。也希望其他区块链项目的开发团队引以为鉴,防患于未然。将代码合约安全放在首位,发布前进行严密的系统测试,必要时要请外部专业团队进行测试。请加群秘微信 chiajung ,邀请进入社群作进一步沟通。

探讨的话题不限于以下内容:

1、智能合约中需要采取的必要安全措施

2、区块链项目遭受黑客攻击后的应对方案

3、智能合约中已知的安全漏洞

4、区块链项目对代币及资金安全的管理制度

5、相关的法律法规问题

附件:相关以太坊主要漏洞描述

如果智能合约开发者疏忽或者测试不充分,而造成智能合约的代码有漏洞的话,就非常容易被黑客利用并攻击。并且越是功能强大的智能合约,就越是逻辑复杂,也越容易出现逻辑上的漏洞。同时,智能合约语言Solidity自身与合约设计都可能存在漏洞。据有关调查统计,以太坊主要漏洞情况描述如下表:



上述漏洞目前已经广泛存在以太坊网络中,2018年2月24日,新加坡和英国几位研究员指出,3.4万多份以太坊智能合约可能存在容易被攻击的漏洞,导致数百万美元以太币暴露在风险中,其中2,365份属于著名项目。