智能合约升级代理的安全问题与防御措施

关于openzepplin智能合约可升级代理的安全问题与防御措施。

智能合约升级代理

最新的合约升级方式,主要有两种:透明代理(Transparent Proxy)和UUPS(EIP1822)

题外话:不可升级代理(“最小代理”)可以参考EIP1167,不可升级代理是为了减少部署成本。

参考链接

  1. 全面理解智能合约升级 https://learnblockchain.cn/article/1933

潜在的问题和攻击

函数选择器冲突攻击

透明代理解决了这一冲突。通过区分Admin管理员和普通用户,来实现代理合约和实际逻辑合约的调用隔离。

存储冲突问题

解决方案:模仿Solidity如何处理映射和动态大小的数组,使用非结构化存储模式。

合约初始化问题

一般来说,构造函数在合约部署成功后便被丢弃。那么Proxy合约在设置impl合约时无法通过常规方式进行合约初始化。

解决方案:OpenZeppelin合约包含一个基础可初始化合约提供实现此模式的initializer修饰符。使用initializer函数来进行初始化,同时需要确保initializer函数只被调用一次。

delegatecall问题

delegatecall在调用合约时,如果目标合约地址不存在,也会顺利调用返回。

因此需要警惕合约地址不存在的情况。

自毁问题

impl合约应该禁止使用自毁函数。如果impl合约被通过selfdestruct指令清除,在Proxy合约层面delegatecall会继续顺利调用,但是合约已经被销毁。另外如果用于管理升级的逻辑位于impl合约中而不位于proxy合约中(如使用了UUPS代理模式),则实际上会导致再也无法使用代理。

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 2022-05-26 01:41
  • 阅读 ( 477 )
  • 学分 ( 3 )
  • 分类:智能合约

0 条评论

请先 登录 后评论
退学写码
退学写码

3 篇文章, 81 学分