
如何撤销恶意授权并关闭资金流出路径
撤销恶意批准意味着提交一个链上交易,重写代币的授权,通常将其设置为0,以便可以调用transferFrom的支出者。将钱包从dApp断开连接仅仅是一个用户界面操作,因此不会删除代币批准或停止已经拥有支出权限的钱包排水器。
关键要点
- 代币批准是代币合约上的持续权限,直到您在链上更改它为止。
- 要撤销批准,您需要发送一个将支出者的授权设置为0或更小金额的交易,并支付燃料费。
- 无限制的批准是授权的爆炸版本,因为一个被攻破的支出者可以将该代币余额耗尽到授权的上限。
- Permit2可以通过签名隐藏风险:您可能只会看到一个链上批准给Permit2,而真正的危险是签署一个恶意的EIP-712授权。
为什么代币批准可能是危险的
恶意批准不是“dApp连接”。它是一个活跃的权限,存在于代币合约上,表示特定的支出者可以通过transferFrom转移您的代币。ERC-20委托转账运行在三个函数上:approve(spender, amount)、allowance(owner, spender)和transferFrom(from, to, amount)。一旦该授权存在,支出者就不再需要您的钱包。它只需要授权仍然是非零的。
这种持久性就是整个问题。授权保持活动状态,直到明确更改,这就是为什么“断开钱包”按钮和钱包连接列表给人一种虚假的安全感。断开连接会移除网站提示您钱包的能力。它对实际授权支出的代币合约状态没有任何影响。这就是为什么批准钓鱼有效:攻击者的目标是获得一次代币批准(或类似许可证的签名),然后在受害者不再注意时再使用它。
无限制的批准是尾部风险存在的地方。许多用户界面默认设置为“无限”,因为这减少了未来的摩擦,但批准最大uint256金额实际上是将支出者交给该代币的空白支票。如果支出者合约今天是恶意的,或者稍后被利用,授权就是排水路径。
对于交易者来说,支撑的心理模型是“持续信用额度”。每个代币批准都是一项条目:代币 → 支出者 → 限制。如果读者无法指向当前有权限调用transferFrom的确切合约(无论是直接还是通过Permit2),那么真正的风险是未知的。这是加密钱包诈骗背后的核心机制之一,以及如何避免它们。
撤销批准的工作原理
撤销不是一个设置切换。它是链上的状态更改,这意味着它需要燃料费,并留下交易记录。从机械上讲,撤销批准只是重写代币合约上的授权映射,使支出者的授权变为0(如果目标是继续使用该应用程序并设置上限,则为更小的数字)。
两个操作细节比大多数指南承认的更重要。
一个是“移除代币批准”是特定于代币的。撤销USDC对某个支出者的批准对同一支出者的WETH批准没有任何影响。授权账本是按代币合约划分的。
另一个是当将非零授权N更改为另一个非零授权M时,授权更新可能会出现竞争条件边缘案例。更安全的模式是Speedrun以太坊称之为“先批准为零再设置”。这个想法很简单:先将授权设置为0,等待确认,然后设置新金额。这消除了支出者可能同时使用旧授权和新授权值的窗口。
如果一个钱包或dApp抛出错误,如“批准为零失败”或“批准为新金额失败”,这通常不是撤销不可能的迹象。这是代币的批准行为奇怪或用户界面没有干净处理代币规则的迹象。解决方法是使用不同的授权工具或区块浏览器的代币批准界面,然后重试相同的链上更改。
关键框架保持一致:撤销只是简单地在链上重写权限。如果读者无法识别持有权限的支出者,则无法正确定位撤销。
使用Revoke.cash逐步撤销
Revoke.cash是一个常见的工作流程,因为它在一个仪表板中显示批准,并允许用户从同一屏幕提交链上撤销交易。以下步骤反映了Bifrost Wallet文档中的钱包内流程,但在各个钱包中顺序大致相同。
1. 打开一个受信任的钱包浏览器并导航到Revoke.cash。使用钱包内浏览器可以减少因广告或DM而落入相似域名的机会。 2. 连接钱包并选择正确的网络。批准是链特定的,因此当工具设置为Flare、Base或其他EVM链时,以太坊批准将不会显示。 3. 打开代币批准视图并按风险排序。从无限制的授权和具有重要余额的代币开始,因为这些是影响最大的排水路径。 4. 确定每一行风险的支出者。支出者是可以调用transferFrom的合约。如果支出者名称看起来不熟悉,请将其视为敌对,直到证明相反。 5. 点击所选批准的撤销。这会提交一个将该代币和支出者的授权设置为0的交易。 6. 在钱包中确认交易并支付燃料费。如果燃料费很高,首先撤销最大的授权仍然是一个合理的“保险费”交易。 7. 在确认后重新检查批准列表。授权现在应该显示为0,或者该行应该消失,具体取决于工具的用户界面。
这是撤销批准的核心答案:用户并不是在“取消链接”任何东西。用户正在更改代币合约上的授权。如果钱包排水器已经获得批准,这就是关闭路径的操作。
检查Permit和Permit2批准
2022年末是大多数用户错过的转折点。Uniswap的通用路由器使Permit2成为默认批准路径,这将许多“批准风险”从明显的approve()交易转移到了EIP-712签名。Permit2是Uniswap Labs的单例批准合约:用户每个代币只需批准一次Permit2,然后应用程序请求包含支出者、金额、截止日期和随机数的签名授权。
这创建了两个账本以审计。
账本一是经典的ERC-20授权:代币 → 支出者。这是大多数“代币批准”仪表板显示的内容,也是无限制批准随机合约通常存在的地方。
账本二是Permit2:链上的代币 → Permit2授权,加上应用程序请求的离线签名授权。Permit2支持持续授权模式和一次性转移模式,其授权是有截止日期的。截止日期可以减少来自休眠权限的风险,因为授权可以自动过期,但它们并不能解决签名盗窃问题。批准钓鱼活动越来越多地针对许可证和Permit2签名提示,因为单个签名消息可能足以转移资金。
实际影响是不舒服但清晰的:“我不记得批准过任何东西”并不是安全信号。用户在签署看起来从未像approve()交易的输入数据后可能会暴露。
在经历恐慌后进行清理时,审计应回答每个代币的一个问题:哪个合约当前可以导致从该钱包的transferFrom?有时它是直接的支出者。有时是Permit2,因为代币被批准给单例,而用户继续盲目签署提示。防止重复事件的习惯与如何在签署之前验证交易的内容相同:将每个签名请求视为支出权限,直到证明相反。
撤销后预防清单
在撤销交易确认后,目标是停止在下次交换、桥接或质押用户界面请求权限时重新创建相同的暴露。干净的姿态是将批准视为头寸大小:限制应与预期操作匹配,而不是最大可能值。
1. 在用户界面允许时,优先选择精确金额的批准。无限制的批准很方便,但如果支出者被攻破,它们也是影响最大的失败模式。 2. 如果必须将授权从一个非零值更改为另一个,请使用“先批准为零再设置”。这是一个小的操作习惯,可以减少已知的竞争条件风险。 3. 定期使用授权跟踪器审查批准。用户安全指南中提到的工具包括Etherscan代币批准、Revoke.cash、Debank和Unrekt。 4. 将Permit和Permit2提示视为高风险时刻。Permit2使用带有截止日期和随机数的EIP-712签名,但签名钓鱼仍然是用户被排水的主要方式。 5. 将“两个账本”模型放在桌子上:经典授权和Permit2。撤销一个随机支出者没有帮助,如果代币仍然被批准给Permit2,而钱包继续从未验证的网站签署授权。
这就是加密钱包诈骗及其避免方法的更广泛学科变得可操作的地方:减少持续权限,验证正在签署的内容,并支付燃料费以关闭不再有用的旧线路。
总结
我看到人们做这种清理的昂贵版本:他们在钱包中断开一个网站,感到安全,然后再次受到攻击,因为代币合约的授权从未改变。唯一重要的问题是支出者是否仍然可以调用该代币的transferFrom。如果答案是“是”,排水路径仍然开放。
保持这种便宜的习惯是将批准视为保证金线。根据交易的大小进行调整,当感觉不对时,即使燃料费很高,也要首先撤销无限制的批准。如果Permit2自2022年末以来一直在流程中,第二个习惯是拒绝签署您无法阅读的EIP-712提示。这就是现在批准钓鱼存在的地方。
来源
常见问题
断开我的钱包与 dApp 的连接会撤销代币授权吗?
不会。断开连接是一个用户界面级别的操作,并不会改变存储在代币合约上的授权额度。支出方仍然可以使用 transferFrom 进行转账,直到您在链上撤销或减少该授权额度。
我如何知道哪些代币授权是最危险的?
无限制的授权影响最大,因为它允许支出方在恶意或被攻破的情况下提取您持有的任意数量的代币。对您不再使用的合约的旧授权也是常见的攻击面,因为它们会持续存在,直到被更改。
撤销授权是免费的吗?
不是。撤销是一个链上交易,会更新授权状态,因此在授权存在的网络上需要支付 gas 费用。这就是为什么许多钱包随着时间的推移会积累闲置授权的原因。
什么是 Permit2,为什么我可能看不到 approve() 交易?
Permit2 是一个 Uniswap Labs 的单例授权合约,使用 EIP-712 签名来授权带有截止日期和随机数的支出。您可能只会看到对某个代币的 Permit2 的一次性链上授权,而后续的授权则通过签名的类型数据消息进行,而不是单独的 approve() 交易。
我可以减少授权,而不是完全撤销它吗?
可以。减少授权与撤销的机制相同,只是将其设置为一个较小的数字,而不是 0。当将非零授权更改为另一个非零值时,更安全的操作模式是“先批准为零,然后再设置”。