20250730
背景
20250730 一名用户在授权并使用 AnyswapV4Router
兑换了 WETH 后,被攻击者通过 AnyswapV4Router
授权漏洞转移走 WETH,前后共计损失 401 WETH。
AnyswapV4Router
是一个支持跨链代币转移、链内代币交换和跨链交换的智能合约。攻击者通过 anySwapOutUnderlyingWithPermit
函数绕过了 WETH 不存在的 permit
检查,通过受损用户的授权转移走 WETH。
攻击者的身份可能是 MEV bot 或是白帽,本文暂时以“攻击者”称呼。
- 授权交易:https://www.oklink.com/zh-hans/ethereum/tx/0x2653c822153e711e34edf459eeb26e4f36ceb391f6937674726b67e3d954dba5
- 攻击交易:
- 0x75316e0aac282c9db5c57d2abe74e29e072466114afb8d70cd8b7115196fca57
- 0x0abafd9b7691a0b06bc02e6274f5a1b6925c2d97c77f4702ba9d2761d0bd4563
- 0xae79fdcfd7c36ed654d11b352b495340bd3cc47d0849c35ac6ffa1e4859098ec
Trace 分析
用户一共进行了 3 次 swap 操作,每次 swap 结束后(在同一个区块或下一个区块)所获得的 WETH 就被转走了。
https://etherscan.io/address/0x4527106ae1a661a9d2ffc22575bacdaacb5e51e0#tokentxns
取其中一个 TX 进行分析:https://app.blocksec.com/explorer/tx/eth/0x75316e0aac282c9db5c57d2abe74e29e072466114afb8d70cd8b7115196fca57
- 攻击合约:https://etherscan.io/address/0x2d3e6e2af3047f82a8ba9a1596f86e202a49d9c8
- 攻击者调用
anySwapOutUnderlyingWithPermit
函数,传入攻击合约作为token
参数。 - 在
anySwapOutUnderlyingWithPermit
函数函数中调用WETH.permit()
函数进行验证。(很奇怪啊,调用的是permit()
函数,却打印了一个Deposit
的 event。) - 利用被盗用户对
AnyswapV4Router
合约的授权额度转移用户 WETH 资产。
代码分析
在 anySwapOutUnderlyingWithPermit
函数中, 由于 token
参数是攻击者设置的攻击合约,取出来的 _underlying
被设置为了 WETH。转移 _underlying
资产之前,会调用其 permit
函数检查授权情况。
但是 WETH 代币并没有实现 permit 函数,所以调用 WETH.permit()
函数时,会跳转到其 fallback 函数中。也就是为什么会在 permit()
函数的调用中打印了一个 Deposit
的 event。
后记
在需要使用一些 DeFi 或者工具合约时,难免需要对合约进行授权。通常出于方便或者节省 gas 考虑,用户会选择直接授权最大值。但是这也随之带来了安全隐患,如果被授权的合约存在可利用的漏洞,那么黑客可以通过授权合约转移你账户内的所有已经授权的资产。
而这次的受损用户正是在授权时对 AnyswapV4Router
合约(及其其他一系列的合约)给了最大的授权额度,这也间接导致了这次事件的发生。
从资金安全的考虑,用户在使用合约时需要谨慎设置授权金额。最好的习惯就是用多少授权多少(当然有利有弊,这样操作就需要每次多花点 gas 授权了)。提高安全意识,减少资金损失,本期安全小课堂就到此结束了。
评论