过去一周(2026/10/05 - 2026/10/11),我们观察到 1 起安全事件,估计损失总额约为 54.2 万美元。
| 日期 | 事件 | 类型 | 估计损失 |
|---|---|---|---|
| 2026/10/06 | MakerDaoBot | 缺乏访问控制 | 约 54.2 万美元 |
本周焦点:MakerDaoBot
2026 年 10 月 6 日,攻击者利用以太坊上 MakerDAO 旧版清算机器人 MakerDaoBot 缺乏访问控制的漏洞,提取了 200 ETH,价值约 54.2 万美元。该漏洞函数允许任何调用者指定一个外部合约、授予其控制机器人余额的权限,并执行其代码。攻击者通过这一路径,在一笔交易中结算了四场旧的抵押品拍卖,并转走了释放的 ETH。
背景
MakerDaoBot 通过 Flipper 参与 MakerDAO 旧版 ETH-A 抵押品拍卖。Flipper 是旧版清算系统使用的抵押品拍卖合约。该机器人管理 Vat 权限、存取 ETH 和 DAI,并处理清算任务。
Vat 是 MakerDAO 的内部账本。它按抵押品类型将每个地址的可用抵押品记录在 gem[ilk][address] 中,并将其内部 DAI 余额记录在 dai[address] 中;不存在单独的钱包或账户合约。因此,MakerDaoBot 的 Vat 余额是记录在机器人合约自身地址名下的账本条目。
调用 hope(usr) 不会转移这些余额。它会将 can[msg.sender][usr] 设为 1,使 usr 能够通过 Vat 的 wish() 权限检查,操作记录在 msg.sender 名下的余额。flux() 和 move() 等函数在转移内部抵押品或 DAI 时会使用这一检查。
mapping(address => mapping (address => uint)) public can;
function hope(address usr) external note { can[msg.sender][usr] = 1; }
function nope(address usr) external note { can[msg.sender][usr] = 0; }
function wish(address bit, address usr) internal view returns (bool) {
return either(bit == usr, can[bit][usr] == 1);
}
mapping (bytes32 => mapping (address => uint)) public gem; // [wad]
mapping (address => uint256) public dai; // [rad]
function flux(bytes32 ilk, address src, address dst, uint256 wad) external note {
require(wish(src, msg.sender), "Vat/not-allowed");
gem[ilk][src] = sub(gem[ilk][src], wad);
gem[ilk][dst] = add(gem[ilk][dst], wad);
}
function move(address src, address dst, uint256 rad) external note {
require(wish(src, msg.sender), "Vat/not-allowed");
dai[src] = sub(dai[src], rad);
dai[dst] = add(dai[dst], rad);
}
漏洞分析
根本原因是 MakerDaoBot 合约 0x6839...5546 中的 0x8804d1de() 函数缺乏访问控制。该函数将 varg0 视为外部合约地址(下文称为适配器),并调用该地址上的 drip()、vat(),随后调用 join()。机器人通过 vat() 获取 Vat 地址后,会检查适配器是否可以操作其 Vat 余额。如果不能,机器人就会调用 hope(varg0) 授予权限,然后调用同一适配器上的 join()。

同一合约中的其他特权入口在执行操作前使用了 ds-auth 检查。下方对比显示,两个受保护的入口将一个 bytes4 选择器和 msg.sender 传入授权辅助函数,并在检查失败时以 ds-auth-unauthorized 回退。而 0x8804d1de() 函数没有相应的调用者检查。

因此,0x8804d1de() 函数允许任何调用者选择获得 Vat 权限的地址。机器人通过 hope() 授予该地址权限,并立即调用其 join() 函数。在这次外部调用期间,授权仍然有效,使所选地址上的代码能够操作机器人的内部抵押品和 DAI 余额。
攻击分析
以下分析基于交易 0xbb6940...f3a88c。
- 步骤 1:攻击者的 EOA 调用了其部署的攻击合约。该合约部署了一个恶意适配器,然后以适配器地址为参数调用 MakerDaoBot 的
0x8804d1de()函数。机器人发现 Vat 的can映射中没有现有授权,于是调用hope(),允许适配器操作记录在机器人地址名下的余额。

- 步骤 2:MakerDaoBot 调用了适配器的
join()函数。在授权有效期间,恶意代码调用已退役的ETH-AFlipper 上的deal(uint256 id),结算了编号为 1457、1458、1459 和 1460 的拍卖。随后,适配器利用获得的 Vat 权限,将 200 单位的ETH-A抵押品从 MakerDaoBot 转移至自身,通过 ETH Join 提取并获得 200WETH,再将这些代币转给攻击合约。

- 步骤 3:攻击合约将 200
WETH解包,并向攻击者的 EOA 发送了 200ETH,当时价值约 54.2 万美元。

结论
根本原因是 MakerDaoBot 缺乏访问控制,而不是 MakerDAO 的 Vat 权限系统存在缺陷。一个公开函数允许任何调用者选择外部合约、授予其控制机器人内部余额的权限,并执行其代码。攻击者通过这一路径结算了四场旧版拍卖,并提取了 200 ETH。
任何会授予资产控制权的函数,都必须限制谁可以发起操作,以及哪些外部合约可以获得该权限。敏感的集成路径应采用与其他特权函数相同的授权控制,并且只接受明确获批的合约。
Web3 领域卓越的安全审计机构
在上线前验证设计、代码和业务逻辑
关于 BlockSec
BlockSec 是一家提供全栈区块链安全与加密资产合规服务的机构。我们打造的产品和服务,帮助客户在协议和平台的整个生命周期内完成代码审计(包括智能合约、区块链和钱包)、实时拦截攻击、分析安全事件、追踪非法资金,并履行反洗钱和反恐怖融资(AML/CFT)义务。
BlockSec 已在知名会议上发表多篇区块链安全论文,报告了多起 DeFi 应用的零日攻击,拦截了多起黑客攻击并挽救了超过 2000 万美元的资产,还保护了价值数十亿美元的加密资产。
-
官方 Twitter 账号:https://twitter.com/BlockSecTeam
-
🔗 BlockSec 审计服务 : 提交申请



