作者:安比(SECBIT)实验室

最近智能合约安全事件频发,从BEC到SMT,从HXG到FXE等,最近这几个智能合约出的问题,大都是由于整数溢出漏洞导致的。大家对整数溢出是不是都杯弓蛇影了?我们是不是应该在所有的地方都加上安全检查,确保我们的代码没有问题呢?可是这样真的好吗?

我们先来看看这段代码:

 function approve(address _spender, uint _amount) returns (bool success) {// approval amount cannot exceed the balancerequire ( balances[msg.sender] >= _amount );// update allowed amountallowed[msg.sender][_spender] = _amount;// log eventApproval(msg.sender, _spender, _amount);return true;}

这是ERC20接口中的approve函数的一个实现。咋一看,这个代码是不是很完美。仔细看,我们注意到,在函数最开始的地方有这样一行:

require ( balances[msg.sender] >= _amount );

approve的时候对当前余额进行检测,要求授权的_amount小于或等于当前余额。这样写貌似还很有道理,但真的是这样吗?
approve的时候对当前余额进行检测,要求授权的_amount小于或等于当前余额。这样写貌似还很有道理,但真的是这样吗?

首先我们看这样写有没有必要。

假设执行approve函数的时候,能够满足上面这个条件。如果在后续操作能够根据正常逻辑产生和这个条件相违背的状态,就可以认为这样的判断是没有任何意义的。

实际存在以下一些可能性,使得approve过的allowance大于用户对应余额的情况。

  1. 在approve之后,token的所有者自己通过transfer函数,把token转走,导致余额小于allowance。
  2. approve给多个人,其中一个人进行transferFrom操作后,可能导致余额小于之前给其他人approve过的值。

既然无法在后续操作里保证,授权的allowance大于余额,我们就可以得出结论,在approve里加上这样的验证是没有意义的。

有人可能会说,那加上这个除了多耗一点gas,那也没什么问题啊。真的没有什么问题吗?

最近我们在和去中心化交易所DDEX合作审计该平台上的ERC20 token的智能合约,发现一个比较严重的问题。目前的去中心化交易所,很多都用到了ZRX protocol或者类似的协议。在ZRX的智能合约里,进行转账的时候,通过Exchange合约的fillOrder函数完成转账。

其中fillOrder函数中由以下代码来实现转账:

require(transferViaTokenTransferProxy(order.makerToken,order.maker,msg.sender,filledMakerTokenAmount
));
require(transferViaTokenTransferProxy(order.takerToken,msg.sender,order.maker,filledTakerTokenAmount
));

去中心化的交易所需要准备一个中间账户,由这个中间账户发起的交易,也就是上面代码中的msg.sender。具体转账过程如下:

  1. 把卖出订单的Token转给一个交易所的中间账户
  2. 由该中间账户给卖出账户转入WETH
  3. 买入账户向中间账户转入WETH
  4. 中间账户向买入账户转入Token

而这四步转账都是通过一个TokenTransferProxy合约完成。中间账户需要向该合约approve足够的allowance。而ZRX提供的合约并不提供approve过程,需要交易所提供的中间账户提前准备好这个approve工作。

然而如果这个中间账户并没有提前拥有交易的token,由于这个检测

require ( balances[msg.sender] >= _amount );

无法提前完成approve,这样的问题给去中心化交易所带来了较大的困扰。

在各种去中心化交易所中,甚至中心化的交易所中类似的情况并不少见。因此我们强烈推荐大家在写ERC20智能合约时不要这么写,不要加上这样一个判断。

如果万一已经发布的ERC20 token合约已经这么写了,我们有什么办法吗?

当交易所遇到这种情况的时候,只能由项目方向交易所的中间账户打一笔足够大的token,才能保证能够approve成功,而且限制以后发生的交易额不能超过此数量的限制。

我们使用SECBIT的一个内部工具,对提供源码的22681个ERC20 Token智能合约进行了一次扫描,发现了21个智能合约存在此问题,其中有3个合约的交易量较大。涉及的Token包括:
IDH

GZR
ADE
SAINT
BULB
ZZZ
KTM
ETI-P
ZORRO01
ZORRO02

现在去中心化交易所将越来越多,为了不影响项目token未来的交易的流动性,我们建议各token仔细检查合约是否存在该问题,如果可能,尽早进行修正。

以上数据均由SECBIT实验室提供。合作交流请联系 info@secbit.io。


安比(SECBIT)实验室创始人郭宇,中国科学技术大学博士、耶鲁大学访问学者、曾任中科大副教授,后担任知名金融科技公司副总裁。专注于形式化证明与系统软件研究领域十余年,具有丰富的金融安全产品研发经验,是国内早期关注并研究比特币与区块链技术的科研人员之一。研究专长:区块链技术、形式化验证、程序语言理论、操作系统内核。

安比(SECBIT)实验室专注于区块链与智能合约安全问题,全方位监控智能合约安全漏洞、提供专业合约安全审计服务,在智能合约安全技术上开展全方位深入研究,致力于参与共建共识、可信、有序的区块链经济体。

ERC20智能合约的approve千万别这样写相关推荐

  1. 安⽐(SECBIT)实验室携⼿路印(Loopring)共同发布智能合约风险列表

    以太坊 ERC20 Token 标准自 2015 年 11 月 19 日诞生以来 [1],为智能合约.以太坊生态以及区块链应用的发展做出了巨大的贡献.据 Etherscan 网站数据显示,截止 201 ...

  2. 以太坊智能合约各方法对应的签名编码

    erc20智能合约常见方法对应的签名编码: 常见例如交易:transfer(address,uint256) 编码为: web3.sha3("transfer(address,uint256 ...

  3. [区块链安全-Damn-Vulnerable-DeFi]区块链DeFi智能合约安全实战-连载中

    [区块链安全-Damn-Vulnerable-DeFi]区块链DeFi智能合约安全实战-连载中 前言 环境准备 1. unstoppable 任务分析 发起攻击 总结 2. Naive receive ...

  4. 质押智能合约详解|手把手教你玩转质押合约|Defi质押

    本文介绍通过质押底层币(以太坊)资产获取收益的一般逻辑及其实现方法,该方案在很多defi项目得到应用:本文中的收益为ERC20通证,收益获取也可以理解为行为. 开发环境:chrome + metama ...

  5. 以太坊智能合约开发-《精通以太坊智能合约开发》学习总结实践

    文章目录 一.初探以太访智能合约 1. remix小demo 2. 写智能合约用的编程语言 二.以太坊核心概念 1. 交易/事务( Transaction ) 2. 区块 3. 共识协议:工作量证明( ...

  6. [转]EOS智能合约 私链激活 基本操作

    链接:https://www.jianshu.com/p/90dea623ffdf 简介 本篇文章,将跟大家介绍eos私链的激活.基础智能合约的安装,以及为大家演示转账等基础操作.还没有安装eos私链 ...

  7. 智能合约重构社会契约(6)赛迪智能合约安全标准

    1. 安全实施框架 根据运行机制可分为运行与规划.合约创建.安全审计.合约触发.合约运行.合约废止六个阶段. 2. 编译部署安全要求 区块链系统应校验智能合约的编译实体.写入策略和签名内容. 区块链系 ...

  8. 以太坊智能合约之如何执行智能合约?

    区块链技术在顶级技术中占据主导地位的主要原因在于其去中心化.虽然区块链的主要目的是在没有中心的情况下维护交易记录,但为了实现自动化,智能合约被引入.那么在写完智能合约之后呢?在本文的这个以太坊智能合约 ...

  9. 以太坊 智能合约(六)

    智能合约 智能合约是以太坊的精髓,也是以太坊和比特币一个最大的区别. 什么是智能合约 智能合约的本质是运行在区块链上的一段代码,代码的逻辑定义了智能合约的内容 智能合约的账户保存了合约当前的运行状态 ...

最新文章

  1. ARM常用的调试方式与ARM培训班常见的调试方法
  2. echo和print 的区别
  3. JavaScript对象——原型与原型链
  4. 85、交换机安全MAC层***配置实验之Port-Security
  5. 白盒测试 | 用例设计方法之条件覆盖
  6. html5网页制作代码_好程序员HTML5大前端常用开发工具大集合
  7. 前端:JS/35/二级联动菜单,select对象,select对象的属性,option对象,option对象属性,实例:省份列表与城市列表的联动
  8. 腾讯牵手数十家合作伙伴发起“光合计划” 推动“百千万”三大目标落地
  9. red hat linux 虚拟机,Red Hat linux 的安装详细流程(包括VM虚拟机的设置)
  10. 读书笔记: 博弈论导论 - 05 - 完整信息的静态博弈 纳什均衡
  11. 英语面试功略:英语口语突击法
  12. 请教 indy 中的 tldUdpServer 如何实现对本地端口6100进行监听!
  13. 软件基本功:做自说明的测试文档,
  14. 相机成像原理RAW,RGB,YUV
  15. 朋友圈营销:如何做好个人IP打造吸金朋友圈?(内附思维导图)
  16. 一个EXCEL数组公式的解析
  17. 每日一题——判断素数
  18. HTML中背景透明有阴影,透明PNG在网页有阴影的解决方法
  19. C++opencv找圆心?看着一篇,一定有你要(边缘轮廓检测,拟合,凸包)找出相应的轮廓或者全部轮廓画外界圆轮廓并且标出轮廓中心
  20. 泛微考勤加班流程,有重复的时间段不让提交

热门文章

  1. 做XRD有什么用途?
  2. 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第十集
  3. cocos2d-js
  4. lisp语言与python_又要头秃?2020 年七大 AI 编程语言大盘点
  5. androidnbsp;强大的adbnbsp;测试工具
  6. linux 卸载nexus,CentOS7安装Nexus
  7. 简单平面点云的内外侧轮廓提取
  8. 翻译Stairway to SQL Server Security Level 3: Principals and Securables
  9. 快速入门人工智能的方法及精要
  10. 粒子说区块链7:产业链分析之硬件篇