请选择 进入手机版 | 继续访问电脑版
首页 / 区块链 / 正文
区块链研究实验室:以太坊伊斯坦布尔之后的重入攻击问题 | 火星技术帖
万胜 发表于:2019-12-21 13:50:14 复制链接 看图 发表新帖
阅读数:829
区块链研究实验室:以太坊伊斯坦布尔之后的重入攻击问题 | 火星技术帖_万胜于2019-12-21 13:50:14发布在理财客_互联网理财小白首选之站|http://www.licaiker.com/thread-41455-1-1.html
免责声明:本文旨在转达更多市场信息,不构成任何投资发起。文章仅代表作者观点,不代表火星财经官方态度。
小编:记得关注哦
泉源:区块链研究实行室
如安在以太坊伊斯坦布尔硬分叉之后掩护你的智能合约不被重入攻击。
即将于12月初推出的伊斯坦布尔硬分叉包罗EIP1884:“限定trie巨细有关的操纵码”。关键字是“限定”,这意味着某些指令如今将淹灭更多的气体来实行。近来对此举行了许多讨论的缘故原由是现有的可以少量气体运行代码,硬分叉后大概凌驾该限定,并导致会出现“out of gas”错误。
“以少量气体运行代码”的一个特例是任何Solidity智能合约中的fallback函数,由于它是由Solidity的transfer函数或Solidity和Vyper的send函数触发的以太坊转达过程中运行的代码。transfer和send都只允许以太坊的吸收者以2300的气体(现实上是零)。伊斯坦布尔到分叉后,靠近此限定的fallback函数大概会制止工作,而任何调用这些函数的智能合约都将在有限的气体中制止工作。
出于安全缘故原由,到如今为止,保举使用transfer和send来传输Ether。它们所允许的气体不敷以举行重入攻击,因此有论据以为,它将掩护智能合约免受它们的陵犯。确实有……但是以太坊开辟者社区如今正面对如许一个现实,即操纵码订价不能被以为是稳固的,而且假如我们盼望构建面向未来的体系,我们应该寻求其他确保安全的方法。即我们应该制止使用transfer,而转而使用其他发送以太网的方法,而应依靠其他安全技能来防止重入攻击。
本文先容了可重入性,如今可用于根据它得到智能合约的技能,以及怎样使用OpenZeppelin合约轻松在项目中实现它们。特殊值得一提的是我们还没有提到的一种技能:提款付出法(pull payments)。
什么是可重入攻击?
智能合约在正常实行期间可以通过实行函数调用或简单地转移以太坊来实行对其他智能合约的调用。这些智能合约本身可以称为其他智能合约。特殊是它们可以回调到调用他们的智能合约或回调栈中的任何其他智能合约。在这种环境下,我们说智能合约被重新输入,这种环境被称为可重入性。
区块链研究实验室:以太坊伊斯坦布尔之后的重入攻击问题 | 火星技术帖_万胜于2019-12-21 13:50:14发布在理财客_互联网理财小白首选之站|http://www.licaiker.com/thread-41455-1-1.html 重入本身不是标题。当智能合约以“差异等”状态重新输入时,就会出现标题。当智能合约特定的稳固量建立时,状态被以为是同等的。比方对于ERC20重要稳固性是全部智能合约余额的总和不凌驾已知的总供应量。
通常函数假定它们开始运行时便以同等的状态观察智能合约,而且它们还允许一旦完成运行就使智能合约保持同等。在实行过程中,大概会违反稳固量,这很好,只要没有人能观察到差异等的状态。标题在于通过重入,这成为大概。函数完成时,不但要保持稳固量,还必须在每个埋伏的重入点保持稳固。
当我们调用不受信托的智能合约或将资金转入不受信托的帐户时,我们的代码容易受到重入攻击的攻击。可以对这些帐户举行特殊编程,以在重入调用期间滥用稳固违规。
这里的稳固之处在于,智能合约中的资金额便是余额映射中全部条目的总和。在第三行实行调用期间,由于_amount资金已转出,但余额尚未更新,因此稳固量被粉碎了。 由于msg.sender可以是智能合约,因此同一调用允许重入。 假如攻击者此时触发了重入,他们将可以大概从破裂的稳固量中赢利。
function withdraw(uint _amount) public {
if (amount
msg.sender.call.value(_amount);
balances[msg.sender] -= _amount;
}
}
如今,我们将看到几种抵抗这些攻击的方法。
Checks-Effects-Interactions(查抄-效果-交互)
我们应该提到的第一种技能称为Checks-Effects-Interactions模式。 它形貌了一种在函数中构造语句的方法,以使智能合约的状态在调出其他智能合约之前处于同等的状态。通过将每个语句分类为查抄,效果(状态更改)或交互作用,并确保严酷按照此次序举行操纵来完成此操纵。通过在交互之前放置效果,我们可以确保全部状态更改都在任何埋伏的重入点之前完成,从而使状态保持同等。
已经对这种模式举行了许多讨论,您应该在Solidity文档中和ConsenSys的最佳实践中对其举行阅读。
但是我们应该对这种方法不满足,由于它容易受到人为错误的影响:步调员必须精确地应用它,而审阅者必须发现任何错误。是否可以减轻穷人的这种责任?
ReentrancyGuard(重入掩护)
假如在实行的任何时间不确定智能合约的稳固量是否建立,则应制止调用其他(不可信)智能合约,由于它们大概会被重入。 假如我们别无选择,可以实验使用ReentrancyGuard来防止可重入。
ReentrancyGuard(重入掩护)是一段代码,当检测到重入时,该实行会导致实行失败。OpenZeppelin合约中有一个称为ReentrancyGuard(重入掩护)的模式实现,该模式提供了nonReentrant修饰符。将此修饰符应用于函数将使其变为“不可重入”,而且通过重新调用将拒绝重新输入该函数的实验。
区块链研究实验室:以太坊伊斯坦布尔之后的重入攻击问题 | 火星技术帖_万胜于2019-12-21 13:50:14发布在理财客_互联网理财小白首选之站|http://www.licaiker.com/thread-41455-1-1.html 当我们的智能合约具有多个函数时会发生什么? 由于修饰符是针对每个函数的应用,因此假如要完全防止重入攻击,则必须将其应用于全部函数。否则假如它对不可变的变量很敏感,仍旧有大概重新进入另一个函数并将其用于重入攻击。
区块链研究实验室:以太坊伊斯坦布尔之后的重入攻击问题 | 火星技术帖_万胜于2019-12-21 13:50:14发布在理财客_互联网理财小白首选之站|http://www.licaiker.com/thread-41455-1-1.html 但是假如我们决定使每个函数都nonReentrant,则应牢记Solidity的public变量。标志为public的合约变量将天生一个getter函数以读取其值,而且无法对该函数应用修饰符。在大多数环境下,这不会引起重入标题,但仍旧值得担心,由于它大概会导致其他合约由于不可变而导致状态差异等的环境(假设它们会保存)。
只管有全部注意事项,但在某些环境下,重入防护(reentrancy guards)大概会很有代价。但是要完全消除可重入性也有其弊端:在某些环境下,可重入性是安全的,而且随着以太坊智能合约变得更加复杂,可组合和相互接洽,我们大概会在外看到它的合法用途。
Pull Payments(提款付出法)
假如我们将Ether转移到合约中但未实行其代码,则根本无法重入。通过使用selfdestruct,可以在EVM中绕过吸收器的代码。但是吸收以太币的合约须要以某种方式举行处理惩罚,而且大多数没有编程为处理惩罚通过自毁而收到的资金,这大概导致资金丧失。
另一种选择是提款付出模式(pull payment )。这个想法是与其将资金“推”到吸收者,不如将它们“拉”出合约。 OpenZeppelin合约在PullPayment合约中实现了这种模式。继续此协定将提供类似于转达的内部函数_asyncTransfer。但是它不会将资金发送给吸收方,而是将其转移到托管合约中。别的PullPayment还为吸收者提供Public函数以提取其付款:withdrawPayments和withdrawPaymentsWithGas。
OpenZeppelin Contracts 2.4中添加了第二个下令withdrawPaymentsWithGas,以修复伊斯坦布尔的操纵码重新订价,并在现实的以太坊转移过程中将全部可用的气体转发给吸收器。请注意此时可以重新输入,但这是安全的,由于PullPayment(提款付出法)不会使您的合约的任何稳固式无效。
区块链研究实验室:以太坊伊斯坦布尔之后的重入攻击问题 | 火星技术帖_万胜于2019-12-21 13:50:14发布在理财客_互联网理财小白首选之站|http://www.licaiker.com/thread-41455-1-1.html 值得一提的是,提款功能可以由任何人调用,而不但仅是吸收方。这意味着收款人无需知道这是预付款的目的,这在现有的智能合约无法自行付款时尤其告急。
总 结
由于操纵码订价不稳固,我们不能再依靠转移了,因此在后伊斯坦布尔天下中,重入变得不可制止。攻击者可以将其用于粉碎状态稳固性时调用不信托帐户的合约。有须要通过根据checks-effects-interactions模式构造代码,或使用诸如ReentrancyGuard(重入掩护)步调或Pull Payments(提款付出法)等工具来对我们的合约举行编程,以防止重入攻击。

文章来自理财客-www.licaiker.com 网络收集整理
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
条评论
您需要登录后才可以回帖 登录 | 立即注册
高级
相关推荐
©2001-2018 理财客_理财小白的首选之站 http://www.licaiker.com/中国互联网举报中心非经营性网站互联网理财综合门户网-理财客公安网备 地图索引 网站地图 网站地图1 网站地图2 网站地图3 网站标签
站点统计Archiver手机版小黑屋广告合作客服QQ:1259985689 理财客