两个钱包,一个被清空一个安然无恙:我复盘了那晚的每一个操作
2023年11月,我朋友老陈在Opensea卖了一只NFT,0.8 ETH到账。他顺手把ETH转进了自己常用的热钱包,然后就睡了。第二天醒来,钱包余额是0。
同一周,我另一个朋友阿May也遭遇了钓鱼攻击。她点了一个假Blur链接,签名了一笔setApprovalForAll。但她的损失是0。
差别在哪?老陈的钱包是“能用的”,阿May的钱包是“被设计过的”。
老陈踩的坑,你可能正在踩
老陈的钱包私钥存在手机备忘录里,加密了,但密码是chen888888。他的钱包助记词截图存在相册,没开iCloud同步,但手机没设锁屏密码。他平时用这个钱包连各种新项目、领空投、签合约,里面常年放着0.5到2个ETH的流动资金。
出事那晚,攻击者通过他之前授权过的一个恶意合约,调用了transferFrom。老陈根本不知道那个合约还有权限。他以为“只授权一次,用完就没了”。
实际上ERC-20的approve授权,如果不手动取消,是永久有效的。那个恶意合约是他在三个月前撸空投时签的,当时觉得“反正钱包里没多少钱”。
讲真,这种心态最要命。钱包里“没多少钱”的时候不设防,等有钱了,之前的授权全成了定时炸弹。
阿May做对了什么
阿May的钱包分了三层:
第一层是冷钱包。 Ledger Nano S Plus,只进不出。助记词手写在纸上,塑封,放保险柜。她跟我说过一句话:“我买Ledger的时候,客服问我助记词,我说你再说一遍我就挂电话。”——Ledger官方永远不会主动索要助记词。
第二层是交互钱包。 专门用来连DApp、领空投、mint。里面只放0.1 ETH左右的gas费,用完就从冷钱包转。这个钱包她每周日用Revoke.cash扫一遍授权,把不用的全取消。
第三层是存储钱包。 只用来收转账,不连任何DApp。私钥存在1Password里,开了2FA。
阿May被钓鱼那天,签名的正是她的交互钱包。攻击者拿走了0.08 ETH,冷钱包和存储钱包毫发无伤。她发现后10分钟内用Revoke.cash取消了授权,换了新钱包地址。
具体怎么设,一步一步来
助记词:别存在任何联网设备里
纸质手写,两份,分开存放。一份家里保险柜,一份银行保管箱。不要拍照,不要存备忘录,不要发微信文件传输助手——我见过有人发到“文件传输助手”然后忘了删。
如果你非要用数字方式备份,用不联网的旧手机,存进加密的KeePass数据库,然后把手机卡拔了、WiFi关了、放抽屉里。但说实话,纸最靠谱。
钱包分层:至少两个地址
冷钱包一个,热钱包一个。热钱包只放你“丢了不心疼”的金额。具体比例看你的持仓规模,我的习惯是热钱包不超过总资产的5%。
每次交互前,从冷钱包转刚好够用的gas费到热钱包。用完剩下的转回去。多花两分钟,省得半夜睡不着。
授权管理:每月扫一次
打开Revoke.cash,连钱包,看“Allowances”列表。你会看到一堆你根本不记得的合约。把不用的全取消,每笔取消大概花0.5到2美元的gas,取决于链上拥堵情况。
重点看setApprovalForAll(NFT全权限授权)和无限额的ERC-20授权。这两类最危险。
硬件钱包:买官方渠道的
亚马逊第三方卖家的Ledger,有人收到过被调包的。拆开包装里面是假的,附带的“助记词卡”是攻击者预生成的。你按卡上的助记词设了钱包,钱全进了别人的地址。
只在官网买。收到后检查包装封条,初始化时设备会生成新助记词——如果它给你一张印好的卡片让你用,直接退货。
手机端:锁屏密码和钱包密码分开
老陈的手机没锁屏密码,这是致命伤。手机丢了或者被物理接触,钱包App直接打开。
设一个6位以上的锁屏密码,钱包App再设一个独立密码。别用生日、别用手机号后四位。我见过最离谱的是用123456,跟没设一样。
一个容易被忽略的细节
签合约的时候,看清楚是approve还是setApprovalForAll。前者是授权某个代币的额度,后者是授权你所有NFT的转移权。
很多钓鱼网站把setApprovalForAll伪装成“领取空投”的按钮。你点了,签名了,你钱包里所有该系列的NFT他都能转走。
MetaMask在签名弹窗里会显示“此请求允许访问你的全部NFT”。看到这句话,停下来,想想这个网站你认不认识。
出事之后的第一件事
如果你发现钱包被盗,别慌。按顺序做:
- 立刻把剩余资产转到安全地址(如果还有的话)
- 用Revoke.cash取消所有授权
- 检查关联钱包——如果你用同一个助记词派生过多个地址,全都要处理
- 在Etherscan上标记被盗地址,有些交易所会拦截流入的黑产资金
老陈那天晚上没做第2步。他以为钱没了就没了,结果攻击者留了一个后门授权,第二天又转走了他后来充进去的0.3 ETH。
钱包安全这事,说白了就是“假设你会犯错,然后设计一个犯错也不至于全丢的结构”。阿May也点了钓鱼链接,也签了名,但她只丢了0.08 ETH。老陈丢了1.1 ETH外加一个NFT。
区别不在运气,在设置。