本文深入分析了针对DAO的治理攻击方式,如闪电贷原子性、EVM操作码注入及法定人数耗尽,并探讨了相应的防御方案。通过复盘Beanstalk和Tornado Cash等真实案例,文章强调了时间锁、N-1区块快照及乐观双重治理架构在保护协议国库安全中的核心作用。
本文内容:治理攻击如何将合法的协议机制——Flash loan 原子性、EVM Opcode 注入、Quorum 枯竭——武器化,以及保护 DAO 金库所需的防御架构(Timelocks、N-1 Checkpointing、乐观双重治理)。
去中心化自治组织 (DAOs) 的出现系统地重构了数字资本协调,用运行在分布式账本上的基于智能合约的治理模型取代了传统的企业层级。在这些环境中,决策是通过 Token 权重的投票系统执行的。然而,去中心化治理的运行现实往往与其理论设计背道而驰。占主导地位的 one token, one vote 模型引入了源自机制设计文献中定义的“不可区分性问题”的系统性脆弱性。许可制区块链网络缺乏原生能力来区分长期、利益一致的利益相关者与为了提取即时财务价值而获取临时投票权的恶意行为者。
与利用加密缺陷或内存泄漏的传统网络攻击不同,governance attacks 将协议合法的、确定性的机制武器化。随着去中心化金融 (DeFi) 协议积累了巨大的锁仓总价值 (TVL),它们的金库成为了经济提取的高利润目标。本文对治理攻击向量提供了严谨的取证分析——包括 flash loan 原子性、EVM Opcode 注入和 quorum 枯竭——并评估了保护协议治理所需的防御架构。
要理解现代治理利用的格局,审计师必须首先分析这些攻击中使用的主要金融原语:Flash loan。Flash loan 允许用户在严格的条件下借入无抵押的流动性——通常是数亿美元,即本金和名义费用必须在完全相同的交易区块内归还。
关键漏洞在于交易的原子性。在以太坊虚拟机 (EVM) 状态机内,一笔交易是不可分割的。如果借款人未能在区块执行序列结束时偿还贷款,智能合约会自动触发 revert Opcode,将全局区块链状态回滚到交易前的状态。因此,贷款人面临零对手方风险。
通过以太坊改进提案 3156 (EIP-3156) 对该机制进行的标准化建立了通用接口,要求提供者合约实现 maxFlashLoan、flashFee 和 flashLoan。同时,借款人的合约必须实现一个严格的回调函数 onFlashLoan,该函数必须返回加密哈希 keccak256("ERC3156FlashBorrower.onFlashLoan") 以验证执行。
1// EIP-3156 flash loan 生命周期
2interface IERC3156FlashBorrower {
3 function onFlashLoan(
4 address initiator,
5 address token,
6 uint256 amount,
7 uint256 fee,
8 bytes calldata data
9 ) external returns (bytes32);
10 // 必须返回 keccak256("ERC3156FlashBorrower.onFlashLoan")
11}
12
13interface IERC3156FlashLender {
14 function maxFlashLoan(address token) external view returns (uint256);
15 function flashFee(address token, uint256 amount) external view returns (uint256);
16 function flashLoan(
17 IERC3156FlashBorrower receiver,
18 address token,
19 uint256 amount,
20 bytes calldata data
21 ) external returns (bool);
22}
当应用于缺乏Timelocks的幼稚 Token 权重治理系统时,原子执行会产生结构性缺陷。攻击者可以编写算法交易来借入数百万个治理 Token,立即批准一个恶意提案以抽干 DAO 金库,并在同一个区块内偿还贷款——执行恶意接管所需的初始资本为零。
这与实现Oracle 操纵攻击的原子执行模型相同,但应用于治理而非价格喂价。关于 Flash loan 机制和 AMM 交互的更深入分析,请参阅我们的 AMM 安全基础指南。

理论上的漏洞,当与 Flash loan 和 EVM 的复杂性结合时,已反复演变为严重的经济损失。对这些利用的取证分析揭示了缺陷机制设计与高可组合性之间的精确交集。
2022 年 4 月对 Beanstalk Farms 的利用导致了 13 秒内 1.82 亿美元的损失,是 Flash loan 辅助治理攻击的典型案例研究。该协议具有一条紧急执行路线,需要三分之二的绝大多数票来绕过标准 Timelocks——这是一种旨在允许对安全漏洞做出快速响应的架构决策。
攻击者存入了少量的合法 Token 以提交 BIP-18,这是一个旨在将协议锁定的资产转移到其个人地址的恶意可执行提案。在等待了法定的 24 小时提案孵化期后,攻击者发起了一个密集的原子交易:
3pool 路由以获取 3Crv 流动性 Token。3Crv 注入 BEAN3CRV-f 池,并将生成的 Token 直接存入 Beanstalk。LibSilo.incrementBipRoots 函数,立即重新计算投票权重,并授予攻击者超过 78% 的总治理权。攻击者抽干了金库,偿还了 Aave Flash loan,并通过 Tornado Cash 混币器路由了大约 7600 万美元的利润。整个利用过程在单个区块内完成。
| 利用指标 | 数值 |
|---|---|
| 借入资本 | 10 亿美元 |
| 获取的治理权 | 78% 以上 |
| 协议损失 | 1.82 亿美元 |
| 攻击者利润 | 约 7600 万美元 |
| 执行时间 | 13 秒(1 个区块) |
| 攻击者初始资本 | 微量(仅提案押金) |
这种模式镜像了在 Oracle 操纵中看到的 Flash loan 攻击机制,但资本扭曲的不是价格喂价,而是治理权重。关于 DeFi 利用模式的更广泛视角,请参阅我们的 2025 利用分析。
虽然 Beanstalk 展示了 Flash loan 的脆弱性,但 2023 年 5 月的 Tornado Cash DAO 沦陷突显了社交工程与可执行字节码注入的结合。攻击者提交了“Proposal 20”,表面上将其呈现为先前提案的良性功能延续。
该利用依赖于 EVM Opcode 操纵。提案包含一个名为 emergencyStop() 的混淆函数,其中包含 EVM Opcode selfdestruct(payable(0))。selfdestruct 在虚拟机层面运行,从指定的以太坊地址完全抹除智能合约的字节码。
1// 简化的利用序列
2
3// 步骤 1:攻击者在确定性地址部署“良性”合约
4contract Decoy {
5 function emergencyStop() external {
6 selfdestruct(payable(0));
7 // 抹除该地址的所有字节码
8 }
9}
10
11// 步骤 2:社区投票批准该合约地址
12// 步骤 3:攻击者触发 selfdestruct,抹除合约
13
14// 步骤 4:使用 CREATE2 确定性部署,
15// 攻击者在同一个地址部署恶意合约
16contract Hostile {
17 function execute() external {
18 // 向攻击者铸造 120 万个虚假治理投票
19 token.mint(attacker, 1_200_000e18);
20 }
21}
22
23// 步骤 5:当 Timelock 对“批准的”地址执行 delegatecall 时,
24// 它现在运行的是恶意负载
一旦社区投票批准了看似良性的合约地址,攻击者就触发了 selfdestruct 指令。利用通过 CREATE2 Opcode 进行的确定性合约创建,攻击者在完全相同的内存地址部署了一个新的恶意合约。当Timelock到期且 DAO 通过delegatecall执行时,它执行了变异的负载。该合约为攻击者铸造了 120 万张虚假选票,摧毁了合法社区约 70,000 张选票,并实现了对协议的全面接管。
类似地,由于缺乏供应铸造限制,Build Finance DAO 的一名攻击者通过了一项恶意提案,铸造了 10 亿个无背书的 $xBUILD Token,稀释了原始持有者并抽走了 470,000 美元。
关于 delegatecall 如何在可升级代理合约中创建攻击面的更多信息,请参阅我们的代理安全指南。

攻击并不总是依赖于原子执行。2024 年 7 月的 Compound Finance 事件展示了 tunneling(隧道攻击),一个名为“Humpy”的实体系统地获取并在多个地址之间委托 COMP Token,以达到关键的选举规模。通过绕过 quorum 防御,他们强行执行了 Proposal 289,以产生收益为幌子,从金库向一个外部多签地址划拨了 2400 万美元。
在 Mango Markets 中,攻击者在流动性不足的 MNGO 治理 Token 上重仓了方向性头寸。通过 Oracle 操纵人为抬高抵押品价值,攻击者产生了巨大的虚假流动性信用以抽干交易所。此外,MakerDAO 面临一次利用,其中“B Protocol”团队使用 50,000 ETH 的 Flash loan 借入 13,000 MKR,立即投票将他们自己的价格 Oracle 列入白名单——这突显了将核心系统参数暴露给原子资本的危险。
| 协议 | 年份 | 攻击向量 | 损失 | 关键失效点 |
|---|---|---|---|---|
| Beanstalk | 2022 | Flash loan 治理 | 1.82 亿美元 | 紧急执行绕过 |
| Tornado Cash | 2023 | CREATE2 + selfdestruct | 全面接管 | 投票后未进行字节码验证 |
| Build Finance | 2022 | Token 铸造提案 | 47 万美元 | 治理铸造无供应上限 |
| Compound | 2024 | Quorum 隧道攻击 | 2400 万美元 | Quorum 阈值不足 |
| Mango Markets | 2022 | Oracle + 治理 | 1.15 亿美元 | 低流动性治理 Token |
| MakerDAO | 2020 | Flash loan 投票 | 已阻止 | Oracle 参数暴露于投票 |
这些事件直接强调了为什么纵深防御不是可选的——单层治理防御在经济驱动的攻击者面前总是会失败。
为了抵消 Flash loan 攻击,协议引入了时间锁定模型,如由 Curve Finance 首创的 Vote-Escrowed Token (veToken)。通过强制用户锁定底层资产长达四年,该架构对投票权重应用对数衰减函数——使原子资本与治理权脱钩。
然而,veToken 的流动性不足催生了一个次级的投票影响力市场(例如 Votium、Hidden Hand)。这些平台算法化地优化贿赂分配,支付管理费后将收益路由给被动投票者。来自 Convex 生态系统的分析数据表明,直接贿赂支付与流动性计量(Liquidity Gauge)批准之间存在 0.99 的实证相关性,证明治理可能退化为纯粹的金融交易主义。这种现象在我们的 AMM 安全与 DEX 经济学深度探讨中有进一步研究。
为了对抗富豪政治卡特尔,设计者实施了平方投票法 (QV),其中投票的财务成本呈几何级数增长:
$Cost = Votes^2$
虽然对巨鲸有效,但许可制网络使 QV 容易受到 Sybil 攻击的影响。攻击者可以将资本分散到 100 个匿名地址,绕过平方惩罚并使系统恢复到线性动态。
1标准投票: 100 tokens → 100 票 (成本: 100)
2平方投票: 100 tokens → 10 票 (成本: 100)
3
4对 QV 的 Sybil 攻击:
5 将 100 tokens 分散到 100 个地址
6 每个地址:1 token → 1 票 (成本: 1)
7 总计:100 票,成本为 100
8 → 平方惩罚被完全绕过
减轻 Sybil 向量需要生物识别模型,即人格证明 (PoP)。Gitcoin 等平台利用 Gitcoin Passport 聚合 Web2/Web3 凭证,根据可验证的人类身份应用加权倍数。此外,链下防御机制采用图Rollup神经网络 (GCNN) 和 Facebook AI 相似性搜索 (FAISS) 来处理来自 Snapshot.org 等平台的维度元数据,成功识别并中和编排好的 Sybil 集群。
关于 MEV 提取如何与治理投票操纵交互的更广泛视角,请参阅我们的 MEV 防御指南。
保护 DAO 安全需要从遗留的智能合约(例如已弃用的 GovernorAlpha)转向多层、OpenZeppelin 标准化的架构。适用于 DeFi 协议的预审计准备原则对于治理合约同样至关重要。
抵御 Flash loan 的主要防御措施是通过 GovernorTimelockControl 进行时间分离。通过在提案批准和自主链上执行之间强制执行不可协商的执行延迟,恶意逻辑被困住。因为 Flash loan 严格要求在单个区块内原子还款,攻击者无法跨越执行负载所需的时间间隔。
1// OpenZeppelin GovernorTimelockControl 模式
2contract SecureGovernor is Governor, GovernorTimelockControl {
3 function _execute(
4 uint256 proposalId,
5 address[] memory targets,
6 uint256[] memory values,
7 bytes[] memory calldatas,
8 bytes32 descriptionHash
9 ) internal override(Governor, GovernorTimelockControl) {
10 // 执行通过 TimelockController 路由
11 // 强制执行强制延迟(例如 48 小时)
12 super._execute(proposalId, targets, values, calldatas, descriptionHash);
13 }
14}
利用 GovernorVotes 和 ERC20Votes 的合约在投票交易期间固有地拒绝实时余额查询。相反,它们执行追溯性的区块普查。如果在区块 N 发生投票,可量化的投票权重严格索引到在区块 N-1 记录的确切库存快照。
1// ERC20Votes checkpoint 机制
2function getVotes(address account, uint256 blockNumber)
3 public view returns (uint256)
4{
5 // 返回历史区块的投票权重,而不是当前余额
6 require(blockNumber < block.number, "区块尚未开采");
7 return _checkpoints[account].getAtBlock(blockNumber);
8}
9
10// Governor 使用此机制计算投票权重
11function _getVotes(
12 address account,
13 uint256 blockNumber,
14 bytes memory /*params*/
15) internal view override returns (uint256) {
16 return token.getPastVotes(account, blockNumber);
17 // 在区块 N+10 获取的 Flash loan Token
18 // 返回的投票权重为零
19}
如果攻击者在区块 N+10 注入 Flash 流动性,投票系统会忽略它,返回的投票权重为零。此外,像 GovernorVotesSuperQuorumFraction 这样的实现对关键的预算变动强制执行绝对总供应量百分比阈值。通过 Snapshot.org 进行的链下投票应用这种精确的区块索引逻辑,以消除 Gas 摩擦,同时保留原子免疫性。
先进的审计框架采用实时执行分析。系统利用“现金流树”和动态仿真环境来跟踪底层的状态突变。在解决 Oracle 操纵时,模拟取证模型(例如在 Warp Finance 上测试的模型)证明,采用公平储备模型(动态限制参数方差窗口)在防止即时侵蚀方面远优于传统时间加权平均价格 (TWAP) 的僵硬数学近似。
对于审计复杂的多合约治理系统的结构化方法,我们的分而治之方法论提供了一个经过验证的框架。将其与模糊测试和形式化验证相结合,以验证对抗条件下的治理不变性。
ERC20Votes 实施 N-1 区块 Checkpointing 以计算投票权重
纯 Token 权重投票的系统性衰竭加速了乐观双重治理的采用。由 Lido 和 Aragon OSx 实施,这种架构严格地将主动立法生成与反应性的、多层否决保护分开。
Optimism Collective 强制执行严格的两院制隔离。Token House 通过 OP Token 治理经济参数,而 Citizens' House 通过 RetroPGF 治理公共物品资金。Citizens' House 严格依赖不可转让的灵魂绑定 NFTs(通过 AttestationStation),保证一个完全不受原子资本影响的、不可伪造的“一个实体,一票”生态系统。
这镜像了软件安全架构中的关注点分离原则——单一受损层不会级联导致整个系统失效。
流动性质押协议面临严重的委托代理困境:LDO Token 持有者治理托管属于 stETH 持有者的 ETH 的智能合约。为了防止 LDO 巨鲸通过恶意逻辑征收底层 ETH 金库,Lido 设计了一个基于 Escrow 合约和“否决信号”的防御堡垒。
如果 LDO 代表通过了一项恶意提案,stETH 持有者可以将其合成资产存入 Escrow 合约:
1Lido 乐观双重治理状态机:
2
3 ┌──────────┐ LDO 提案 ┌─────────────┐
4 │ 正常 │ ────────────────► │ 提案 │
5 │ 状态 │ │ 待处理 │
6 └──────────┘ └──────┬──────┘
7 │
8 stETH 存入 Escrow
9 │
10 ▼
11 ┌─────────────────┐
12 < 1% │ Escrow 余额 │ ≥ 1%
13 ┌───────────│ vs stETH │──────────┐
14 │ │ 总供应量 │ │
15 ▼ └─────────────────┘ ▼
16 ┌──────────┐ ┌──────────────┐
17 │ 执行 │ │ 否决 │
18 │ 提案 │ │ 信号 │
19 └──────────┘ │ (5-45 天 │
20 │ 延迟) │
21 └──────┬───────┘
22 │
23 Escrow 达到 10%
24 │
25 ▼
26 ┌──────────────┐
27 │ RAGE QUIT │
28 │ 状态冻结 │
29 │ 退出路径 │
30 │ 已保证 │
31 └──────────────┘
这种双重治理模型确保即使治理 Token 被捕获——无论是通过 Flash loan、逐渐积累还是市场操纵——其资本实际面临风险的少数利益相关者仍保留加密保证的逃生路径。
了解协议为何需要这些复杂的防御,需要背景知识,即经过审计的 DeFi 协议如何保留更多 TVL——信任架构直接影响资本粘性和协议生存。
DAO 架构的演变是由机制设计者和经济利用者的持续军备竞赛定义的。早期 DAO 的基本假设——即资本集中天生与协议的长期健康一致——已被时间性算法利用和 Flash loan 原子性的兴起彻底摧毁。
为了确保未来的去中心化基础设施,必须放弃对纯线性 Token 投票的依赖。N-1 区块 Checkpointing、严格的 Timelocks 和人格证明框架的实施不再是可选的。最终,安全的架构必须假设恶意接管的可能性统计上大于零。因此,生存之道在于实施具有不可更改的、加密保证的逃生向量的乐观双重治理层,确保少数参与者受到数学代码的严格确定性保护,而非去中心化民主的脆弱承诺。
无论你是在构建新的 DAO,升级现有的治理系统,还是准备进行智能合约审计,此处概述的防御模式都不是可选的——它们是管理重大金库资产的任何协议的最低可行安全架构。
治理安全处于机制设计、博弈论和智能合约工程的交汇点。单个配置错误的投票参数或缺失的 Timelock 可能会使你的整个金库暴露在原子提取风险中。
在 Zealynx,我们专注于智能合约安全审计,在治理架构、Flash loan 防御和纵深防御工作流方面拥有深厚的专业知识。无论你是启动新的 DAO,升级治理合约,还是验证现有的 Timelocks 和 Checkpointing 是否正确实施,我们都能帮助你在攻击者发现架构缺陷之前将其找出。
去中心化自治组织 (DAO) 是一个基于区块链的实体,决策通过智能合约而非中心化管理执行。成员通常持有治理 Token,这些 Token 授予与持有量成比例的投票权——这种模型称为 Token 权重投票。协议变更(参数调整、金库分配、合约升级)的提案在链上提交,Token 持有者投票批准或拒绝。如果提案达到所需的 Quorum 和批准阈值,它将由智能合约自动执行。这消除了人工中介,但当投票机制本身可被操纵时,会产生新的攻击面。
Flash loan 允许任何人在零抵押的情况下借入无限资本,只要在单笔交易内偿还即可。在治理攻击中,对手借入数百万治理 Token,使用它们对恶意提案(如抽干金库)进行投票或执行,并偿还贷款——所有这些都在一个区块内原子完成。攻击者不需要初始资本,如果攻击失败,除了 Gas 费外没有任何风险,因为交易会直接回滚。这正是 2022 年 Beanstalk 遭 1.82 亿美元利用的确切机制。主要的防御措施是时间分离:强制在提案批准和执行之间延迟的 Timelocks,以及仅计算投票前一个区块投票权重的 N-1 区块 Checkpointing,使 Flash loan 获得的 Token 对治理系统不可见。
Quorum 是必须参与投票才能使结果有效的总投票权的最低百分比。它的存在是为了防止提案在大多数 Token 持有者未参与时由极少数人支持通过。然而,将 Quorum 设置得太低允许攻击者在参与度预计较低时(周末、节假日)通过提案。设置得太高则可能导致治理僵局。安全关键的 Quorum 设计应根据总 Token 供应量(而非流通供应量)计算,对金库变动应用更高的阈值,并参考历史参与率以寻找安全与运营连续性之间的平衡。
CREATE2 是一个 EVM Opcode,它根据部署者地址、salt 和合约字节码哈希计算出的确定性地址部署合约。与标准的 CREATE Opcode(其地址取决于 nonce)不同,CREATE2 允许部署合约、使用 selfdestruct 销毁它,然后在同一地址部署一个完全不同的合约。在 Tornado Cash 利用中,攻击者提交了一个“良性”合约供治理批准,在投票通过后将其自毁,然后在完全相同的地址部署了一个恶意合约。当 DAO 的 Timelock 对获批地址执行 delegatecall 时,它在不知情的情况下运行了恶意负载,铸造了 120 万个虚假选票并控制了协议。
Sybil 攻击发生在单一实体创建多个虚假身份以在系统中获得不成比例的影响力时。在平方投票的背景下——投票成本按 $Cost = Votes^2$ 比例增长——这种攻击特别有效。攻击者不是从单个地址花费 100 个 Token 获取 10 票,而是将 100 个 Token 分散到 100 个地址,每个地址获得 1 票(每个成本 1 Token),总计 100 票。这完全绕过了平方惩罚并将系统恢复到线性动态。防御措施包括人格证明验证(例如 Gitcoin Passport)、用于检测协同钱包集群的图分析,以及将链上身份与链下证明相结合的混合模型。
乐观双重治理将主动提案创建与反应性否决保护分开,创建一个不同利益相关者群体相互制衡权力的两院制系统。在 Lido 的实现中,LDO Token 持有者可以通治理提案,但 stETH 持有者(其 ETH 实际处于风险中)可以存入 Escrow 合约以发出反对信号。如果 1% 的 stETH 供应进入托管,提案将延迟 5-45 天。如果 10% 进入托管,将触发永久性的 “Rage Quit”——协议冻结并为少数利益相关者开启一条保证的退出路径,让他们在任何恶意提案执行前撤出 ETH。这确保了即使治理 Token 通过积累或市场操纵被俘获,资产受损的用户仍保留加密退出的保证。
| 术语 | 定义 |
|---|---|
| DAO | 一个基于区块链的组织,由智能合约和 Token 权重投票而非中心化管理治理。 |
| Flash loan | 在单个原子交易内借入并偿还的无抵押贷款,常用于套利或治理攻击。 |
| Governance attack | 一种利用协议合法的投票机制来通过恶意提案或抽干金库资金的利用方式。 |
| Quorum | 治理投票有效必须参与的总投票权的最低百分比。 |
| Timelock | 一种智能合约机制,强制在提案批准和执行之间进行强制延迟,以阻断原子攻击。 |
| Sybil attack | 一个实体创建多个虚假身份以在去中心化系统中获得不成比例影响力的攻击。 |
| Quadratic voting | 一种投票系统,其成本呈几何级数增长 ($Cost = Votes^2$),减少了巨鲸支配地位,但易受 Sybil 攻击。 |
| Rage quit | 一种治理逃生机制,允许少数利益相关者在恶意提案执行前撤出其资产。 |
| Soulbound token | 一种不可转让的 NFT,用于治理中的身份验证,防止基于 Token 的买票行为。 |
- 原文链接: zealynx.io/blogs/dao-gov...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!