可重入漏洞是智能合约中最危险的漏洞之一,它可能导致合约余额(以太)被攻击者窃取。如果一个合约中的支付函数调用(即call.value()、deposit.value()、transfer()等)被用来调用其他合约,而被调用方也调用调用方,从而再次进入调用方,则会发生这种情况。它将最终提取调用方合约账户的全部金额,而区块中的记录只是第一次提取。例如,在图中,攻击者调用合约Attack中的attack函数(第23行),它将通过第24行执行合约Reentrance中的withdraw函数。当合约Reentrrance执行withdraw函数(第3行),它将使用一个调用语句发送ether到Attack合约(第6行)。然而,在solidity语言,当外部账户,或其他合约发送ether到一个合约地址,被调用者合约的回退函数将被执行。因此,此时,合约Attack使用Attack.fallback函数响应转账(第27行)。Attack.fallback函数调用Reentrance.withdraw函数,再次提取ether(第29行)。因此,合约Attack会一直从合约Reentrance中取出ether,直到gas耗尽,并且扣除合约Attack所持有的token数量的语句(deduct-statement)只执行一次。
智能合约重入漏洞
于 2022-05-21 16:37:13 首次发布