8BTCCI: 18599.66 +2.98% 8BTCVI: 12102.97 +4.18% 24H成交额: ¥5164.32亿 +8.04% 总市值: ¥23549.35亿 +3.25%
TronBank 2亿BTT被套:“假币”攻击分析

TronBank 2亿BTT被套:“假币”攻击分析

降维安全实验室 发布在 链圈子 海盗号 51521

事件

据降维安全实验室(johnwick.io)检测,波场知名DApp TronBank于今日凌晨遭遇“假币”攻击,短时间内近2亿BTT被攻击者窃取,价值人民币近百万。下面我们对此次“假币”攻击涉及的合约代码问题做个简单分析。

 

分析

TRON波场不仅支持类似以太坊ERC-20的合约代币标准TRC-20,还创建了TRC-10代币标准,这个代币机制不依赖于TRON虚拟机(TVM),使得发币变得更简单易行,但是如果开发者在没有深入理解其特性的情况下,就容易写出有缺陷的合约代码。

我们知道和以太坊ETH类似,TRX波场币账户操作有原生API支持:

  • 查询余额 address.balance
  • 转账 (出 OUT) address.transfer(value);
  • 转账 (入 IN) msg.value
同样的,TRC-10也有类似API支持:
  • 查询余额 address.tokenBalance(trcToken tokenId) return(uint256 tokenAmount);
  • 转账 (出 OUT) address.transferToken(uint256 tokenValue, trcToken tokenId);
  • 转账 (入 IN) msg.tokenValue, msg.tokenId
从上述API的参数,我们可以发现一个账户是可以持有多种TRC-10代币,它们依靠tokenId进行区分。

我们再来看tronBank 合约涉及转入BTT的invest函数:

    function invest(uint256 _referrerCode, uint256 _planId) public payable {
        require(msg.value == 0, "wrong trx amount");
        if (_invest(msg.sender, _planId, _referrerCode, msg.tokenvalue)) { // <-- 未检查
            emit onInvest(msg.sender, msg.tokenvalue

); } }

我们可以发现invest函数并未对msg.tokenId检查是否为BTT (BTT的tokenId值为1002000),导致攻击者可以转入假币,并计入到攻击者持有的BTT余额

我们再看看合约涉及BTT提现的withdraw()函数:

    function withdraw() public payable {
        uint256 withdrawalAmount = _withdraw();
        if (withdrawalAmount >= 0) {
            msg.sender.transferToken(withdrawalAmount, BTT_ID);  //<--- 转出BTT
            emit onWithdraw(msg.sender, withdrawalAmount);
        }
    }
我们可以看出,提现函数直接按BTT向攻击者转出,导致了攻击者成功实现了“假币”攻击。

 

结论

此次TronBank “假币”事件,除了项目方安全开发经验欠缺外,还因为TRC-10是个新生事物,官方文档并没有给出详细的开发指导。

希望未来波场项目方,更多的关注官方的开发文档, 毕竟这是所有开发者使用一种新的语言或规范的必经之路。 开发者在开发过程中,偏重的是项目的构建,因此最终代码应该交由专业的安全公司进行审计,多方合作,更好的保护用户的权益。

所有数字货币在早期都出现过严重的安全事故,BTC,ETH,EOS无一例外,从另外一个角度来讲,正是因为社区活跃度高,才引发了黑客的关注,希望波场借此事件,可以更茁壮的成长。

降维安全实验室(johnwick.io)对市值靠前的数字货币生态,都有全面的安全事件监控,而且如果用户数字货币丢失,可以在CoinHunter.io平台提交,进行流向监控,如果数字货币流入合作的交易所,会及时进行冻结,挽回损失。

文章标签: 区块链安全
评论(1)
登录 账号发表你的看法,还没有账号?立即免费 注册