以太坊君士坦丁堡分叉激活可重入性攻击

来源: 作者: 2019/01/17

以太坊社区已经确定由于可重入性攻击 推迟君士坦丁堡分叉,

本文由财经网-链上财经翻译自Medium,

作者:ChainSecurity 编译:LornaQ

链接:https://medium.com/chainsecurity/constantinople-enables-new-reentrancy-attack-ace4088297d9

以太坊社区的主要利害关系人已经确定推迟君士坦丁堡分叉,按原定计划,该分叉将在 2019 年 1 月 16 日的 7,080,000 号区块上发生。据悉,此次分叉减少存储操作中gas的花费。

但同时存在弊端,当通过12使用Solidity智能合约时出现可重入性攻击。

代码出现了什么问题?

下图例举了在君士坦丁堡分叉前不易受到可重入性攻击的一小段智能合约,但之后易受到攻击。链接显示了Githunb包括攻击合约在内的完整合约。

3

此代码在未预料到的情况下易受到攻击:两个机构可共同收到基金,随后决定如何split,如果他们达成共识的话会收到支付款。攻击者可创建一组地址,第一个地址是攻击者自己的合约,第二个地址是任意一个其他攻击者的账号。攻击者需要在创建这一组地址时存一些数字资产在账户中。

4

攻击者在他自己的合约上启动攻击功能,随后会在一笔交易中出现以下情况:

1.攻击者运用5设置当前分账,此操作旨在确保升级后花费便宜。这是君士坦丁堡分叉的作用。一旦攻击者用这种方式设置split,预设情况下,他的第一个地址将收到所有资金。

2.攻击者合约6启动功能,这将执行检查,然后利用7将这组账号中所有的存款发送到合约中。

3.利用退回上一步功能,攻击者将split又一次升级,确保指定所有资金转到他的第二个账号。

4.继续执行6,所有的预存款将转移到攻击者的第二个账号。

简而言之,攻击者从PaymentShare合约中盗取他人的以太坊,而且可以持续这样做。 

此次可攻击的原因

在君士坦丁堡分叉之前,每次使用数据储存需要花费至少5000 gas,这远远超过通过78启动合约花费的gas多(约2300)。君士坦丁堡分叉之后,用数据储存仅需要花费200 gas。如果想要在数据储存上作恶,就需要在正在交易时进行攻击。如上所示,通过启动公共功能来改变所需变量,攻击者合约就会收到资金。接下来,通过启动攻击者合约导致易受攻击合约启动。

例如,在9上,攻击者合约可使用2300gas来成功操纵已被攻击的合约的变量。

要使合约一被攻击需要满足一下条件:

1.函数A,10紧接着状态改变操作,这一步骤可能不显著,例如,第二个7或与其它智能合约的互动。

2.攻击者必须能够访问函数B,它可以(a)改变状态,(b)状态变化后与函数A发生冲突。

3.函数B需要少于1600气体才能执行(2300gas -call提供700gas)。

如何测试智能合约是否易受攻击?

(1)检测7之后是否有其他操作

(2)检测这些操作是否改变存储状态,通常通过确认一些存储变量,如果你启动另一合约,例如,7通证,检测那些变量被修改,并且做一个列表进行记录。

(3)检测通过非admins访问你的合约的其他方法中是否使用其中的变量。

(4)检测些方法是否自行改变存储状态.

(5)检查使用方式是否低于2300gas,记住sstore操作可能仅花费200gas。

如果出现这种情况,攻击者很可能正在攻击你的合约Checks-Effects-Interactions模式是身份重要的。

编辑:覃耀
分享到:

相关新闻