智能合约漏洞复现-特权提升漏洞

admin 2024年3月28日01:31:19评论5 views字数 1244阅读4分8秒阅读模式

源码地址:

https://github.com/code-423n4/2023-12-autonolas

安全审计报告:

https://github.com/0xEVom/audits/blob/main/code4rena/2023-12-autonolas.md

本文为根据0xEVom的审计报告对漏洞进行的梳理和复现。这位小哥在对Olas合约的审计中获得了$29,515.84

GuardCM.sol

合约文件: governance/contracts/multisigs/GuardCM.sol

根据项目中的governance/test/GuardCM.js文件来看,整体结构如下:

智能合约漏洞复现-特权提升漏洞

GuardCM实现了GnosisSafe合约中的安全检查功能。

智能合约漏洞复现-特权提升漏洞

而GnosisSafe是一个多签钱包的智能合约,在通过GnosisSafe合约执行交易的时候,会通过调用Guard的checkTransaction来进行检查,如果再checkTransaction中没有发生revert,则执行交易execute

智能合约漏洞复现-特权提升漏洞

在checkTransaction函数中主要逻辑是,如果目标地址是timelock,那么不允许进行delegatecall操作,并且只允许执行timelock中的SCHEDULESCHEDULE_BATCH两个函数,如果目标地址是GnosisSafe则直接revert。

但是这里存在一个问题,只有在对timelock和GnosisSafe进行delegatecall的才会revert。

在execTransaction函数中,如果guard地址不等于0,才会进行checkTransaction

guard是通过setGurad函数在合约部署的时候就进行设置的

智能合约漏洞复现-特权提升漏洞

智能合约漏洞复现-特权提升漏洞

但是checkTransaction函数中有一个非常严重的问题就是,没有限制对第三方合约进行delegatecall。

所以可以通过部署恶意合约,然后调用GnosisSafe的函数进行执行,将Gurad设置为空地址。绕过checkTransaction函数对合约交互的检查。

利用方式如下:

1.部署合约

pragma solidity ^0.8.0;
contract DelegatecallExploitContract { bytes32 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8;
function deleteGuardStorage() public { assembly { sstore(GUARD_STORAGE_SLOT, 0) } }}

2.调用execTransaction函数执行

3.调用timelock执行对Gura合约的pause函数delegatecall,因为guard==address(0)执行成功

造成特权升级漏洞


原文始发于微信公众号(漏洞推送):智能合约漏洞复现-特权提升漏洞

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月28日01:31:19
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   智能合约漏洞复现-特权提升漏洞https://cn-sec.com/archives/2594114.html

发表评论

匿名网友 填写信息