客服QQ:872490018

智能合约 transferFrom 权限控制不当导致的任意盗币攻击简述

智能合约 transferFrom 权限控制不当导致的任意盗币攻击简述-碳链

智能合约里的 transferFrom 是批准转账流程里的关键函数,这个由于不如 transfer 那么常用,容易被不小心忽略。这个流程最大的问题是权限问题。看代码说话:

// 批准转账上限(批准目标可以代我转账的上限)

function approve(address _spender, uint256 _value) public returns (bool success) {

    allowed[msg.sender][_spender] = _value;

    Approval(msg.sender, _spender, _value);

    return true;

}

// 代我转账的流程

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {

    /// same as above

    require(_to != 0x0);

    require(balances[_from] >= _value);

    require(balances[_to] + _value > balances[_to]);

    uint previousBalances = balances[_from] + balances[_to];

    balances[_from] -= _value;

    balances[_to] += _value;

    allowed[_from][msg.sender] -= _value;

    Transfer(_from, _to, _value);

    assert(balances[_from] + balances[_to] == previousBalances);

    return true;

}

可以看出,这个流程并没做 allowed[_from][msg.sender]_value 的判断,比如函数开始应该判断:

require(allowed[_from][msg.sender] >= _value);

如果 allowed[_from][msg.sender] 不存在,那么值是 0,判断缺失,也就等于之前的 approve 函数形同虚设。然后,这还出现了个有趣的溢出:

allowed[_from][msg.sender] -= _value;

allowed[_from][msg.sender] 不存在,那么值是 0,减去 _value(大于 0 时),就溢出了(溢出并不会导致中断回滚)。这就是为什么如果用了 SafeMath 就会没问题,因为 SafeMath 会抛出错误,直接中断回滚 transferFrom 函数。

整体这样看下来,EDU 和 BAI 等合约的 transferFrom 盗币事件最核心的问题是权限问题,溢出在这仅仅是个小插曲而已。


智能合约 transferFrom 权限控制不当导致的任意盗币攻击简述-碳链

*文章为作者独立观点,不代表碳链立场
本文由 慢雾科技 授权 碳链 发表,并经碳链编辑。转载此文章须经作者同意,并请附上出处(碳链)及本页链接。原文链接http://www.itanlian.com/chainnews/1473.html
发表评论
坐等沙发
相关文章
两会热议区块链,这些提案你要知道!
两会热议区块链,这些提案你要知道!
数据要素价值凸显,区块链应用正当时 | 陀螺研究院
数据要素价值凸显,区块链应用正当时 | …
区块链产业发展全国两会受热议 20余位代表委员提交相关建议
区块链产业发展全国两会受热议 20余位代…
陀螺产业区块链案例库第一季最终集 | 杭州互联网公证处知识产权服务平台
陀螺产业区块链案例库第一季最终集 | 杭…
重磅!“陀螺号首期原创扶持计划”获奖名单出炉!
重磅!“陀螺号首期原创扶持计划”获奖名…
「陀螺公开课」正式上线,打造专注区块链教育的视频精品课
「陀螺公开课」正式上线,打造专注区块…
慢雾科技
SlowMist-Team 作者
我还没有学会写个人说明!
  • 文章

    110

  • 评论

    0

广告赞助