前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >智能合约审计之一致性检查

智能合约审计之一致性检查

原创
作者头像
Al1ex
修改2021-07-16 10:45:50
4440
修改2021-07-16 10:45:50
举报
文章被收录于专栏:网络安全攻防网络安全攻防

文章前言

本篇文章将对Lightcoin合约内transfeFrom授权转账函数的allowance不一致性问题和CountryCoin合约内transfeFrom的balance不一致性问题进行简单的分析介绍~

漏洞原理

Allowance不一致

漏洞介绍:如下面代码所示,条件语句"require(_value <= allowed[_from][msg.sender]);"与后期更新语句"allowed[_from][_to] -= _value;"存在不一致问题,导致这里如果用户A给用户B授权转账后,用户B可以无限制的转走用户A的资产,直到转完账户的所有余额

balances不一致性

漏洞介绍:如下面的代码所示,条件检测语句"require(balances[msg.sender] >= _value);"与"balances[_from] -= _value;"更新语句存在不一致性,攻击者能够通过溢出,让`_from`账户余额获得极大的token数量

漏洞复现

allowed 不一致性

首先,下载Lightcoin合约代码之后在本地Remix中进行部署调试(这里需要改一下合约中owner地址便于调试),相关账户地址信息如下所示:

  • 管理者:0x5B38Da6a701c568545dCfcB03FcB875f56beddC4
  • 攻击者1:0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2 
  • 攻击者2:0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db

Step 1:以管理者身份调用approve函数给予攻击者1一定的转账额度

代码语言:javascript
复制
approve:
"0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2",10000

交易记录信息:

Step :2:使用allowance 查看转账额度

代码语言:javascript
复制
"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4","0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2"

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

Step 3::之后切换为攻击者1身份,并通过攻击者1使用transferFrom向攻击者2进行转账操作

代码语言:javascript
复制
transferFrom: 
"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4","0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db",10000

交易记录信息如下:

Step 3:攻击者1继续使用:transferFrom向攻击者2进行转账操作,仍然能转账成功,因为 allowed[_from][msg.sender]没有发生变化

代码语言:javascript
复制
transferFrom: 
"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4","0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db",10000

交易日志记录:

之后发现攻击者2的余额依然增加了:

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

代码语言:javascript
复制
allowance : 
"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4","0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db"

balances不一致性

首先,下载CountryCoin合约然后在Remix中进行部署分析调试(在构造函数中给msg.sender赋一些token),相关地址如下:

  • 管理者: 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4
  • 攻击者1:0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2
  • 攻击者2:0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db

Step 1:在这里我们首先通过管理者地址给攻击者1地址打一定数量的代币进去,来模拟攻击者1充值token:

代码语言:javascript
复制
0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2,100000000000000

交易日志信息:

之后攻击者1的地址所拥有的token数量为:

另一个攻击者2地址账户余额为0

Step 2:接下来我们的攻击就是让第二个账户溢出,之后使用攻击者2给予攻击者1一定的转账额度权限

代码语言:javascript
复制
approve: 
"0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2",10000

Step 3:切换回攻击者1,然后使用transferFrom向自己进行转账操作

代码语言:javascript
复制
transferFrom: 
"0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db","0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2",10000

交易日志如下:

此时攻击者2地址上余额本来为0,但经过 “ 的减法计算下溢变为了一个极大值

修复方案

修复方法如下:

1、使用safeMath方法进行计算

2、使用balances[_from] >= _value作为条件判断而非 balances[msg.sender]

3、检查allowed[_from][msg.sender]并对allowed[_from][msg.sender]进行操作不要与allowed[_from][_to]混用

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章前言
  • 漏洞原理
    • Allowance不一致
      • balances不一致性
      • 漏洞复现
        • allowed 不一致性
          • balances不一致性
          • 修复方案
          相关产品与服务
          区块链
          云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档