作为一个程序员,竹三七几乎每天都要和Bug(程序错误)做斗争,嗯,今天又干掉三只。但常常是「Bug烧不尽,春风吹又生」。
还有一波程序员,会利用别人代码里的Bug,对别人的程序狠狠攻击,获取了高额的回报。
4月11日,波场的Dapp TronBank就中招了! 遭遇「假币攻击」, 1 小时内,被盗约 1.7 亿个BTT(价值85万元)。
波场Dapp生态飞速发展,创始人孙宇晨也一直鼓吹基于波场开发的敏捷性和安全性。这次假币攻击,是否会给波场DAPP带来致命打击?*
什么是TronBank?
TronBank是构建在波场智能合约上的去中心化基金DAPP,完全由智能合约自主运行。
imageTronBank类似于P2P 理财产品,只要用户有波场钱包,就可以登录TronBank官网,根据收益率和投资期限购买相应的理财产品,获得相应的收益。
image官网宣称每天可获得 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)。
image打个比方:
就好像竹三七到银行存外币赚利息。银行柜台出了问题,不检查是哪种钱币,只核对金额(只是打个比方)。
存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。
image所以,黑客存入假币 BTTX,提取真币BTT,成功的「狸猫换太子」!
看到这里,讲真!写这份BTTBank智能合约程序员兄弟,当时是不是太累了太困了?你也太不小心了!
孙宇晨澄清
波场创始人孙宇晨迅速发Twitter澄清,「DAPP智能合约的锅,和波场协议没关系啊!」
image「波场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项目方承担损失,未来还是可以继续投资的。
网友评论