Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >条件竞争概述

条件竞争概述

原创
作者头像
Al1ex
修改于 2021-04-01 01:49:55
修改于 2021-04-01 01:49:55
1.1K00
代码可运行
举报
文章被收录于专栏:网络安全攻防网络安全攻防
运行总次数:0
代码可运行

文章前言

与大多数区块链一样,以太坊节点汇集交易并将其形成块,一旦矿工解决了共识机制(目前Ethereum的ETHASH PoW),这些交易就被认为是有效的,解决该区块的矿工也会选择来自该矿池的哪些交易将包含在该区块中,这通常是由gasPrice交易决定的,在这里有一个潜在的攻击媒介,攻击者可以观察事务池中是否存在可能包含问题解决方案的事务,修改或撤销攻击者的权限或更改合约中的对攻击者不利的状态,然后攻击者可以从这个事务中获取数据,并创建一个更高级别的事务gasPrice并在原始之前将其交易包含在一个区块中。

条件竞争

下面给出一个示例合约:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
contract FindThisHash {
    bytes32 constant public hash = 0xb5b5b97fafd9855eec9b41f74dfb6c38f5951141f9a3ecd7f44d5479b630ee0a;

    constructor() public payable {} // load with ether

    function solve(string solution) public {
        // If you can find the pre image of the hash, receive 1000 ether
        require(hash == sha3(solution)); 
        msg.sender.transfer(1000 ether);
    }
}

这个合约包含1000个ether,找到并提交正确答案的用户将得到这笔奖励,当一个用户找出答案并调用solve函数,并把答案作为参数,然而不幸的是,攻击者可以观察交易池中任何人提交的答案,他们看到这个解决方案,检查它的有效性,然后提交一个远高于原始交易的gasPrice的新交易,解决该问题的矿工可能会因攻击者的gasPrice更高而先打包攻击者的交易,攻击者将获得1000ether,最初解决问题的用户将不会得到任何奖励(合约中没有剩余ether),条件竞争问题由此产生!

防御措施

有两类用户可以进行这种的提前交易攻击:

  • 用户(修改他们的交易的gasPrice)
  • 矿工自己(他们可以按照他们认为合适的方式重新排序交易)

总体来说,一个易受第一类(用户)攻击的合约比一个易受第二类(矿工)攻击的合约明显更糟糕,因为矿工只能在解决一个区块时执行攻击,这对于任何针对特定区块的单个矿工来说都是不可能的,下面给出一些缓解措施:

gaslimt

可以采用的一种方法是在合约中创建限制条件,即gasPrice上限,这可以防止用户增加gasPrice并获得超出上限的优先事务排序,这种预防措施只能缓解第一类攻击者(任意用户)的攻击,在这种情况下,矿工仍然可以攻击合约,因为无论gasPrice如何,他们都可以根据需要排序交易。

披露方案

更可靠的方法是尽可能使用提交---披露方案(commit-reveal),这种方案规定用户使用隐藏信息(通常是散列)发送交易,在交易已包含在块中之后,用户发送一个交易来解密已经发送的数据(披露阶段),此方法可防止矿工和用户进行前瞻性交易,因为他们无法确定交易内容,然而这种方法无法隐藏交易价值(在某些情况下,这是需要隐藏的有价值信息),ENS智能合约允许用户发送交易,其承诺数据包括他们愿意花费的以太数量,然后用户可以发送任意值的交易,在披露阶段用户退还了交易中发送的金额与他们愿意花费的金额之间的差额。

相关讨论

对于Approve函数的"条件竞争"问题,曾引发的广泛的讨论: 

首先是Ethereum官方给出了一个建议: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md

approve advice
approve advice

上面的主要意思是限制approve函数在将配额从N修改为M时,只能先从N修改为0,再从0修改为M,可以通过以下语句进行限制:

new approve
new approve

随后就有人提出上面的这种安全建议可以解决"事务顺序依赖性",但是如果加了require进行限制,那么合约就不符合ERC20标准规范了,具体详情可以参考下面的链接: https://github.com/RewardsNetwork/Alloy-ICO-Contracts/issues/9

discuss about approve
discuss about approve

之后openzeppelin也给出了另外一个安全建议: 

使用increaseApproval函数和decreaseApproval函数来代替approve函数,同时由于ERC20标准性问题合约当中也必须要有approve(没有添加require),具体代码如下:

这里的increaseApprove的含义是在原有的“配额”基础上再增加“配额” 

这里的decreaseApprove的含义是在原有的“配额”基础上再减少“配额”

笔者认为如果将approve以及increaseApprove、decreaseApprove三个函数放到一个合约当中,而且这三个函数都是public,approve函数当中也没有安全判断,那么如果用户仍然可以调用Approve进行“配额”划分,此时的increaseApprove和decreaseApprove和没存在基本上是一模一样的,在这种情况下合约仍然存在“事务顺序依赖性问题”。

笔者在做智能合约审计的过程中发现有不少合约分别采用了以下三种对于“approve事务顺序依赖性”问题的处理方法: 

1.在approve当中增加Require进行安全判断,例如:

https://etherscan.io/address/0x0317ada015cf35244b9f9c7d1f8f05c3651833ff#code https://etherscan.io/address/0x3597bfd533a99c9aa083587b074434e61eb0a258#code https://etherscan.io/address/0x38c6a68304cdefb9bec48bbfaaba5c5b47818bb2#code 

2.使用increasApprove和decreaseApprove函数替代approve函数,Approve函数保持ERC20标准,不增加require进行安全防范,例如:

https://etherscan.io/address/0x58a4884182d9e835597f405e5f258290e46ae7c2#code https://etherscan.io/address/0x05d412ce18f24040bb3fa45cf2c69e506586d8e8#code https://etherscan.io/address/0x153ed9cc1b792979d2bde0bbf45cc2a7e436a5f9#code

3.使用increaseApprove和decreaseApprove函数替代Approve函数,Approve函数当中使用require进行安全防范。 例如:

https://etherscan.io/address/0xc98e0639c6d2ec037a615341c369666b110e80e5#code https://etherscan.io/address/0xbb49a51ee5a66ca3a8cbe529379ba44ba67e6771#code https://etherscan.io/address/0x1b22c32cd936cb97c28c5690a0695a82abf688e6#code 

以上的解决方案在众多的智能合约当中都可以见到,其中第一种、第二种居多,第三中偏少。 对于“事务顺序依赖性”问题的解决方案可以从以下两个角度来看:

从安全角度看:第一种、第三种都可以成功的解决“事务顺序依赖性”问题,而第二种仍然无法有效的解决“事务顺序依赖性”问题。 

从ERC20标准来看: 第一种、第三种都违反了ERC20标准规范,第二种符合ERC20标准规范。 

小思考: 加了“require”判断是为了安全,不加是为了标准,你会如何抉择?(虽然该类型的漏洞利用难度比较高)

文末总结

合约的开发者应当建立一套开发标准规范,同时尽可能的搜集网络上公开的现有的合约的漏洞的类型以及利用方法和安全补救方法,之后不断的完善自己的开发体系,而且在合约上线之前建议还是找专门的公司进行合约的安全审计,对合约做一次评估为好。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
“以太坊智能合约设计缺陷问题”影响分析报告
在审计各种智能合约之后,我发现了一类很有趣的问题,这类问题出现的原因不只是由于开发者的疏忽,也同样是因为智能合约本身的一些设计缺陷,在开发者不了解这些问题的基础上,就容易出现问题。
LoRexxar
2023/02/21
3570
“以太坊智能合约设计缺陷问题”影响分析报告
WETH10 - 更高效的 WETH
玩过 DEFI 的应该都知道,很多项目是通过 WETH 把以太币代币化[1],再接入到 ERC20 为主的 DEFI 生态中。
Tiny熊
2020/11/03
1.6K0
WETH10 - 更高效的 WETH
[译]基于以太坊和USDC搭建去中心化金融系统
在Coinbase,我们希望可以创建一个开放的金融系统。我们坚信提高金融的自由度可以让世界更美好。去中心化金融,简称DeFi是一个开放,无界限并且可以程序化的金融,是提供金融自由度的一种方式。
Tiny熊
2020/08/10
1.1K0
黑客攻击成人网站窃取165枚ETH,归还后获奖5000美元
10 月 6 日,基于以太坊的成人娱乐平台 SpankChain 遭受黑客攻击,匿名攻击者利用该平台支付渠道智能合约漏洞窃取 165.38 枚 ETH,价值约 38000 美元。同时该漏洞导致了价值 4000 美元SpankChain的内部代币BOOTY无法流通。
FB客服
2018/10/25
6780
黑客攻击成人网站窃取165枚ETH,归还后获奖5000美元
Meter Bridge && Qubit Bridge
chainbridge-solidity-v1.0.0-eth/deployed_0421/merged at master · meterio/chainbridge-solidity-v1.0.0-eth[3]
Tiny熊
2022/04/08
6180
Meter Bridge && Qubit Bridge
Art Blocks合约要点分析 - 利用 JavaScript 动态生成图片
Art Blocks 是一个创建链上生成 NFT 的平台。但是你知道在链上和链下究竟保留了什么吗?为什么他们的智能合约中需要 JavaScript?
Tiny熊
2022/11/07
6350
Art Blocks合约要点分析 - 利用 JavaScript 动态生成图片
Bancor 危机:Token 背后潜伏的“上帝之手”
包括 Status 和 FunFair 在内的部分国内外热门区块链项目,智能合约存在管理员权限过高的问题,或导致项目存在过度中心化的风险,相关 Token 生态极易发生单点失效。致命问题可能会出现在两个方面:一是项目方滥用权限,二是超级管理员身份被盗用。这两种情况一旦发生,相关 Token 生态可能会迅速崩塌。
区块链领域
2018/07/23
6030
Bancor 危机:Token 背后潜伏的“上帝之手”
涨知识 | 使用imToken钱包还能调用合约!
今天在看以太坊多重签名时,发现都是通过智能合约来实现的(类似投票合约),那么就有一个问题,主流的钱包如imToken,怎么调用智能合约呢。
Tiny熊
2020/06/29
2.3K0
智能合约游戏之殇——类 Fomo3D 攻击分析
作者:LoRexxar'@知道创宇404区块链安全研究团队 发布时间:2018/08/23
Seebug漏洞平台
2018/09/30
6750
智能合约游戏之殇——类 Fomo3D 攻击分析
【链安】竞态条件漏洞分析及详细修复建议
【竞态条件】竞态条件的官方定义是如果程序的执行顺序改变会影响结果,它就属于一个竞态条件。 在智能合约中,竞态条件漏洞被攻击者利用后,攻击者利用一个与存在漏洞合约平起平坐的外部合约竞争夺取控制权,改变该智能合约的行为。 用一个形象的比喻来说明,将智能合约理解成一条高速公路,所有函数和功能理解为车辆,原本的执行顺序规定了车辆经过的顺序,此时一名熟练的老司机,驾驶着GTR在弯道超车加塞,扰乱了整个道路的秩序,抢占了在道路中的领先地位,进而为所欲为,戏耍合约规则。 以太坊智能合约的特点之一是能够调用和利用其它外部合约的代码,调用外部合约主要存在的危险就是外部合约可以接管控制流,并对调用函数不期望的数据进行更改。这类漏洞有多种形式,我们在这里深度解析重入和交易顺序依赖两种。
辉哥
2018/08/10
1.1K0
【链安】竞态条件漏洞分析及详细修复建议
以太坊合约审计 CheckList 之“以太坊智能合约设计缺陷问题”影响分析报告
作者:LoRexxar'@知道创宇404区块链安全研究团队 发布时间:2018/08/22
Seebug漏洞平台
2018/09/30
5500
以太坊合约审计 CheckList 之“以太坊智能合约设计缺陷问题”影响分析报告
blockwell.ai KYC Casper Token “牛皮癣广告” 事件分析
2018年9月7日早上1点左右,许多以太坊钱包账户都收到了一种名为blockwell.ai KYC Casper Token代币转进/出账消息:
Seebug漏洞平台
2018/10/23
5260
blockwell.ai KYC Casper Token “牛皮癣广告” 事件分析
弯道超车老司机戏耍智能合约——竞态条件漏洞 | 漏洞解析连载之三
引子:至道问学之有知无行,分温故为存心,知新为致知,而敦厚为存心,崇礼为致知,此皆百密一疏。—— 清·魏源《庸易通义》
区块链大本营
2018/08/15
6080
弯道超车老司机戏耍智能合约——竞态条件漏洞 | 漏洞解析连载之三
DeFi Saver用户的31万枚DAI是如何被盗的?
2020年10月8号,去中心化钱包imToken发推表示,用户报告称31万枚 DAI被盗,这与 DeFi Saver Exchange漏洞有关。DeFi Saver 对此回应称,被盗资金仍旧安全,正在联系受害用户。截至目前,资金已全部归还受害用户。早在今年6月份DeFi Saver就表示该团队发现DeFi Saver 应用系列中自有交易平台的一个漏洞,此次31万枚 DAI 被盗也与此前的SaverExchange合约漏洞有关。在收到情报后,针对此次 31 万枚 DAI 被盗事件展开具体的分析。
FB客服
2020/11/06
5560
DeFi Saver用户的31万枚DAI是如何被盗的?
ERC20漏洞被这位大哥扒透了!满篇的代码废话少,程序员一定很喜欢
大家下午好,我今天给大家演讲的题目叫做《安全工程师眼中的智能合约》,其实就是我眼中的智能合约。
区块链大本营
2018/08/15
1.7K0
ERC20漏洞被这位大哥扒透了!满篇的代码废话少,程序员一定很喜欢
ERC777 功能型代币(通证)最佳实践
想必很多同学都已经使用过ERC20 创建过代币[1],或许已经被老板要求在ERC20代币上实现一些附加功能搞的焦头烂额,如果还有选择,一定要选择 ERC777 。
Tiny熊
2019/09/30
1.3K0
以太坊智能合约审计 CheckList
在以太坊合约审计checkList中,我将以太坊合约审计中遇到的问题分为5大种,包括编码规范问题、设计缺陷问题、编码安全问题、编码设计问题、编码问题隐患。其中涵盖了超过29种会出现以太坊智能合约审计过程中遇到的问题。帮助智能合约的开发者和安全工作者快速入门智能合约安全。
Seebug漏洞平台
2018/12/13
9970
以太坊智能合约 Owner 相关 CVE 漏洞分析
最近学习了下以太坊的智能合约,而且也看到挺多厂家pr智能合约相关的漏洞,其中《ERC20智能合约整数溢出系列漏洞披露》文章中披露了6个CVE编号的漏洞,而这些漏洞都属于整型溢出漏洞范畴,其中5个漏洞均需要合约Owner才能触发利用。本文正是针对这些漏洞从合约代码及触发逻辑上做了详细分析,并提出了一些关于owner相关漏洞的思考。
Seebug漏洞平台
2018/07/12
7730
以太坊“后偷渡时代”盗币之“拾荒攻击”
作者:Sissel@知道创宇404区块链安全研究团队 发布时间:2018/08/20
Seebug漏洞平台
2018/09/30
1.6K0
以太坊“后偷渡时代”盗币之“拾荒攻击”
如何做智能合约审计?
你可以自己学习,或者你可以使用这份便利的一步步的指南来准确地知道在什么时候该做什么,并对合约进行审计。
辉哥
2018/08/10
1.4K0
推荐阅读
相关推荐
“以太坊智能合约设计缺陷问题”影响分析报告
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文