web3钱包地址权限被恶意更改但钱还在
钱包里那笔ETH还在,包地余额没动。址权但Owner权限已经不是限被我了。
上周三凌晨两点,恶意我收到一条链上提醒:我的更改Gnosis Safe多签钱包执行了一笔changeOwner交易。原来的但钱三个签名人里,我的包地地址被踢出,换成了一个陌生地址。址权私钥没泄露,限被助记词没丢,恶意硬件钱包还锁在抽屉里。更改钱一分没少,但钱但钱包的包地控制权已经易主。
这事听起来矛盾——钱还在,址权权限没了,限被那跟钱丢了有什么区别?区别在于:对方还没动手。或者说,对方在等。
权限被改,通常意味着什么
智能合约钱包和普通EOA钱包不一样。EOA钱包的“权限”就是私钥本身,私钥在谁手里,谁就是主人。但合约钱包——比如Safe、Argent、各种多签方案——权限是一套链上逻辑。Owner地址列表、签名阈值、模块扩展,全都写在合约存储里。改掉Owner,等于换锁不换房。
我的情况属于典型的“权限劫持”。攻击者没有拿到私钥,而是通过某个漏洞或授权陷阱,直接调用了钱包合约的管理函数。常见入口有几个:
一是delegatecall注入。某些合约钱包允许通过delegatecall执行外部逻辑,如果没做白名单限制,攻击者可以构造一个恶意合约,在delegatecall的上下文里改写Owner。
二是模块滥用。Safe的模块系统很灵活,但一个被恶意注册的模块可以拥有执行任意交易的权限,包括改Owner。
三是前端钓鱼+盲签。你在某个DApp上签了一笔看似无害的请求,实际上那笔签名对应的payload里藏了权限变更操作。硬件钱包屏幕上显示的可能是“确认交易”,但底层data字段你根本没细看。
我复盘了自己的操作记录,最可疑的是两周前在一个新上线的NFT mint页面签了一笔“approve”交易。当时钱包弹窗显示gas费很低,我扫了一眼就确认了。现在回想,那笔交易的data字段长度异常,但Etherscan上没显示任何代币转移——因为它压根不是approve,而是一个伪装成approve的execTransaction调用。
钱还在,但随时可能没
攻击者改了Owner之后没有立刻转走资产,这反而更让人后背发凉。几种可能:
一是批量收割。对方在用自动化脚本监控一批被控钱包,等ETH价格到某个点位,或者等Gas费降下来,统一执行转移。我的钱包只是列表里的一个。
二是养鱼。有些攻击者会故意留钱,观察钱包主人的反应。如果你没发现,过段时间再动手;如果你发现了但操作失误——比如试图往同一个钱包里转更多钱“测试”——那就一并收走。
三是等待授权。钱包里除了ETH,还有几个NFT和ERC-20代币。攻击者可能在等某个代币的流动性变好,或者等某个NFT的地板价回升。
我查了那个新Owner地址的链上记录。它在过去一个月里,从十几个不同钱包的Owner变更中接收了权限,但只转走过其中三个的资产。其余的,都还在原地放着。
现在能做什么
钱还在,意味着还有时间窗口。但窗口可能只有几小时,也可能有几天。
第一件事是停止一切对该钱包的入金操作。别再往里转钱,别再往里面mint任何东西。你转进去的每一分钱,都是给攻击者的礼物。
第二,如果钱包合约支持恢复机制——比如Safe的社交恢复或Guardian模块——立刻启动。但大多数情况下,Owner被改之后,原Owner已经没有任何链上权限去执行恢复操作。你只能通过合约层面的漏洞或治理提案来抢回控制权,这对普通人来说几乎不可能。
第三,把还在钱包里的资产“抢”出来。如果攻击者还没改签名阈值,而你的地址虽然被踢出Owner列表,但某些合约钱包允许原Owner在特定条件下执行紧急提取——这取决于具体实现。我的Safe版本不支持,所以我只能眼睁睁看着。
第四,链上留证+报警。虽然追回概率极低,但至少把交易哈希、攻击者地址、时间线整理清楚。如果涉及金额大,可以联系Chainalysis或慢雾这类链上分析团队,看看攻击者地址是否与已知团伙关联。
我最后做的一件事,是在钱包里留了一笔0.01 ETH的“诱饵”,然后盯着链上监控。三天后,那笔钱被转走了。攻击者终于动手了。但我的主要资产早在发现权限被改的当天,就通过一个还没被移除的模块调用,紧急转移到了新钱包。
那个模块是两年前部署的,我自己都忘了。攻击者也没注意到。
运气。纯粹是运气。