Advertise手续费优惠服务台

指南安全

智能合约攻击有哪些?常见漏洞与防御入门

智能合约攻击全解析:重入、闪电贷与预言机操纵、访问控制、MEV、业务逻辑缺陷,附真实损失案例与防御方法。

高级阅读约 8 分钟COINOTAG 研究最后更新
gate.com

智能合约就像刻在代码里的规则,而攻击者像水一样,不断寻找最细微的裂缝。最常见的智能合约攻击包括重入攻击、闪电贷与预言机操纵、访问控制漏洞、MEV排序手段、业务逻辑缺陷,以及delegatecall滥用、签名重放等一些高级边缘情况。这些漏洞利用大多并不需要某一个戏剧性的大漏洞,而是把DeFi各个组件中的小弱点串联起来,直到整个结构崩塌。下面逐一讲解每类攻击,列出它们造成的损失,以及你在存入任何代币之前就能检查的危险信号。

智能合约为什么始终容易受到攻击

有三个结构性事实让智能合约持续暴露在风险之下。第一,不可篡改是一把双刃剑:无法修改的代码也无法悄悄打补丁,而可升级的代理模式则把风险转移给了掌握升级密钥的人。第二,交易在确认之前会停留在公开的内存池中,任何观察者都能看到交易意图。第三,高价值系统会吸引专业对手,他们把协议当作可以逆向工程的金融机器。

涉及的资金并非纸上谈兵。2025年全年,链上被盗金额超过34亿美元,其中2025年2月的一起事件就从某交易所的签名流程中盗走了价值近15亿美元的以太坊。一起事件就主导了整整一年的数据,这说明运营安全和密钥管理如今与干净的Solidity代码同样重要。

binance.com

COINOTAG观点:攻击是组合出来的,而不是孤立的

当下最有用的思维模型是“组合”。现代DeFi协议会从其依赖项中继承风险,包括跨链桥、二层网络环境和价格源。一个协议单独看可能毫无瑕疵,却仍可能因为它信任的预言机能被借来的资金推动而失败。评估一份合约时,要评估它接触的整个攻击面,而不只是它自己发布的那几行代码。

bitget.com

破坏力最大的五类攻击

在深入讲解之前,先对比频率最高、影响最大的五种模式,每种都配有一个真实损失案例和核心防御方法。

攻击类型核心弱点真实损失主要防御
重入攻击状态更新前就交出控制权约360万ETH被转移(The DAO)检查-生效-交互模式 + 重入锁
闪电贷 + 预言机滥用定价依赖可被推动的现货价格约4,500万美元(PancakeBunny)时间加权定价 + 偏离限制
访问控制漏洞特权函数缺乏保护15万枚以上ETH(Parity多签)多签 + 时间锁 + 角色分离
预言机/数据源故障单一、过时或池子很浅的价格来源约1.16亿美元(Mango Markets)多源数据 + 时效检查
MEV/三明治攻击交易排序可被预测以太坊上约11亿美元被提取(2022–2024年)严格的滑点设置 + 私有订单流

重入攻击:过早交出控制权

当一份合约在完成自身记录更新之前,就向外部地址发送资产或发起调用时,就会发生重入攻击。想象一个收银员先把找零递给你,之后才更新收银机记录,这就留下了一个窗口,让你可以打断流程并重复同一次结账。攻击者的合约会在这个窗口内回调受害合约,在余额被扣减之前就把资金盗走。

The DAO事件及其至今的意义

最初的The DAO漏洞利用正是这种顺序问题。资金在内部余额扣减之前就被转出,因此一次提款流程可以在同一个调用序列中被反复重入,最终转走约360万ETH。这次事件重塑了整个生态,引发了一场充满争议的硬分叉。它至今仍有意义,因为同样的错误会在重构、升级和新的集成中反复出现,往往通过ERC-777等代币钩子或跨合约回调发生。

三步修复法

  1. 检查用户余额。
  2. 更新用户余额。
  3. 最后再发送资金。

这种顺序就是“检查-生效-交互”(checks-effects-interactions)模式。重入锁增加一次只允许一个调用的锁定,使函数在执行中途无法被重入;拉取式支付则让用户在单独的步骤中领取资金,而不是在敏感的状态变更过程中收款。严重程度:可利用性高,影响高,检测难度中等。

闪电贷与预言机操纵

闪电贷允许攻击者在没有抵押的情况下借入大笔资金,前提是在同一笔交易内还清。闪电贷本身并不是漏洞,而是一个放大器,会暴露协议在定价、抵押品和流动性上的薄弱假设。攻击流程始终如一:大额借款,短暂推动价格或余额,触发一个信任该临时状态的计算,提取价值,归还贷款,留下差价。

数字示例

假设某借贷协议用单一浅流动性池的现货价格为抵押品定价,该池持有100,000 USDC和100枚TOKEN,即每枚TOKEN价格为1,000 USDC。攻击者通过闪电贷借入900,000 USDC买入该池,在这笔交易存续期间把链上价格推到约每枚4,000 USDC。接着,他们存入少量TOKEN作为抵押品,协议此时按真实价值的四倍对其估值,攻击者便按虚高的价值借款。提走超额抵押的贷款后,他们再卖回、恢复池子并归还闪电贷,带着差价离开。PancakeBunny因这类操纵损失约4,500万美元,Harvest Finance也因同样的定价脆弱性损失约2,400万美元。

经得起考验的防御

  • 用时间加权平均价格代替单次现货读数。
  • 对多个价格来源取中位数。
  • 偏离检查,拒绝区块内的极端波动。
  • 熔断机制和暂停条件。
  • 深度要求,防止一个浅池决定“真实价格”。

作为用户,凡是依赖浅池单一现货价格的协议,都应视为较高风险,并严格设置滑点。

预言机与数据源故障

预言机攻击会让协议依据错误的输入行事。如果合约信任的价格、利率或时间戳是错误的,或者推动成本很低,它就会严格按代码执行,却仍然产生错误结果。只从单一来源获取数据的区块链预言机就是一个单点故障。

操纵通常从价格容易被推动的低流动性池开始,再借助闪电贷资金放大。Mango Markets是教科书式案例:被扭曲的抵押品定价使攻击者提走约1.16亿美元;Vee Finance则因依赖单一预言机损失约3,400万美元。防御模式正是这些错误的反面:组合多个来源、取中位数、强制要求数据新鲜度并拒绝异常值。严重程度:影响高,可利用性中等,检测难度中等。

访问控制漏洞

访问控制决定了谁能升级合约、暂停提款、铸造代币或转移金库资金。一旦这一层失守,攻击者只需调用某个特权函数,就能绕过其他所有防护。最常见的错误包括缺少权限检查、函数可见性设置错误,以及能执行敏感操作的地址过多导致的角色泛滥。

一个经典错误是用tx.origin而不是msg.sender做授权判断,这会通过中间合约打开钓鱼攻击的路径。Parity多签钱包被黑事件盗走了超过15万枚ETH,按当时价格约3,000万美元;之后Parity的另一个漏洞又冻结了价值约2.8亿美元的ETH。稳健的方案是:关键操作使用多签钱包,用时间锁延迟危险变更,按角色划分权限并清晰分离,并且做到职责分离,使任何单一密钥都不能既提议又执行高影响的变更。作为用户,要留意是否有多签和时间锁保护,把可以即时升级视为警告信号。

MEV、抢跑与三明治攻击

最大可提取价值(MEV)是通过交易排序获取的利润。当搜索者能看到待处理的交易并影响它们在区块中的位置时,就会以你的损失为代价提取价值,通常表现为更差的成交价和隐藏的滑点。了解最大可提取价值的运作方式,如今已是链上操作的基本常识。

几种变体很容易区分:插入,即把一笔交易放在你的交易之前;置换,即把你的交易往后挤;压制,即推迟你的交易被打包;三明治,即在你的交易前后分别夹上一笔买入和一笔卖出。在以太坊上,监管机构引用的透明度数据估计,2022年9月至2024年6月初,已实现的可提取价值达526,207 ETH,约合11亿美元。协议可以用提交-揭示方案、批量拍卖和考虑MEV的预言机读取来缓解;用户则可以通过严格控制滑点、避开浅池,以及在可行时通过有MEV保护的交易中继提交交易来降低影响。

业务逻辑与经济设计缺陷

逻辑缺陷是规则本身错了,而不是语法错了。一份合约可以完美运行,却仍然可被利用,只要它对激励、治理或价格行为做出了不安全的假设。这类漏洞最常被审计遗漏,因为代码完全按照指令在执行。

治理被夺取是最典型的例子。在Beanstalk事件中,攻击者获得了足够的治理控制权,强行通过提案,盗走约1.82亿美元,而整个过程中合约都按设计运行。Audius金库通过一条治理路径被套现约110万美元;Mango Markets再次说明,被扭曲的经济输入可以让攻击者把一个头寸包装得比实际更安全。预防的方法包括:把各项假设当作对抗性命题来测试,强制执行不变量,进行情景模拟和混沌式模拟,并在风险资金规模足够大时做有针对性的形式化验证。对于治理变更即时生效、法定人数门槛很低的DAO,需要格外警惕。

值得了解的高级漏洞

有些缺陷藏在强大的功能里,而不是明显的漏洞中。

Delegatecall的危险

delegatecall会用你自己合约的存储来运行另一份合约的代码。它支撑着库调用和升级机制,但存储布局不匹配或目标代码不可信,都可能覆盖关键状态。只对可信代码使用delegatecall,并在审查时锁定存储布局。

签名重放

在不同上下文中重复使用一个有效签名,攻击者就能重复执行一次已授权的操作。2022年,在一次针对恢复流程的攻击中,约1,500万美元的Optimism代币被盗。每个签名都要用nonce、过期时间以及EIP-712的域分隔进行绑定。这在概念上与链层面的重放攻击相关,即在一条链上有效的交易被拿到另一条链上重放。

强制转入的以太币

即使没有payable函数,合约也可能收到ETH。永远不要把合约自身余额当作内部状态的证明,要显式记录账目。

整数溢出与下溢

自从Solidity 0.8加入了带检查的算术运算,这类问题已很少见,但在遗留的分叉代码中依然存在;历史上曾有一次下溢漏洞盗走了866 ETH。

拒绝服务

如果一个函数需要遍历一个没有上限的列表,就可能超过区块Gas上限而永远无法执行,导致资金被锁死。应限制每次的工作量,并采用“拉取优于推送”模式。

2025年的教训:重大漏洞事件剖析

2025年最大的几起事件覆盖了从数学漏洞到密钥滥用的完整谱系,而这正是重点所在:“智能合约风险”的范围比合约本身更广。

事件大约损失根本机制
某交易所签名被黑约15亿美元审批/密钥流程被攻破
Cetus Protocol约2.23亿美元集中流动性数学被滥用
Balancer V2稳定池约9,500万美元精度/舍入记账的边缘情况
UPCX约7,000万美元通过ProxyAdmin的特权密钥恶意升级
GMX V1约4,000万美元重入驱动的状态转换

规律非常明显:集中流动性逻辑、舍入精度和特权密钥控制,如今已经与经典的重入漏洞并列。可以看到,集中流动性引入了新的数学,攻击者会逐行研究。

务实的智能合约安全流程

安全已不再是一次叫作“审计”的事件,而是一套可重复的流程,从部署前开始,一直延续到上线之后,因为大多数损失都发生在代码面对真实用户和真实流动性之后。

能捕捉不同失效模式的测试方法

  1. 静态分析(Slither):快速标记常见的危险模式。
  2. 符号执行(Mythril):探索大量执行路径。
  3. 模糊测试(Echidna、Foundry):自动生成对抗性输入。
  4. 人工审查:验证工具无法理解的治理和经济假设。
  5. 针对性形式化验证(Certora):证明一小组必须成立的属性。

需要提前规划的风险和陷阱

  • 审计能降低风险,但永远无法消除风险。把它当作安全预算中的一项,而不是全部。
  • 每当修改核心逻辑、新增依赖、扩大权限或推出新的升级路径时,都要重新审计。
  • 没有部署后的监控、暂停机制以及漏洞披露或漏洞赏金计划,上线之后你就是在盲飞。
  • 一把无人看管的升级密钥就能让其他所有控制失效,2025年的事件一再证明了这一点。

希望把这套流程规范化的团队,可以阅读我们的配套指南:如何审计智能合约和区块链安全审计,其中对流程和工具有更深入的介绍。

60秒就能检查的危险信号

  • 抵押品或清算依赖浅池的现货价格。
  • 只有单一预言机,没有备用数据源或合理性检查。
  • 管理员可以通过代理即时升级,没有时间锁。
  • 金库或升级权限没有多签保护。
  • 代币经济存在无限增发路径或脆弱的锚定机制。

大多数“意外”被黑事件,只是在事后看来才令人意外。了解这些模式,重视危险信号,把每个协议都看作由许多零件组成的机器,因为攻击者只需要找到一颗松动的螺丝。如果想要一份更全面的资产保护清单,请参阅我们的加密货币安全概览。以上内容不构成投资建议,而是为每一位持有比特币或参与DeFi的人提供的安全意识参考。

常见问题

5 个问题
最常见的智能合约攻击是什么?

重入攻击是最经典、出现频率最高的类型之一:合约在更新自身余额之前就向外部发送资金,攻击者借机反复回调提款。闪电贷与预言机操纵、访问控制漏洞也是造成巨额损失的常见类型。

闪电贷本身是漏洞吗?

不是。闪电贷是一个放大器,它让攻击者在一笔交易内借到大额资金,从而暴露协议在定价、抵押品和流动性上的薄弱假设。真正的漏洞在于协议信任了可以被短暂推动的价格或余额。

普通用户怎样识别有风险的智能合约?

检查几项危险信号:抵押品是否依赖浅池现货价格,是否只有单一预言机,管理员能否在没有时间锁的情况下即时升级,金库和升级权限是否有多签保护,代币经济是否存在无限增发路径。

通过审计的智能合约就安全吗?

不一定。审计能降低风险,但无法消除风险。业务逻辑缺陷常被审计遗漏,代码修改、新增依赖或扩大权限后也需要重新审计,同时还需要部署后监控、暂停机制和漏洞赏金计划。

什么是MEV?对用户有什么影响?

MEV即最大可提取价值,是通过交易排序获取的利润。搜索者看到你的待处理交易后,可能通过抢跑或三明治攻击让你以更差的价格成交。严格设置滑点、避开浅池、使用有MEV保护的交易中继可以降低影响。

最后更新: