solidity再入攻击解释



嘿,我有一个关于重新进入的问题,我知道逻辑,但考虑到交易时间以及a和B中的两个函数都在下一行上,攻击者为什么能在余额设置为0之前再次提款

重新进入

假设我们有两份合同。持有一定以太币的目标合约属于攻击者合约。现在攻击者合约想提取其资金

攻击者合约有两个功能:fallbackwithdraw

// this gets triggered when ether is receive
fallback(){
A.withdraw()
}
attack(){
A.withdraw()
}

假设攻击者合约调用attack函数。这将调用目标合同内的withdraw

目标合同:

withdraw(){
require balance>0
send ether
// before balance gets updated attacker's fallback triggers another withdraw
// send function will give the control to the attacker's contract
set balance of attacker =0
}

现在,目标合约将向攻击者的合约发送ether。当它这样做时,内部攻击者的契约fallback函数被触发。每次接收到乙醚时,都执行fallback。我详细解释了的后备功能

现在攻击者的合约被以太接收,并立即调用目标合约内的withdraw。所以目标合约的withdraw函数是循环的,直到目标合约的余额达到0

如果合同使用call, send or transfer,可能导致控制流到攻击者合约,因为这些函数为回退函数委派了足够的气体。一旦控制权被传递给攻击者的合约,目标合约的状态就会不完整。目标合同失去了控制权。

防止重入攻击

相关内容

  • 没有找到相关文章

最新更新