返回博客

Web3安全事件周报 | 2026年2月9日 - 2月15日

Code Auditing
2026年2月18日
阅读约 10 分钟

在上周(2026年2月9日至2月15日),BlockSec 检测并分析了三起攻击事件,总估计损失约为 65.7 万美元。下表总结了这些事件,并在以下子节中提供了详细的分析。

日期 事件 类型 估计损失
2026/02/10 未知事件 业务逻辑缺陷 ~$10K
2026/02/14 OCA 事件 业务逻辑缺陷 ~$422K
2026/02/14 SOF 事件 业务逻辑缺陷 ~$225K

1. 未知事件

简要概述

2026年2月10日,BNB 智能链上的合约 0x560d39 被利用,导致估计损失约为 1 万美元。根本原因在于函数 0xb1a87f2c() 中存在的业务逻辑缺陷,这使得其流动性添加过程容易受到三明治攻击。

背景

在合约 0x560d39 中,函数 0xb1a87f2c() 根据输入参数从用户那里转移相应数量的 USDT。接收到的 USDT 被处理,其中 85% 被分配用于后续的流动性操作。

从这 85% 的部分中,一半通过 PancakeSwap 池兑换成 AFX,获得的 AFX 被转移到合约 0x671ce4。然后,该函数从 0x671ce4 中提取 AFX。

接下来,通过 PancakeSwap V2 Router,剩余的一半 85% USDT 和从 0x671ce4 中提取的 AFX 被用于向 USDT-AFX 交易对添加流动性。任何剩余的 USDT 或 AFX 将退还给用户。

在完成 USDT-AFX 流动性添加后,该函数会从地址 0x146933 提取额外的 AFX。从 0x146933 提取的数量被设定为等于之前从 0x671ce4 中提取的 AFX 数量。然后,该函数根据 PancakeSwap V2 AFX-AHT 池中的当前价格比率计算所需的 AHT 数量,并使用从 0x146933 中提取的 AFX 和计算出的 AHT 来向 AFX-AHT 交易对添加流动性。

漏洞分析

易受攻击的合约是 0x560d39。合约 0x146933 作为 AFX-AHT 流动性添加中使用的 AFX 的资金来源,并最终承担损失。

根本原因在于 0x560d39 中函数 0xb1a87f2c() 的业务逻辑缺陷。在检索通过合约 0x671ce4 兑换获得的 AFX 时,该函数在兑换前后都不会验证 0x671ce4 中 AFX 的余额变化。相反,它会提取 0x671ce4 持有的所有 AFX。

这使得攻击者可以提前向 0x671ce4 捐赠大量 AFX,然后仅用少量 USDT 调用 0xb1a87f2c()。由于从 0x146933 中提取的 AFX 数量被定义为匹配从 0x671ce4 中提取的 AFX,因此夸大了从 0x671ce4 的提取,直接导致 0x146933 在 AFX-AHT 流动性添加中贡献了过多的 AFX。

攻击者可以通过 0x560d39 中的剩余 USDT 和 AFX 退款来收回其捐赠,而 0x146933 则承担了过量流动性提供的成本。

攻击者随后通过三明治攻击 AFX-AHT 流动性添加来获利,在受害者交易之前进行 AFX 到 AHT 的兑换(抢跑),并在交易之后进行 AHT 到 AFX 的兑换(后跑)。

攻击分析

攻击交易 的关键步骤总结如下:

  • 步骤 1:攻击者在 PancakeSwap V2 上闪贷了 1,130,500e18 个 AFX 代币。

  • 步骤 2:攻击者将 511,965e18 个 AFX 转移到合约 0x671ce4。

  • 步骤 3:攻击者使用剩余的 AFX 在 PancakeSwap V2 上的 AFX-AHT 池中兑换了 52,316e18 个 AHT。由于 AHT 是一个手续费转账代币,攻击者最终只收到了 26,158e18 个 AHT。

  • 步骤 4:攻击者调用合约 0x560d39,并传入参数 100 调用函数 0xb1a87f2c()。由于该函数提取了 0x671ce4 中的所有 AFX(包括攻击者捐赠的代币),因此它试图向 USDT-AFX 和 AFX-AHT 交易对添加不成比例的大量流动性。任何未能配对的剩余 USDT 和 AFX 都被退还给攻击者,使他们能够收回大部分成本。

  • 步骤 5:攻击者将 26,158e18 个 AHT 兑换成 1,129,417e18 个 AFX。

  • 步骤 6:攻击者偿还了闪贷,并将剩余的 AFX 兑换成 USDT,获利约 1 万美元。

结论

此事件是由合约 0x560d39 在通过兑换 USDT 获取 AFX 时,直接从合约 0x671ce4 中提取所有 AFX 造成的,而没有在兑换前后验证合约 0x671ce4 中 AFX 余额的变化。


2. OCA 事件

简要概述

2026年2月14日,BNB 智能链上的一个未知协议遭受了利用,导致损失约 42.2 万美元。根本原因是业务逻辑缺陷:在兑换完成后,该协议会调用 OCA Token 合约中的回收功能,从 DEX 检索代币并将其返回给调用者和其他指定地址。这种单边提取 OCA Token 会人为地减少池子的 OCA 储备,从而膨胀其链上价格,并允许攻击者反复从池子中提取 USDC。

背景

协议合约(0xe0d5ec)公开了一个 sellOCA() 函数(选择器 0x9c1dad28),该函数将用户指定的 OCA 数量兑换成 DEX 上的 USDC。OCA 包含一个通缩的“回收”机制:在兑换完成后,该合约会从池子中提取与刚刚售出的 OCA 相同的数量,并将其重新分配给调用者和其他指定地址。由于在 USDC 已支付的情况下移除了 OCA,池子的 OCA 储备减少,而其 USDC 储备保持较低水平,这人为地推高了 OCA 的链上价格。

漏洞分析

核心漏洞在于 sellOCA() 中兑换后的回收机制,它创建了一个可重复的价格操纵原语。每次调用对 DEX 池的净影响如下:池子在兑换过程中损失 USDC,并且在通缩机制收回代币后也损失 OCA,而调用者获得 USDC 收益并通过重新分配收回 OCA。由于池子的 OCA 储备在没有相应 USDC 流入来平衡交易的情况下减少,每次循环都会人为地膨胀 OCA/USDC 的价格。攻击者可以通过重复此过程来提取 USDC 流动性:购买 OCA,调用 sellOCA() 触发回收,然后以膨胀后的价格出售回收的 OCA,逐步从池子中提取 USDC。

攻击分析

攻击交易 的关键步骤总结如下:

  • 步骤 1:闪贷了 8,704,860e18 个 USDC。

  • 步骤 2:在 PancakeSwap 上将 8,704,860e18 个 USDC 兑换成 940,991e18 个 OCA。

  • 步骤 3:调用 sellOCA(),使用所有 940,991e18 个 OCA。该函数在 DEX 上将 OCA 兑换成 USDC,然后通缩的回收机制从池子中回收了售出的 OCA 并重新分配——将 OCA 返回给调用者。结果是,攻击者获得了兑换的 USDC 收益,同时也收回了自己的 OCA 代币。池子的 OCA 储备急剧下降,推高了 OCA 的价格。

  • 步骤 4:在现在膨胀的价格下,将回收的 940,991e18 个 OCA 兑换回 USDC,并在 PancakeSwap 上重复步骤 2-4,逐步提取池子中的 USDC。

  • 步骤 5:在最后一次迭代中,攻击者仅用 9,999e18 个 OCA 兑换了 433,238e18 个 USDC(反映了极度膨胀的 OCA 价格),然后偿还了闪贷,完成了利用。

结论

此漏洞的根本原因是协议 sellOCA 流中的逻辑缺陷:在用用户提供的 OCA 兑换 USDC 后,该合约通过 OCA 的通缩“回收”机制从 DEX 中回收了几乎所有的 OCA 输入,并将其重新分配给调用者和其他指定地址。这种兑换后的回收操作人为地减少了剩余在流动性池中的 OCA 数量,导致 OCA 的链上价格急剧飙升。通过重复“购买 OCA → 调用 sellOCA 触发回收 → 以膨胀的价格出售 OCA”的循环,攻击者能够以相对较少的 OCA 提取几乎所有的 USDC 流动性。


3. SOF 事件

简要概述

2026年2月14日,BNB 智能链上的 SOF 代币遭受了利用,导致损失约 22.5 万美元。根本原因是 _update() 函数中的业务逻辑缺陷:在卖出操作期间,合约直接将代币从 Uniswap V2 对转移到一个销毁地址并立即调用 sync()。这种操纵池子储备的行为会在同一笔交易中人为地膨胀代币价格。攻击者构建了一个触发此错误卖出逻辑的兑换交易,迫使流动性对销毁其自身的代币并更新储备,从而以人为膨胀的价格提取了池子的 USDT。

背景

SOF 是部署在 BNB 智能链上的 BEP-20 代币,具有自定义的通缩机制和自动费用管理。该代币与 Uniswap V2 兼容的流动性对(特别是与 USDT 的 PancakeSwap)进行交互以促进交易。

对于免除费用的用户,买卖操作是免费的。对于所有其他用户,买入操作受到限制,将回滚。

在卖出操作期间,合约将卖出金额的 90% 从交易对转移到 _destroyAddress,并立即调用 sync() 来更新储备以反映减少的余额。

漏洞分析

根本原因在于 0x1f3863 合约的 _update() 函数中的业务逻辑缺陷。在卖出操作期间(当 to 是 Uniswap Pair 时),该合约执行第 467 行:

 ///  SOF.sol:462-469
462|          } else if (_isPairs[to]) {
463|              //sell
464|
465|              isSell = true;
466|              taxAmount = takeFee(from, amount);
467|              super._update(_uniswapV2Pair, _destroyAddress, amount - taxAmount);
468|              IUniswapV2Pair(_uniswapV2Pair).sync();
469|          }

此逻辑将代币直接从 Uniswap Pair 地址转移到销毁地址(_destroyAddress),从而耗尽了流动性池的代币储备。随后调用 IUniswapV2Pair(_uniswapV2Pair).sync() 立即更新储备,导致代币价格飙升,并允许攻击者提取池子的 USDT。

攻击分析

攻击交易 的关键步骤总结如下:

  • 步骤 1:攻击者闪贷了 315,520,309e18 个 USDT 用于步骤 2,并将 875e18 个 SOF 转移到地址 0xc4DB5B 用于步骤 3。

  • 步骤 2:通过 swapTokensForExactTokens() 将 313,567,718e18 个 USDT 兑换成 991,223e18 个 SOF。to 地址是一个免除费用的地址,满足了 SOF 合约中的 isExcludedFromFees[to] 检查,从而跳过了 _isPairs[from] 检查(否则买入操作将回滚)。这也绕过了 _antiFlashloanGuard() 检查——合约不会记录此买入操作,允许步骤 3 在不被阻止的情况下进行。至关重要的是,这次大规模买入被设计为使交易对只剩下 787e18 个 SOF(以及 313,816,344e18 个 USDT),为步骤 3 做好了准备:卖出逻辑中的 90% 销毁将销毁交易对几乎全部剩余的 SOF 余额。

  • 步骤 3:从地址 0xc4DB5B,通过 swapExactTokensForTokensSupportingFeeOnTransferTokens() 将 875e18 个 SOF 兑换成 USDT。PancakeSwap Router V2 首先执行 SOF.transferFrom(),然后处理兑换。在 SOF.transferFrom() 期间,_update() 中的卖出逻辑将 875e18 的 90%(即 787e18)从交易对转移到 _destroyAddress——如步骤 2 中设计的那样,这几乎是交易对 SOF 余额的全部。在这次销毁和 sync() 之后,交易对持有 313,816,344e18 个 USDT 和仅 10e9 个 SOF。随着 SOF 价格现在呈天文数字般膨胀,随后的兑换产生了巨额的 USDT 支付。

  • 步骤 4:攻击者偿还了闪贷,并保留了约 22.5 万美元的利润。

结论

SOF 事件凸显了在代币转账逻辑中操纵 AMM 池储备的风险。卖出路径将代币从 Uniswap 对余额中移除并立即调用 sync(),因此当 swapExactTokensForTokensSupportingFeeOnTransferTokens()运行时,转账到交易对会在兑换完成前改变储备,扭曲了定价并实现了提取。

_antiFlashloanGuard() 也未能提供有意义的保护。它只限制同一用户地址的买卖,攻击者通过将买入部分路由到免除费用的接收者来绕过它。

为了缓解类似问题,避免任何转移钩子或 _update() 逻辑,这些逻辑会将代币从交易对地址移动或调用 sync()。如果需要防闪贷保护,可以通过跟踪 tx.origin 和相关地址来实施整个交易的规则,这样攻击者就无法在一笔交易中将买卖分开到不同的接收者。


关于 BlockSec

BlockSec 是一家全栈式区块链安全和加密合规提供商。我们构建产品和服务,帮助客户在协议和平台的整个生命周期内进行代码审计(包括智能合约、区块链和钱包)、实时拦截攻击、分析事件、追踪非法资金,并满足 AML/CFT 的义务。

BlockSec 在享有盛誉的会议上发表了多篇区块链安全论文,报告了多起 DeFi 应用的零日攻击,阻止了多次黑客攻击并挽救了超过 2000 万美元,并保障了数十亿美元的加密货币。

订阅最新动态
Bitget 3.875亿美元链下漏洞事件:不止于密钥与合约
Security Insights

Bitget 3.875亿美元链下漏洞事件:不止于密钥与合约

2026年9月24日,攻击者利用第三方安全产品漏洞,获取内部凭证并伪造提现指令,导致Bitget部分运营钱包资金转出约3.875亿美元,涉及以太坊、其他EVM网络、XRP Ledger、Zcash和TRON,私钥及冷钱包未受影响。本文梳理事件路径与资金流向,分析资产快速转换及生态恢复应对,提出机构纵深防御体系,并说明授权区块链渗透测试如何验证跨层安全假设。

损失约1130万美元:Multicall Router、Nostra | BlockSec Weekly
Security Insights

损失约1130万美元:Multicall Router、Nostra | BlockSec Weekly

本报告覆盖2026/09/14至09/20,分析以太坊与Starknet上两起共约1130万美元损失的安全事件。较大一起中,多重调用路由器将自身地址当作调度目标,致嵌套调用以路由器已授权身份而非外部调用者身份进入Safe钱包的Gateway模块,约2900个aEthrsETH被转入攻击者创建的Uniswap v4池。Starknet上,Nostra预言机仅需一个聚合来源,三个价格源中仅两个参与聚合时,被操纵的浅池报价与正常报价平均,使NSTR估值约49.52美元,支持约350万美元超额抵押借贷。

~3.2亿美元损失:Liquid Network、Symbiosis 遭利用攻击 | BlockSec
Security Insights

~3.2亿美元损失:Liquid Network、Symbiosis 遭利用攻击 | BlockSec

本报告覆盖2026/09/07-09/13,分析两起共损失约3.2亿美元的安全事件,含此前未覆盖的Liquid Network于09/06遭利用事件。较大事件中,Elements的rangeproof验证缓存因字段拼接无分隔符导致验证结果错配,攻击者伪造4000枚无支撑L-BTC并几乎全部兑出。Symbiosis跨链桥比特币路线因手续费未做负值校验,330聪存款铸造出46,116,860,184.27388234 syBTC,流动性池仅存11.26 syBTC,致约970万美元损失(约9.97 BTC)。

Web3 最佳安全审计方

在上线之前验证设计、代码与业务逻辑,对标业内最高安全标准。

BlockSec 审计