欢迎来到 无奈人生 安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

ERC20不一致性检查(新增balnaces不一致检查漏洞)

来源: 作者: 时间:2019-02-24 19:29 点击: 我要投稿
广告位API接口通信错误,查看德得广告获取帮助

一、前言
日前,有相关文章报道了部分合约中的transferFrom中存在不一致性检查漏洞(check effect inconsistency)。
BUGX.IO团队对此漏洞类型进行了深入的分析,发现了不仅存在 `allowed[_from][msg.sender]` 这一语句的检查不一致,还存在 `balances[msg.sender]` 语句的检查不一致漏洞。
二、漏洞原理
1、allowed不一致性检查漏洞

如上面代码所示:
`require(_value `
这一句的条件检测与
`allowed[_from][_to] -= _value;`
这一语句的操作不相符,导致设置转账额度权限后,攻击者能够持续转账,直到转完所有余额。
2、balances 不一致性检查漏洞

如上面代码所示:
`require(balances[msg.sender] >= _value);`
这一句的条件检测与
`balances[_from] -= _value;`
这一语句的操作不相符,攻击者能够通过溢出,让`_from`账户余额获得极大的token 数量。
同时,有一些合约中使用了 safeMath 安全方法进行计算 `balances[_from] = balances[_from].sub(_value);`,所以暂时没有溢出问题,但是条件检查部分是冗余的。
三、漏洞复现
1、allowed 不一致性检查漏洞复现
部署 Lightcoin 合约,合约地址:
https://etherscan.io//address/0xd97579Cea3fE2473682a4C42648134BB982433B9
管理者:0xca35b7d915458ef540ade6068dfe2f44e8fa733c
攻击者:0x14723a09acff6d2a60dcdf7aa4aff308fddc160
攻击者2:0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db
管理者身份:管理者给予攻击者一定的转账额度权限
approve:
"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",10000
使用 allowance 查看转账额度:
"0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"

此时此时攻击者2的余额为 0:

切换为攻击者身份:
攻击者使用 transferFrom 向攻击者2进行转账操作
transferFrom:
"0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db",10000
攻击者继续使用 transferFrom 向攻击者2进行转账操作,仍然能转账成功,因为 `allowed[_from][msg.sender]`没有发生变化,而攻击者2的余额依然增加了。
transferFrom:
"0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db",10000

通过此攻击,攻击者能够将 _from 账户里的所有余额转移到其它用户余额中。并且`allowed[_from][_to]`是溢出了的。
allowance :
"0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"

2、balances 不一致性检查漏洞复现
部署 CountryCoin (CCN) 合约进行复现。
合约地址:https://etherscan.io//address/0x3b912fb1b5b9e07e50e43f0404fee038f9a0353c#code
管理者:0xca35b7d915458ef540ade6068dfe2f44e8fa733c
攻击者1:0x14723a09acff6d2a60dcdf7aa4aff308fddc160
攻击者2:0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db
攻击者1先通过充值获取一定的 token。

至此即为初始化条件,攻击者有两个账户地址,其中余额分别为 10000 和 0,我们接下来的攻击就是让第二个账户溢出。
切换到攻击者2,攻击者2给予攻击者1一定的转账额度权限
approve:
"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",10000
切换回攻击者1,攻击者使用 transferFrom 向自己进行转账操作
transferFrom:
"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db","0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",10000
此时攻击者2地址上余额本来为0,但经过 “ 的减法计算下溢变为了极大值。

四、修复方案
修复方法如下:

1.使用 safeMath 方法进行计算;
2.使用 `balances[_from] >= _value` 作为条件判断而非 `balances[msg.sender]`;
3.检查 `allowed[_from][msg.sender]` 并对 `allowed[_from][msg.sender]` 进行操作不要与 `allowed[_from][_to]` 混用。
五、漏洞合约监测结果
通过对以太坊进行此漏洞类型的全面监测,发现存在超过 25 个合约存在此类问题,其中有些是有大量交易的合约。同时,有部分合约使用了 safeMath 库暂无问题。
 

一、前言
日前,有相关文章报道了部分合约中的transferFrom中存在不一致性检查漏洞(check effect inconsistency)。
BUGX.IO团队对此漏洞类型进行了深入的分析,发现了不仅存在 `allowed[_from][msg.sender]` 这一语句的检查不一致,还存在 `balances[msg.sender]` 语句的检查不一致漏洞。
二、漏洞原理
1、allowed不一致性检查漏洞

如上面代码所示:
`require(_value `
这一句的条件检测与
`allowed[_from][_to] -= _value;`
这一语句的操作不相符,导致设置转账额度权限后,攻击者能够持续转账,直到转完所有余额。
2、balances 不一致性检查漏洞

如上面代码所示:
`require(balances[msg.sender] >= _value);`

无奈人生安全网


这一句的条件检测与
`balances[_from] -= _value;`
这一语句的操作不相符,攻击者能够通过溢出,让`_from`账户余额获得极大的token 数量。
同时,有一些合约中使用了 safeMath 安全方法进行计算 `balances[_from] = balances[_from].sub(_value);`,所以暂时没有溢出问题,但是条件检查部分是冗余的。
三、漏洞复现
1、allowed 不一致性检查漏洞复现
部署 Lightcoin 合约,合约地址:
https://etherscan.io//address/0xd97579Cea3fE2473682a4C42648134BB982433B9
管理者:0xca35b7d915458ef540ade6068dfe2f44e8fa733c
攻击者:0x14723a09acff6d2a60dcdf7aa4aff308fddc160
攻击者2:0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db
管理者身份:管理者给予攻击者一定的转账额度权限
approve:
"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",10000
使用 allowance 查看转账额度:
"0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"
www.wnhack.com
此时此时攻击者2的余额为 0:

切换为攻击者身份:
攻击者使用 transferFrom 向攻击者2进行转账操作
transferFrom:
"0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db",10000
攻击者继续使用 transferFrom 向攻击者2进行转账操作,仍然能转账成功,因为 `allowed[_from][msg.sender]`没有发生变化,而攻击者2的余额依然增加了。
transferFrom:
"0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db",10000

通过此攻击,攻击者能够将 _from 账户里的所有余额转移到其它用户余额中。并且`allowed[_from][_to]`是溢出了的。
allowance : 无奈人生安全网
"0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"

2、balances 不一致性检查漏洞复现
部署 CountryCoin (CCN) 合约进行复现。
合约地址:https://etherscan.io//address/0x3b912fb1b5b9e07e50e43f0404fee038f9a0353c#code
管理者:0xca35b7d915458ef540ade6068dfe2f44e8fa733c
攻击者1:0x14723a09acff6d2a60dcdf7aa4aff308fddc160
攻击者2:0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db
攻击者1先通过充值获取一定的 token。

至此即为初始化条件,攻击者有两个账户地址,其中余额分别为 10000 和 0,我们接下来的攻击就是让第二个账户溢出。
切换到攻击者2,攻击者2给予攻击者1一定的转账额度权限 内容来自无奈安全网
approve:
"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",10000
切换回攻击者1,攻击者使用 transferFrom 向自己进行转账操作
transferFrom:
"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db","0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",10000
此时攻击者2地址上余额本来为0,但经过 “ 的减法计算下溢变为了极大值。

四、修复方案
修复方法如下:

1.使用 safeMath 方法进行计算;
2.使用 `balances[_from] >= _value` 作为条件判断而非 `balances[msg.sender]`;
3.检查 `allowed[_from][msg.sender]` 并对 `allowed[_from][msg.sender]` 进行操作不要与 `allowed[_from][_to]` 混用。
五、漏洞合约监测结果 本文来自无奈人生安全网
通过对以太坊进行此漏洞类型的全面监测,发现存在超过 25 个合约存在此类问题,其中有些是有大量交易的合约。同时,有部分合约使用了 safeMath 库暂无问题。
  copyright 无奈人生

。 (责任编辑:admin)
【声明】:无奈人生安全网(http://www.wnhack.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱472701013@qq.com,我们会在最短的时间内进行处理。