2024-09-21
从解药到毒药:Permit 为何变成风险之源?
撰文:Keystone
1.一分钟认识 Permit 是什么
我们先从一个借钱小故事开始说起:
我准备向好朋友杰克马借 100 万,杰克马二话不说拿起电话打给银行,确认身份后告知银行:我要授权给某某某 100 万的提款额度,银行回复收到授权并记录在案。
下一步我只需要去到银行,告知柜台准备取走杰克马给我授权的 100 万。这时银行会查阅有没有授权记录并在确认我就是某某某后,把 100 万给到我。
这个小故事可以视为 ETH 上 Approve 授权的具象化。在这个过程中,授权只能由杰克马(资产所有人)打电话告知银行进行授权(上链),并由银行(Token 合约)管理这些授权,之后我(被授权方)才能从银行转走不高于授权金额钱。假如银行没有查到授权记录的话,我的提款申请毫无疑问会被拒绝。
好了,接下来如果换成另外一种授权方法——Permit,向杰克马借钱的话,流程会有什么变化?
这次我一开口又要借 100 万,大方的杰克马也懒得打电话了,从口袋里掏出一本支票,填写金额并签名之后给了我。我拿着这张支票去到银行兑换,此时尽管银行没有授权记录,但是凭借着支票上杰克马的签名,银行确认了支票的真实性,将指定金额的钱兑付给了我。
相信小伙伴们已经看出了二者在流程上的差异,Approve 作为 ERC-20 中重要功能,在 ETH 上线后不久就已经被广泛应用了,为什么后来还要在 ERC-2612 中引入 Permit 方法来实现相同效果的特性?
2.为何需要 Permit?
ERC-2612 提案自 2019 年 3 月份被提出,直到 2022 年 10 月完成最后审查,它的上线和这期间 ETH 主网上的 gas 价格经历了多次暴涨有着密不可分的关系。
图:ETH 主网 gas price 在 2020-2022 年期间居高不下
狂暴牛市叠加链上新项目的造富效应,用户链上的交易热情高涨,并且愿意付出更高的手续费来让交易更快上链,因为有时候提前一个区块上链往往意味着更高倍的收益。
但这种现象的后果是用户在链上交易代币的时候,往往需要顶着高昂的 gas 费用进行,在 Approve 的方法流程下,需要 2 个 TX 才能完成一次代币 Swap,对于资金量小的用户来说,花费的交易费用简直是噩梦般的存在。
而 ERC-2612 引入的 Permit,将授权的过程改为了离线签名,不需要立刻上链,只需要在转移代币的时候一起提供,就像借钱小故事中拿到了杰克马支票的我,只有在取款的时候才需要把支票给银行验证。
大忙人杰克马省下了一通电话,看起来用户也省了一次 TX,在 gas 价格高的时候节省的费用相当可观,似乎是个皆大欢喜的结局。但殊不知,潘多拉的魔盒也在悄悄地打开……
3.火山爆发般的野蛮生长
在 Permit 出现之前,黑客钓鱼币圈用户的手段之一便是诱导用户签署 Approve 交易,这样的交易需要用户花费 gas,容易引起警觉而无法得逞。就算用户一时手快点击了,由于交易上链需要一定时间,回过神来的用户也可以马上提交一笔相同 nonce 的交易来抢救,相对来说黑客得手并不那么轻松。
而 Permit 的出现,对黑客来说无疑是瞌睡遇枕头,相比较于 Approve,Permit 不消耗 gas,只需要签名,用户的警惕性降低。同时由于离线签名的特性,主动权掌握在黑客手上,不仅用户吃不了后悔药,黑客更可以拿着授权选择合适的时机做坏事,将利益最大化。
由此而带来的不良影响,便是我们可以看到的钓鱼受害者数量以及被盗金额激增。据 @ScamSniffer 的统计数据:
2023 年钓鱼受害者损失金额为 2.95 亿美元。
在 2024 的上半年,这一金额就已经超过 3.14 亿美元之多。
在 2024 的 Q3 尾声,更是来了一票大的:疑似神鱼的钱包地址遭遇 Permit 钓鱼攻击,损失 1.2 万枚 $spWETH,价值 2 个亿人民币。
图:ScamSniffer 2024 上半年钓鱼攻击统计报告
如此景象,相信也出乎当初提案开发者的意料,引入 Permit 的初衷是减少用户的 gas 花费,提高用户体验和效率,本以为是双刃剑有得便有失,没想到却是一把大菜刀,单边锋利无比,直接给用户资产安全的护盾上砍开了一个大口子。
类似 Permit 这种签名授权的方法还有不少,比如 Uniswap 之后推出的 Permit2,让所有 ERC-20 的代币都可以支持离线签名。作为 No.1 的 DEX,UniSwap 此举也加重了用户对于离线签名的依赖,增加了被钓鱼的风险。
4.如何防范?
那么,作为普通用户,面对这把高悬在我们头顶的达摩克里斯之……大菜刀,又有哪些可以避免损失防范措施呢?
1、提升意识
冷静对待空投诱惑
币圈项目方空投确实很香,但大多数时候都是假空投之名的钓鱼攻击,在遇到这类信息时,千万不要被冲昏头脑直接就「领取」,通过多方来源确认空投的真实性和官方网址,避免误入钓鱼网站。
避免盲签
假如不幸进入了钓鱼网站,尚不知情的你在钱包弹出交易窗口时,应当仔细查看交易内容,当出现如 Permit、Permit2、Approve、IncreaseAllowance 等字眼时,意味着这笔交易是要拿走 token 授权,你就要警惕了,因为正常的空投流程并不需要这么做。Keystone 在硬件端也实现了对交易的解析与展示,用户可以借助交易解析避免盲签,避免一时冲动造成的严重后果。
图:Keystone 硬件钱包与 Rabby Wallet 解析并显示 Permit2 签名交易
2、善用工具
ScamSniffer
作为普通用户,想精准识别钓鱼网址有很高难度,难免会有漏网之鱼存在。借助 ScamSniffer 的浏览器插件,在进入疑似钓鱼的网址前,会收到插件的提醒,用户收到提醒后可以及时停止交互。
Revoke
Revoke.cash 可以展示用户钱包里的代币授权记录,对于其中可疑的、无限金额的授权我们建议撤销。养成定期清理授权的习惯,尽量少做超出需要数量的授权。
3、资产隔离与多签
常言道不要把鸡蛋都放在一个篮子里,这句话对于币圈资产也适用。比如我们可以把大额的资产存放在冷钱包如 Keystone 中,日常交互都是用小额的热钱包进行,即使不小心中招,资产也不会被一锅端。
如果对于安全性有更高的要求,可以使用多签来进一步提高安全性。加入了多签的资产,只有在钱包同意数达到阈值时,才能对资产进行操作转移。未达到阈值的单一钱包被盗,黑客也无法掌握资产。
5.结语
我们无法否认 Permit 带来的价值,但近来越来越多的被盗事件也表明,它带来的危害似乎更大。正如曾经的 ethsign 方法,由于可读性差且危害巨大,也备受当时的黑客青睐。而如今它已经被绝大多数的钱包软件屏蔽弃用,它实现的功能也被一些更安全的方法所替代。
把目光放在 Permit 身上,是否也同样走到了 ethsign 曾经面临的十字路口?改良升级还是弃用,需要 ETH 的开发者们花一些时间去思考和讨论。