智能合约漏洞复现-特权提升漏洞
2024-3-21 21:41:58 Author: mp.weixin.qq.com(查看原文) 阅读量:3 收藏

源码地址:

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)执行成功

造成特权升级漏洞


文章来源: https://mp.weixin.qq.com/s?__biz=MzU5MTExMjYwMA==&mid=2247485676&idx=1&sn=240a4c171ff8035b83dfd2781ebec314&chksm=fe32b81bc945310dc15020b79f68ea2eb25d8a18c5b44f2beef9ac8186c45a957c252409c094&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh