作者:成都链安 责编:Aholiab
4月11日凌晨1点,波场DApp tronbank遭受假币攻击。
11日上午Beosin成都链安技术团队作出初步分析,判断该次假币攻击事件主要原因,在于合约没有严格验证代币的唯一标识符代币ID,错误地将攻击者自己发行的无价值代币识别为价值85万元的BTT代币,从而造成了损失。
同时及时发出预警,预判黑客团队未来可能将攻击重点转向波场。
接下来我们就来一起看看这次事件的造成原因。
首先,我们先看此次BTT假币攻击事件中的漏洞源码,如下图: 经过分析发现,该假币漏洞是由invest函数只判断了msg.tokenvalue,而没有判断msg.tokenid是否为真实BTT代币的ID:1002000所导致。
TRC10标准是波场本身支持的技术代币标准,标准规定了两个重要参数:msg.tokenvalue和msg.tokenid。其中msg.tokenvalue表示当前msg调用的代币数量,而msg.tokenid表示当前调用者使用的代币种类标记ID。每种TRC10标准的代币都有一个独一无二的标记ID作为代币种类证明。
BTTBank合约在收取代币时没有对收到代币的tokenid做任何判断,合约中仅仅判断了msg发送代币的数量msg.tokenvalue。
当合约收到调用者发送的代币数量msg.tokenvalue时,合约错误的认为该代币数量是BTT的数量。但实际上调用者使用的是假币tokenid为1002278的代币数量。BTTBank将假币视同于真币(真币的tokenid为10022000)记录到投资者账号。
而攻击者账号TRC10代币中存在BTT和BTTx两种代币,可见两种代币的ID差异,BTT代币ID:1002000,BTTx代币ID:1002278。 攻击者于4月11日凌晨创建发行990,000,000,000,000,000个名为BTTx的假币(代币ID:1002278) 随后,假币创建完成,攻击者将四千万创建的假币BTTx发送给四个攻击小号:
TB9jB76Bk4tk2VhzGAb6t1aCYgW7Z4iicY
TQM4uEWPQvVe2kGbWPZtVLMDFrTLERfmp4
TKp1stjapNqr4pkDQjU9GTitsYBUrKAGkh
TF2EWZJZSokGdtk4fj7PqCmuGpJasVXJ3K 当攻击小号收到假币后,攻击者又调用BTTBank合约有缺陷的invest函数。 接下来在触发invest函数后,BTTBank项目方将大量BTT转入了预先设置的投资账号TPk,TT4,TGD,这笔资金实际上未被黑客获得,但项目方在没有收到BTT的情况下进行了真实的投资。
下图为源码中对三个投资地址的具体设置代: BTTBank投资的三个投资账号中都收到了大量BTT代币,如下图所示。账号1账号2账号3
黑客触发invest函数后通过withdraw函数取到了BTTBank奖励池的真正的BTT代币,最终四个小号将赃款集中转向黑客主账号:
TCX1Cay4T3eDC88LWL7vvvLBGvBcE7GAMW