任何人都能授权?MakerDaoBot 因此损失 200 枚 ETH(个人对个人能用授权吗) szthrk.cn

核心要点

本期周报收录 1 起发生在 Ethereum 上的安全事件,估计损失约 $542K。

MakerDaoBot 有一个函数缺少访问控制,任意调用者都能让外部合约控制该 bot 的内部余额。

凡是能授予资金控制权的函数,都必须同时验证调用者和接收该权限的合约。

预计阅读时长 5 分钟

过去一周(2026/10/05 - 2026/10/11),我们共观测到 1 起安全事件,估计总损失约 $542K。

图 1:本期安全事件概览

本周看点:MakerDaoBot

2026 年 10 月 6 日,攻击者利用 Ethereum 上 MakerDAO 旧版清算 bot MakerDaoBot缺少访问控制的问题,提走200 枚 ETH,价值约 $542K。

漏洞函数允许任意调用者传入外部合约,授权其控制 bot 的余额,并执行其中的代码。攻击者借此结算了 4 场旧抵押品拍卖,并在一笔交易中转走释放的 ETH。

背景

MakerDaoBot 通过 Flipper 参与 MakerDAO 旧版 ETH-A 抵押品拍卖;Flipper 是旧清算系统使用的抵押品拍卖合约。该 bot 负责管理 Vat 权限、存取 ETH 和 DAI,并处理清算任务。

Vat 是 MakerDAO 的内部账本。它按抵押品类型把每个地址的可用抵押品记在 gem[ilk][address]中,并把内部 DAI 额度记在 dai[address]中;这里不存在另一个钱包或账户合约。

因此,MakerDaoBot 的 Vat 余额指的是记在 bot 合约自身地址名下的账本条目。

调用 hope(usr)不会转移这些余额。该函数会把 can[msg.sender][usr]设为 1,让 usr 通过 Vat 的 wish()权限校验,从而操作记在 msg.sender 名下的余额。

flux()和 move()等函数在转移内部抵押品或 DAI 时都会执行这项校验。

图 2:Vat 的余额记录与转移权限校验

漏洞分析

根因是 MakerDaoBot 合约0x6839...5546的 0x8804d1de()函数缺少访问控制。

该函数把 varg0 当作外部合约地址(下文称 adapter),依次对该地址调用 drip()、vat(),之后还会调用 join()。bot 通过 vat()取得 Vat 地址后,会检查 adapter 能否操作自己的 Vat 余额;

如果尚未授权,bot 便调用 hope(varg0)授予权限,随后调用同一个 adapter 的 join()函数。

图 3:漏洞函数向外部传入的 adapter 授予 Vat 权限

同一合约中的其他特权入口会先执行 ds-auth 校验,再继续操作。下方对照图展示了两个受保护的入口:它们把一个 bytes4 selector 和 msg.sender 传入鉴权逻辑;

校验失败时,函数会以 ds-auth-unauthorized 回退。0x8804d1de()没有对应的调用者校验。

图 4:同一合约中其他特权入口的 ds-auth 校验

因此,任意调用者都能通过 0x8804d1de()指定获得 Vat 权限的地址。bot 会先通过 hope()授权该地址,随后立即调用其 join()函数。

在这次外部调用期间,授权仍然有效,因此该地址中的代码可以操作 bot 的内部抵押品和 DAI 余额。

攻击分析

以下分析基于交易0xbb6940...f3a88c:

  • Step 1:攻击者 EOA 调用其部署的攻击合约。该攻击合约部署恶意 adapter,随后调用 MakerDaoBot 的 0x8804d1de()函数并传入 adapter 地址。bot 在 Vat 的 can 映射中没有查到现有授权,于是调用 hope(),允许 adapter 操作记在 bot 地址名下的余额。

图 5:攻击合约部署恶意 adapter 并取得 Vat 权限

  • Step 2:MakerDaoBot 调用 adapter 的 join()函数。授权生效期间,恶意代码对已停用的 ETH-A Flipper 调用 deal(uint256 id),结算编号 1457、1458、1459 和 1460 的 4 场拍卖。随后,adapter 利用 Vat 权限把 200 单位 ETH-A 抵押品从 MakerDaoBot 转给自己,通过 ETH Join 的 exit()取得 200 枚 WETH,并把这些代币转入攻击者创建的攻击合约。

图 6:结算四场旧拍卖并转出 200 枚 WETH

  • Step 3:攻击合约解包 200 枚 WETH,并向攻击者 EOA 发送 200 枚 ETH,当时价值约 $542K。

图 7:攻击合约解包 WETH 并向攻击者转出 200 枚 ETH

结论

根因是 MakerDaoBot 缺少访问控制,而非 MakerDAO Vat 权限系统本身存在缺陷。一个公开函数允许任意调用者指定外部合约,把 bot 内部余额的控制权交给该合约,并执行其中的代码。

攻击者借此结算 4 场旧版拍卖,随后提走 200 枚 ETH。

任何能够授予资产控制权的函数,都必须同时限制操作发起者和权限接收方。敏感的外部集成路径应采用与其他特权函数相同的授权控制,并且只接受明确批准的合约。