1、重入攻击
恶意合约A调用某一合约B,让合约B给A转账,恶意合约A在fallback函数中回调合约B给A转账的函数,该函数使用call进行转账因此没有gaslimit限制,并且B记录的A的金额减少是在转账之后。
可重入攻击也就是攻击方发送一笔交易,导致合约一致重复执行直到将合约账户的资源消耗完。这有点类似于C语言的递归函数。攻击方能成功进行可重入攻击,主要依赖于Soildity为智能合约提供的fallback和call函数
以太坊的智能合约,可以声明一个匿名函数(unnamed function),叫做 Fallback 函数,这个函数不带任何参数,也没有返回值。当向这个合约发送消息时,如果没有找到匹配的函数就会调用 fallback 函数。比如向合约转账,但要合约接收 Ether,那么 fallback 函数必须声明为 payable,否则试图向此合约转 ETH 将失败。如下:
function() payable public { // payable 关键字,表明调用此函数,可向合约转 Ether。
}
向合约发送 send、transfer、call 消息时候都会调用 fallback 函数,不同的是 send 和 transfer 有 2300 gas 的限制,也就是传递给 fallback 的只有 2300 gas,这个 gas 只能用于记录日志,因为其他操作都将超过 2300 gas。但 call 则会把剩余的所有 gas 都给 fallback 函数,这有可能导致循环调用。
智能合约之可重入攻击_u010304442的博客-CSDN博客_重入攻击
2、短地址攻击