20250730 - AnyswapV4Router 授权漏洞: 绕过了不存在的 permit 函数

背景

20250730 一名用户在授权并使用 AnyswapV4Router 兑换了 WETH 后,被攻击者通过 AnyswapV4Router 授权漏洞转移走 WETH,前后共计损失 401 WETH。

AnyswapV4Router 是一个支持跨链代币转移、链内代币交换和跨链交换的智能合约。攻击者通过 anySwapOutUnderlyingWithPermit 函数绕过了 WETH 不存在的 permit 检查,通过受损用户的授权转移走 WETH。

攻击者的身份可能是 MEV bot 或是白帽,本文暂时以"攻击者"称呼。

Trace 分析

用户一共进行了 3 次 swap 操作,每次 swap 结束后(在同一个区块或下一个区块)所获得的 WETH 就被转走了。

https://etherscan.io/address/0x4527106ae1a661a9d2ffc22575bacdaacb5e51e0#tokentxns

取其中一个 TX 进行分析:https://app.blocksec.com/explorer/tx/eth/0x75316e0aac282c9db5c57d2abe74e29e072466114afb8d70cd8b7115196fca57

  1. 攻击者调用 anySwapOutUnderlyingWithPermit 函数,传入攻击合约作为 token 参数。
  2. anySwapOutUnderlyingWithPermit 函数函数中调用 WETH.permit() 函数进行验证。(很奇怪啊,调用的是 permit() 函数,却打印了一个 Deposit 的 event。)
  3. 利用被盗用户对 AnyswapV4Router 合约的授权额度转移用户 WETH 资产。

代码分析

anySwapOutUnderlyingWithPermit 函数中, 由于 token 参数是攻击者设置的攻击合约,取出来的 _underlying 被设置为了 WETH。转移 _underlying 资产之前,会调用其 permit 函数检查授权情况。

但是 WETH 代币并没有实现 permit 函数,所以调用 WETH.permit() 函数时,会跳转到其 fallback 函数中。也就是为什么会在 permit() 函数的调用中打印了一个 Deposit 的 event。

后记

在需要使用一些 DeFi 或者工具合约时,难免需要对合约进行授权。通常出于方便或者节省 gas 考虑,用户会选择直接授权最大值。但是这也随之带来了安全隐患,如果被授权的合约存在可利用的漏洞,那么黑客可以通过授权合约转移你账户内的所有已经授权的资产。

而这次的受损用户正是在授权时对 AnyswapV4Router 合约(及其其他一系列的合约)给了最大的授权额度,这也间接导致了这次事件的发生。

从资金安全的考虑,用户在使用合约时需要谨慎设置授权金额。最好的习惯就是用多少授权多少(当然有利有弊,这样操作就需要每次多花点 gas 授权了)。提高安全意识,减少资金损失,本期安全小课堂就到此结束了。

相关推荐
阿菜ACai14 天前
20250709 - GMX V1 攻击事件: 重入漏洞导致的总体仓位价值操纵
漏洞分析·defi
阿菜ACai1 个月前
20250620 - Bonding 攻击事件: 项目方不创建的池子由我攻击者来创建
漏洞分析
阿菜ACai2 个月前
20250528 - Usual 攻击事件: 价差兑换与请君入瓮
漏洞分析·defi
阿菜ACai7 个月前
20250110-FortuneWheel 攻击事件:竟然不设滑点,那就体验一下 Force Investment 吧
漏洞分析·defi
阿菜ACai7 个月前
【漏洞分析】20250105-SorraStaking:奖励金额计算错误,每次取款都有大收益
漏洞分析·defi
阿菜ACai8 个月前
【漏洞分析】Vestra DAO 攻击事件:这个质押项目它取款不核销呀
漏洞分析
xzajyjs9 个月前
CodeQL学习笔记(3)-QL语法(模块、变量、表达式、公式和注解)
web安全·渗透测试·漏洞分析·代码审计·codeql
阿菜ACai10 个月前
【漏洞分析】20240507-SATURN:当闪电贷遇上有缺陷的通缩机制
智能合约·漏洞分析
阿菜ACai1 年前
【漏洞分析】Penpie 攻击事件:重入攻击构造奖励金额
漏洞分析·defi