安全与风控
分析 DeFi 协议安全漏洞时使用的攻击模式清单(闪电贷…
在审计或攻击模拟 DeFi 协议时,按闪电贷、价格预言机、MEV、精度损失、治理、跨链桥、代币标准等维度系统排查可利用的攻击面。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
分析 DeFi 协议安全漏洞时使用的攻击通用
解决思路
- 闪电贷攻击:利用单笔交易内无抵押借贷,整个「借→用→还」循环必须原子完成,还款失败则整笔交易回滚;常见提供方包括 Aave V3(0.05% 手续费,白名单可 0)、dYdX(0)、Uniswap V3(0.3%)、Balancer(协议可配置)。
- 价格预言机操纵(闪电贷版):闪电借出 100,000 WETH → 在 AMM_A 上把 WETH 换成 TOKEN 抬高现货价 → 在读取 AMM_A 现货价作为预言机的借贷协议中存入少量被高估的 TOKEN 作抵押并借出大量 WETH → 在 AMM_A 上换回 TOKEN 恢复价格 → 偿还闪电贷 → 保留借出的 WETH;关键点:使用 AMM 现货储备(getReserves())作预言机的协议易受攻击,应使用 TWAP 或 Chainlink 等外部预言机。
- 通过重入抽干流动性池:闪电借入资金 → 存入池中 → 在回调期间触发重入 → 取出超过存入的金额 → 偿还贷款;利用闪电贷资金与池记账逻辑中重入的组合。
- 治理闪电贷攻击:闪电借入治理代币 → 创建/投票恶意提案(若无快照或时间锁)→ 提案立即通过 → 执行提案(抽干国库、更换管理员等)→ 归还治理代币;防御:基于快照的投票(Compound Governor Bravo)、时间锁、最短提案期。
- 区分预言机类型与操纵成本:现货价(getReserves())单笔大额 swap 即可操纵(可闪电贷),TWAP 需跨多区块持续操纵(昂贵),Chainlink 聚合器需攻陷多数预言机节点(实际不可行)。
- AMM 操纵流程:正常池 1000 ETH + 1,000,000 USDC(价格 1000 USDC/ETH)→ 向池中 swap 9000 ETH,池变为 10000 ETH + 100,000 USDC,现货价跌至 10 USDC/ETH → 依赖合约按错误价格清算或允许廉价借出 → 换回 ETH 恢复价格 → 净利润 = 从依赖合约提取的价值 − swap 滑点 − 手续费。
- Chainlink 预言机陈旧性检查:读取 latestRoundData() 后必须校验 price > 0、updatedAt != 0、block.timestamp - updatedAt < HEARTBEAT、answeredInRound >= roundId;预言机陈旧(网络拥堵、L2 sequencer 宕机)时价格可能滞后数小时,可被套利;L2 sequencer 风险:Arbitrum/Optimism sequencer 宕机时 Chainlink 价格冻结,恢复后价格跳变导致错误价格下的大规模清算。
- 三明治攻击:在 mempool 观察到受害者提交 TOKEN_A → TOKEN_B 且滑点 1% 的 swap → 抢跑买入 TOKEN_B 抬高价格 → 受害者交易以更差价格成交(在滑点容忍内)→ 反向卖出 TOKEN_B 获利;利润 = 受害者价格影响 − 两次 gas 成本。
- JIT(Just-In-Time)流动性:观察到 mempool 中大额待处理 swap → 在精确价格区间(Uniswap V3 tick)提供集中流动性 → 受害者 swap 成交,JIT LP 赚取大部分手续费 → swap 后立即撤出流动性;利润 = 赚取的手续费 − gas − 无常损失(单区块内极小)。
- 清算 MEV:监控借贷协议中接近清算阈值的仓位 → 价格预言机更新后仓位变为可清算 → 抢跑其他清算人执行清算 → 获得清算奖励(通常为抵押品的 5-15%)→ 卖出抵押品获利。
- MEV 防护机制:Flashbots Protect(交易发往私有 mempool,仅区块构建者可见)、MEV Blocker(通过 MEV 感知中继路由的 RPC 端点)、Cow Protocol 批量拍卖(批量撮合消除排序优势)、加密 mempool(阈值加密,仅在出块时解密)、MEV-Share(用户捕获其交易被提取的部分 MEV)。
- 精度损失利用(舍入误差):Solidity 无浮点,整数除法截断,如 shares = depositAmount * totalShares / totalAssets;当 totalAssets 相对 depositAmount * totalShares 极大时结果舍入为 0,存款人得不到份额但池保留存款。
- 首个存款人/金库通胀攻击:攻击者存入 1 wei 获得 1 share → 直接向金库捐赠 1,000,000 代币(不走 deposit)→ 金库状态变为 1,000,001 代币、1 share → 受害者存入 999,999 代币,shares = 999,999 * 1 / 1,000,001 = 0(整数截断)→ 受害者得 0 份额,攻击者拥有 100% 金库(现 2,000,000 代币)→ 攻击者全部取出;防御:首次存款时铸造死份额(OpenZeppelin ERC4626 offset)、要求最低初始存款、使用带虚拟偏移的内部记账。
- 精度截断粉尘攻击:反复进行小额操作,每次截断损失 1 wei,跨数千次操作累积成实质损失。
- 治理攻击(闪电贷):借入治理代币 → 投票 → 归还;仅在协议未在投票前快照余额时有效。
- 时间锁绕过向量:时间锁设为 0(管理员可立即执行提案)、emergencyExecute 函数(以「紧急」为由绕过时间锁)、guardian/多签覆盖(单点故障)、攻击者取消提案(若达到阈值可抢跑取消)。
- 法定人数操纵:协议要求 10% 法定人数(1 亿供应中 1000 万代币)→ 闪电借入 1000 万治理代币 → 创建提案将管理员设为攻击者 → 用借入代币投票满足法定人数 → 若无时间锁则立即执行 → 归还代币。
- 跨链桥常见攻击向量:签名验证绕过(Ronin Bridge 6.24 亿美元,5/9 验证者被攻陷)、消息重放(在多条链上重放存款证明)、伪造存款证明(为不存在的 L1 存款提交证明)、验证者串谋(攻陷多数桥验证者)、智能合约漏洞(Wormhole 3.2 亿美元,未初始化的 guardian set)、可升级代理漏洞(攻击者获得升级权限后替换实现)。
- 跨链消息验证安全模式:源链发出含 (destination, amount, nonce, chainId) 的事件 → 中继者提交证明(事件包含的 Merkle 证明)→ 目标链对照已知源区块头验证证明,检查 nonce 未重放、chainId 匹配、Merkle 证明对照可信根、铸造/释放代币;易受攻击模式:中继者提交由 N-of-M 验证者签名的 (destination, amount),若 M 很小或密钥被攻陷则可伪造签名。
- ERC-20 授权抢跑:Alice 授权 Bob 100 代币 → Alice 想改为 50 → Bob 在 mempool 看到变更交易 → 抢跑 transferFrom(Alice, Bob, 100) 用旧授权 → Alice 的授权变更执行,授权 = 50 → Bob 再 transferFrom(Alice, Bob, 50) 用新授权 → Bob 共提取 150 而非 50;防御:先 approve(0) 再 approve(newAmount),或使用 increaseAllowance/decreaseAllowance。
- ERC-777 通过钩子重入:ERC-777 代币在完成转账前对接收方调用 tokensReceived() 钩子,是经典重入向量;流程:transfer(attacker, amount) → _beforeTokenTransfer 钩子 → 余额更新 → 对接收方的 tokensReceived() 回调(重入窗口,攻击者可重入 transfer、swap、deposit 等)→ _afterTokenTransfer 钩子。
- 手续费代币(fee-on-transfer):每次转账扣费,协议收到少于 amount;易受攻击写法假设 received == amount(token.transferFrom(msg.sender, address(this), amount); deposits[msg.sender] += amount; 会多记手续费金额);修复:测量实际余额变化(先记录 uint before = token.balanceOf(address(this)); 转账后 uint received = token.balanceOf(address(this)) - before; deposits[msg.sender] += received;)。
- 变基代币(rebasing):自动调整余额(如 Aave aTokens、stETH),持有变基代币的协议若缓存余额会出现记账不匹配。
- 按决策树排查 DeFi 协议:是否使用价格预言机(现货价→闪电贷操纵高风险;TWAP→需跨区块操纵中风险;Chainlink→检查陈旧性处理与 L2 sequencer uptime oracle;多预言机回退→逐个评估);是否接受外部代币(检查 fee-on-transfer 处理、ERC-777 钩子重入、变基代币记账不匹配);是否有治理(闪电贷治理、时间锁绕过、法定人数阈值 vs 可闪电贷供应量);是否为金库/收益聚合器(首个存款人攻击、份额计算精度损失);是否为跨链桥(验证者集大小与密钥管理、重放保护 nonce + chainId、可升级性与升级密钥持有者);是否有面向用户的 swap 功能(MEV 暴露、滑点保护、私有 mempool 集成);最后加载 smart-contract-vulnerabilities 排查底层 Solidity 漏洞。
适用边界 · 注意事项
- 仅适用于 DeFi/智能合约安全分析场景,不适用于传统 Web2 或非链上系统。
- 部分攻击(如闪电贷、MEV 抢跑)依赖具体链上环境与 mempool 可见性,在无公开 mempool 或私有链上不适用。
- 跨链桥与预言机相关分析依赖具体协议实现,需结合实际代码与部署配置验证,不能仅凭模式套用。