解读波场 TronBank 理财合约「狸猫换太子」被黑事件!波场DAPP将成为假币攻击重灾区?

作为一个程序员,竹三七几乎每天都要和Bug(程序错误)做斗争,嗯,今天又干掉三只。但常常是「Bug烧不尽,春风吹又生」。

还有一波程序员,会利用别人代码里的Bug,对别人的程序狠狠攻击,获取了高额的回报。

4月11日,波场的Dapp TronBank就中招了!遭遇假币攻击。 1 小时内,被盗约 1.7 亿个BTT(价值85万元)。

波场Dapp生态飞速发展,创始人孙宇晨也一直鼓吹基于波场开发的敏捷性和安全性。这次假币攻击,是否会给波场DAPP带来致命打击?

 

什么是TronBank?

TronBank是构建在波场智能合约上的去中心化基金DAPP,完全由智能合约自主运行。

TronBank类似于P2P 理财产品,只要用户有波场钱包,就可以登录TronBank官网,根据收益率和投资期限购买相应的理财产品,获得相应的收益。

官网宣称每天可获得 3.6 – 6.6%的投资收益,相当可观。

遭遇本次攻击的是一款 BitTorrent (BTT) 投资产品,目前已经进入维护状态。

 

事件回顾

成都链安技术团队,分析黑客攻击流程如下:

1、4 月 11 日凌晨,黑客创建了 990,000,000,000,000,000 个 BTTx假币 (ID:1002278)

2、黑客将4000万假币 BTTx 发送给 4 个攻击帐号。

3、攻击帐号收到假币 BTTx ,黑客调用了TronBank有缺陷的 invest (投资)函数。

4、TronBank 项目方将大量 BTT 转入了预先设置的投资帐号 TPK、TT4、TGD,这时,资金还不属于黑客。

5、随后,黑客触发 invest (投资)函数,通过 withdraw(提现) 函数取得了 TronBank 奖励池中真正的 BTT 代币。

TronBank 项目方在 4 月 11 日早上的 10:15 关闭了 BTT 的服务页面,并表示会针对客户损失进行全额赔偿:

「为保证 TronBank 社区用户利益,截至新加坡时间 4 月 11 日 10点 15 分前,TronBank BTT 玩家由于合约漏洞所遭受的损失,TronBank 将对损失的 BTT ,全额进行赔偿。」

 

罪魁祸首

通过代码分析,这次事件的罪魁祸首是TronBank的智能合约的「invest(投资) 函数」

这个倒霉函数,只判断 msg.tokenvalue,没有检查 msg.tokenid 是否是真的 BTT ID(1002000)。于是,黑客成功的“狸猫换太子”!迅速掏空TronBank的资金池。

为什么TronBank智能合约会犯这么XX的错误?只判断代币金额?不检查代币的ID?

 

背景知识 TRC10

波场的Token分三类:

1、TRX:平台币,相当于 Ethereum 中的 ETH、EOS网络的EOS。

2、TRC20:与 Ethereum ERC20 兼容的 token,由智能合约创建、控制转账、发送。使用比较复杂

3、TRC10:TRC20的简化版,方便小白用户,是可以由用户直接操控的 token

每一个自然用户只需支付 1024 TRX ,便可创建一个 TRC10 token。一个用户只能创建一个 TRC10 token。每一个 TRC10 token 在创建之后,由系统分配一个唯一的ID(即 token id),一个 tokenId 标识一个唯一的 token,ID从 1,000,001 往后自增。当前 TRON 平台上共有 1900+(截止2019-04-13 竹三七发文这一刻)个 TRC10。

 

使用TRC10,不需要任何编程知识,只要在钱包里存放1024个TRX,并在TronScan页面简单几步,就可以发币,只需扣除一些带宽费,不会有其他任何费用。

由于简单易操作,TRC-10受到广泛支持。因为TRC-10,使得DApp发行Token更加容易,迅速被很多DAPP项目方使用

而TRC10 token,可以在智能合约内部通过 token id 完成转账。因此,波场智能合约开发者,在处理 TRC10 转账相关逻辑时,必须要特别小心检查 token id 的有效性和真实性

不幸的是,TronBank的BTTBank智能合约,这个倒霉孩子,没有认真检查 msg.tokenid 是否是真实有效的 BTT ID(1002000)

 

上代码

BTTBank 这个理财合约是:用户存入 BTT,到期后会赎回投资的 BTT本金 ,并提取利息。

 

1、我们来看看「 invest 投资」函数。

看!它只提取 msg.tokenvalue,根本没有提取msg.tokenid,也没有验证 msg.tokenid是否属于 BTT Token 的 token id(为 1002000)。

打个比方:

就好像竹三七到银行存外币赚利息。银行柜台出了问题,不检查是那种钱币,只核对金额。

存1万元美金,当1万美金处理。 (没毛病)

存1万元英镑,当1万美金处理。 (1英镑=1.308美元, 客户吃亏)

存1万元日元,当1万美金处理。 (1日元=0.008927美元,银行吃大亏)

存1万假币,当1万美金处理。 (1假币=0美元,银行血亏)

这个「 invest 投资」函数,就相当于存1万假币,当1万美金处理。 (1假币=0美元,银行血亏)!! 刺不刺激?

不论你投的真币假币,都被这倒霉的程序,认为是 BTT。

 

2、再看「withdraw 提现」代码:

而msg.sender.transferToken(withdrawalAmount, BTT_ID) ,居然写死成 BTT_ID的ID。

所以,黑客存入假币BTTX,提取真币BTT,成功的「狸猫换太子」!

看到这里,讲真!写这份BTTBank智能合约程序员兄弟,当时是不是太累了太困了?你也太不小心了!

 

孙宇晨澄清

波场创始人孙宇晨迅速发Twitter澄清,「DAPP智能合约的锅,和波场没关系啊」

「波场DAPP 智能合约出现的安全问题与波场协议本身没有任何关系,波场协议是完全安全可靠的。链上数字资产完全安全!未来我们将联合安全企业和合作伙伴对开发者进行安全辅导,提升DAPP 的安全性!」

 

隐患

4月11日,成都链安技术团队检查Github上其他波场智能合约公开代码时,发现如下具有此类安全问题的合同地址:

TF3YXXXXXXXXXXXXXXXXXXXXXXXWt3hx;

TKHNXXXXXXXXXXXXXXXXXXXXXXXAEzx5;

TK8NXXXXXXXXXXXXXXXXXXXXXXXZkQy;

TUvUXXXXXXXXXXXXXXXXXXXXXXXxLETV;

TG17XXXXXXXXXXXXXXXXXXXXXXXkQ9i。

 

解决方案

成都链安(Beosin)安全团队建议波场DAPP项目方:

在收到加密货币时,同时检查“msg.tokenvalue”和“msg.tokenid”是否符合预期。

比如,BTTBank可在Invest函数增加:

require(msg.tokenid == 1002000); 检查代币是否为BTT。

require(msg.tokenvalue> = minimum); 投资额大于最低投资额。

 

竹三七的观点

1、区块链产业还年轻,智能合约产业也还年轻,而且代码公开,稍有不慎,很容易被攻击。

假币攻击,在EOS公链也曾发生过。 2018年9月,EOS去中心化交易所 Newdex,遭遇攻击者预先在EOS 帐户发行假的EOS,攻击帐户使用假 EOS 挂单买入其他代币,然后卖出代币,损失金额达4028个EOS。

2、不过,很多区块链安全公司都致力于区块链安全技术,区块链安全技术会飞速发展。

比如和币乎深度合作的慢雾科技,这次事件中的成都链安,都是杰出的区块链安全团队。

竹三七之前文章中也提过,AnChain.ai就是为解决区块链黑客威胁而创建的创业公司,它使用人工智能来监控事务,并检测可疑活动,并且可以扫描智能合约代码以查找已知漏洞。

3、波场的「加速器计划」,吸引了很多开发者跑步进入波场DAPP开发,一些从ETH移植过来的智能合约,可能存在隐患。

波场是从EthereumJ(以太坊Java版本代码)上fork来的,共识机制改成了改良过的DPoS。波场的智能合约,也是用Solidity写的(和ETH一样),需要改动的地方很少,比如把代码里的货币单位ether/wei换算成trx/sun(波场币的最小面额是sun,应该是指孙宇晨的sun),1 TRX = 1,000,000 sun。

所以,以太坊上的DAPP,可以很方便的移植到波场上。而这次假币攻击,很有可能是因为BTTBank合约的开发人员对TRON Token机制的了解不够充分,忽略了检查TRC10的Token.id

 

竹三七之前一篇文章:《爱莉莎:一起来看智能合约里的程序错误(Bug),BEC代币被黑的罪魁祸首原来是他! 【科普45】》总结过:

首先,智能合约产业还非常年轻不够成熟,整个产业其实还没有形成行业标准(比如测试标准等等),有些项目也没有达到软件业标准。

其次,写代码,非常容易当局者迷,一定要进行代码评估,找第三方Code Review。

最后,以太坊智能合约代码不能修改,出了问题,无法修复。为程序员开发者捏一把汗,一定不能出大Bug.

 

目前,仍是如此。

 

投资者来该怎么办?

计算机网络安全领域有个名词叫——零时差攻击,是指漏洞被发现后,立即被恶意者利用。通俗地讲,即安全补丁与漏洞曝光的同一日内,相关的恶意程序就会涌现。

所以,近期,很多波场DAPP,如果代码存在同样的问题,可能会被「假币攻击」。

所以,投资波场DAPP需谨慎。

但是,这类事件属于黑天鹅事件,如果DAPP项目方承担损失,未来还是可以继续投资的。