你检查了委托合约地址,确认是官方白名单,然后放心地点了授权。但你别忘了——如果委托合约是可升级的,它今天指向的代码是安全的,明天可能就不是了。
先搞懂:可升级合约为什么能"换芯"
EIP-7702 委托的关键是两件事:你授权给了哪个合约地址(委托合约),以及这个委托合约当前指向什么代码逻辑(实现合约)。
很多钱包会建议用户委托给代理合约(Proxy),而不是直接委托给具体的实现合约。以太坊官方 EIP-7702 指南明确提到了代理模式的优点——可升级性:通过将代理指向新的实现合约来更新合约逻辑。
代理模式让开发者可以不用改变委托地址,就能升级背后的业务逻辑。你的委托看起来没变,但实际执行的代码已经换了。
攻击路径还原:恶意升级如何绕过你的授权
我拆解一个真实的攻击场景,你对照看看:
第一步:诱骗签名 你在 DApp 或钱包里看到"升级钱包"、"启用智能账户"的弹窗,签名授权了一个可升级代理合约(不是直接代码)。
第二步:保持安全假象 授权后,委托合约指向的代码可能是安全的,甚至还能正常执行批量交易。你觉得"没问题"。
第三步:远程"换芯"
攻击者(或合约所有者)通过代理合约的 upgradeTo 函数,在不改变委托地址的情况下,把指向的代码替换成恶意逻辑。
第四步:持久接管
你的委托地址看起来还是那个"安全的"代理合约。但一旦调用,执行的已经是恶意逻辑。不需要你重新签名。因为代码已经换了,委托地址本身没变。例如,一个恶意升级可能引入对 selfdestruct 的调用,或窃取私钥签名。
正确做法对比:检查"可升级性"而不只是地址
| 做法 | 说明 |
|---|---|
| 错误做法 | 确认委托合约地址在白名单后就不管了。 |
| 正确做法 | 1. 查询委托合约是否是代理合约(查看 getImplementation 或是否有 upgrade 函数)。2. 如果使用了代理模式,检查该代理合约的所有权(Owner)是谁。3. 确认所有权归属于可信的第三方(如安全委员会或知名协议),而非单个 EOA。 |
怎么检查"可升级性"
[做什么]:确认你授权的委托合约是否会"换芯"。
[怎么做],按顺序操作:
第一步:在区块浏览器上查代理状态 在 Etherscan 上搜索你授权的委托合约地址。
- 查看该合约的代码,搜索
upgrade、setImplementation、changeImplementation等关键词。 - 如果合约代码中有这些函数,它就是一个可升级合约。
第二步:查所有者地址
如果可升级,在 Etherscan 的"Contract"或"Read Contract"标签页中,找到 owner、proxyAdmin 或 admin 字段。如果显示为 0x000...000(零地址) 或一个知名的多签钱包,风险相对可控。如果显示为一个个人 EOA 地址或是一个未公开的地址,风险极高。
完成标准:你能确定你的委托合约是"不可变"的,或者它的升级权限被一个可信实体牢牢管控着。
风险提醒:Wallets 可以强制用户先撤销再重新授权,以便从白名单中剔除任何可升级的委托合约。在此之前,DApps 不应直接请求 EIP-7702 授权签名,必须依赖特定的钱包接口。
举一反三的排查清单
下次授权任何合约前,按这个清单过一遍:
| 排查项 | 安全状态 | 危险信号 |
|---|---|---|
| 委托合约是否可升级 | 不可变合约 | 含 upgrade 函数 |
| 升级权限由谁控制 | 多签钱包/DAO/零地址 | 单个个人钱包地址 |
| 是否提供锁定机制 | 有且启用 | 无或未启用 |



