源码地址:
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
合约文件: governance/contracts/multisigs/GuardCM.sol
根据项目中的governance/test/GuardCM.js
文件来看,整体结构如下:
GuardCM实现了GnosisSafe合约中的安全检查功能。
而GnosisSafe是一个多签钱包的智能合约,在通过GnosisSafe合约执行交易的时候,会通过调用Guard的checkTransaction来进行检查,如果再checkTransaction
中没有发生revert
,则执行交易execute
在checkTransaction函数中主要逻辑是,如果目标地址是timelock,那么不允许进行delegatecall操作,并且只允许执行timelock中的SCHEDULE
和SCHEDULE_BATCH
两个函数,如果目标地址是GnosisSafe则直接revert。
但是这里存在一个问题,只有在对timelock和GnosisSafe进行delegatecall的才会revert。
在execTransaction函数中,如果guard地址不等于0,才会进行checkTransaction
guard是通过setGurad函数在合约部署的时候就进行设置的
但是checkTransaction函数中有一个非常严重的问题就是,没有限制对第三方合约进行delegatecall。
所以可以通过部署恶意合约,然后调用GnosisSafe的函数进行执行,将Gurad设置为空地址。绕过checkTransaction函数对合约交互的检查。
利用方式如下:
1.部署合约
pragma solidity ^0.8.0;
2.调用execTransaction函数执行
3.调用timelock执行对Gura合约的pause函数delegatecall,因为guard==address(0)执行成功
造成特权升级漏洞