過去一週(2026/10/05 - 2026/10/11),我們觀察到 1 起安全事件,估計總損失約為 $542K。
| 日期 | 事件 | 類型 | 估計損失 |
|---|---|---|---|
| 2026/10/06 | MakerDaoBot | 缺乏存取控制 | ~$542K |
本週焦點:MakerDaoBot
2026 年 10 月 6 日,攻擊者利用以太坊上舊版 MakerDAO 清算機器人 MakerDaoBot 缺乏存取控制的漏洞,提取了 200 ETH,價值約 $542K。存在漏洞的函式允許任何呼叫者指定外部合約,授予該合約控制機器人餘額的權限,並執行其程式碼。攻擊者利用這個途徑,在單筆交易中結算了四場舊版抵押品拍賣,並轉走釋出的 ETH。
背景
MakerDaoBot 透過舊版清算系統使用的抵押品拍賣合約 Flipper,參與 MakerDAO 舊版 ETH-A 抵押品拍賣。該機器人管理 Vat 權限、存入及提取 ETH 和 DAI,並處理清算任務。
Vat 是 MakerDAO 的內部帳本。它在 gem[ilk][address] 中記錄各地址按抵押品類型劃分的可用抵押品,並在 dai[address] 中記錄其內部 DAI 餘額;不存在獨立的錢包或帳戶合約。因此,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);
}
漏洞分析
根本原因是位於 0x6839...5546 的 MakerDaoBot 合約中,函式 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:攻擊者的外部帳戶呼叫了其部署的攻擊合約。該合約部署一個惡意適配器,隨後以適配器地址呼叫 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解除封裝,並向攻擊者的外部帳戶發送 200ETH,當時價值約 $542K。

結論
根本原因是 MakerDaoBot 缺乏存取控制,而非 MakerDAO 的 Vat 權限系統存在缺陷。一個公開函式允許任何呼叫者選擇外部合約,授予其控制機器人內部餘額的權限,並執行其程式碼。攻擊者利用這個途徑結算了四場舊版拍賣,並提取 200 ETH。
任何授予資產控制權的函式,都必須限制誰能發起操作,以及哪些外部合約可以取得該權限。敏感的整合流程應採用與其他特權函式相同的授權控制,並且只接受明確核准的合約。
頂尖 Web3 安全審計團隊
上線前驗證設計、程式碼和業務邏輯
關於 BlockSec
BlockSec 是提供全方位服務的區塊鏈安全與加密資產合規服務商。我們打造的產品與服務,協助客戶在協議與平台的完整生命週期中,進行程式碼審計(包括智慧合約、區塊鏈和錢包)、即時攔截攻擊、分析事件、追蹤非法資金,以及履行反洗錢與打擊資恐(AML/CFT)義務。
BlockSec 已在頂尖會議發表多篇區塊鏈安全論文、通報多起 DeFi 應用程式的零日攻擊、阻止多起駭客攻擊並挽救超過 2,000 萬美元資產,也保障了價值數十億美元的加密資產安全。
-
官方 Twitter 帳號:https://twitter.com/BlockSecTeam
-
🔗 BlockSec 審計服務 : 提交申請



