求助大佬对智能合约中重⼊攻击的理解

887次浏览

回答
2个回答

(,,•́ . •̀,,)

2018-11-13

重⼊漏洞应该算是智能合约中最出名同时也是危害⾮常⼤的漏洞了,

the DAO事件中因为它也导致了以太坊的硬分叉,

其实它的实质也就是在使⽤转账功能时将发送交易的逻辑放在了从对应地址中扣款的逻辑之前。


另外在进⾏底层的call调⽤时没有做好对被调⽤地址的检查,

如果⽬标地址是⼀个合约,
那么就可能触发该合约的恶意的回调函数导致出现递归调⽤的情况,

直到耗尽gas或者合约的balance被⽤光。


这种⼀般是对应合约使⽤了call.value( )来执⾏转账逻辑,因为这会带上该交易所有可⽤的gas,

对应的较安全的情况就是使⽤transfer来转账,

因为这样该转账逻辑就只能使⽤2300gas,基本只够完成⼀次调⽤。


此外当合约中存在call注⼊时也很有可能造成重⼊攻击,

这样我们执⾏函数时对应的递归调⽤可能就是攻击合约的恶意函数了,

这样的攻击往往更为巧妙⽽且也不⽤受transfer函数的gas限制的约束。


其实这种漏洞也⽐较好修复,

简单点可以直接把扣款的逻辑放在发送交易之前,
此外最好也做个⽬标地址的检查,过滤合约地址的⽤户,

如有必要也可将对应的call.value()函数进⾏替换。

0评论