你的钱包还安全吗?黑客是如何利用Permit、Uniswap Permit2、授权签名进行钓鱼的
记得之前群里有伙伴分享过一句话:如果你不清楚谁在提供收益 ,那么你就是提供收益的那个人。我感觉这句话说的很有道理。在加密钱包使用的安全方面也一样,如果你不确定自己正在做的操作意味着什么,那么你进行的每一个链上交互或签名都有可能失去钱包内的资产。
前段时间,Scam Sniffer 发布了一份 2024 年中网络钓鱼报告:在今年的上半年,仅 EVM 链(即以太系链)上就有 26 万名受害者被钓鱼,累计损失了 3.14 亿美元。与去年(2023年)被钓鱼攻击盗走的 2.95 亿美元相比,今年仅用了 6 个月就达到了这一数字。如下图所示。
根据该报告显示,目前多数 ERC20 代币的盗窃源于签署钓鱼签名,如 Permit(离线授权签名方式)、Increase Allowance(增加授权额度方式)和 Uniswap Permit2,钓鱼攻击无疑仍是链上安全问题的重灾区。
前几天有个伙伴反映了一个问题,这位伙伴两个月前(6月14日)从 Coinbase Wallet 转了 3 笔钱到 Binance 里面(基于以太链的转账),第一笔转账是成功的,但后继两笔转账一直没有收到,时间已经过去两个月了,不知道出了什么问题?
于是,我通过 Etherscan 看了下链上的 Token 交易记录,但只看到了一笔对应的转账(Transfer),并没有看到另外两笔的记录。如下图所示。
我又进一步看了下 6 月 14 日当天所有的链上交易记录,发现确实有 3 笔转账(Transfer)记录,不过后面两笔显示是交易失败的。如下图所示。
接着,我点开其中一条失败(Fail状态)的交易记录看了一下,显示的错误提示是“合约执行时遇到错误”,而此类错误理论上讲,并不会导致钱包内的资产丢失,因为按照 Etherscan 官方文档的说明,此类错误下发送者发送的资产(代币)并不会离开发送者钱包地址,只会扣除 Gas 费。如下图所示。
所以,解决这样的问题需要确认的是:
-确定钱包内的资金当天是否真的转出或丢失(即交易失败后没有退回到钱包)
-如果确认资产已被转出或丢失,那么可能需要联系对应网站的客服人员支持一下了(这种情况主要是联系发送方或提币平台,也就是发起这笔转账的来源方进一步确认,接收方或到账地址的平台无法处理)
基于这个问题,我的常规建议是:大家在日常的交易过程中,最好是做一个交易记录表,比如可以使用 Excel 等工具做好日常的交易(买/卖)记录、钱款开销(入账/出账)记录等。然后如果遇到一些问题,这个表还可以配合链上的交易记录进行比较检查。其实我自己也是有这样的一个表格的,每做一笔交易,我都会进行详细的记录(有些记录后面也会备注一些交易心得什么的)。
到此,上面这个问题似乎基本整明白了。但在通过链上查询交易记录的过程中,我发现这位伙伴的钱包还有一个更严重的问题:被黑客盯上了!
怎么回事呢?我们接着往下看(如下图所示):
先看上图红色框(真实的交易):
钱包持有人刚进行了一笔 1 万美元的 Swap 操作,并将兑换好的 USDT 转到了 0x8F 开头(f103结尾)的钱包中。
再看上图绿色框(钓鱼的交易)
紧接着,黑客就创建了数条虚假交易,而且要注意,黑客创建的地址钱包也是 0x8F 开头(f103结尾)的。
我们进一步对比下这些钱包地址看看:
下面是钱包持有人的真实地址:
0x8F773C2E1bF81cbA8ee71CBb8d33249Be6e5f103
下面是黑客的钱包地址:
0x8F7cCF79d497feDa14eD09F55d2c511001E5f103
0x8F776d5623F778Ea061efcA240912f9643fdf103
此时大家应该看出问题了吧。这些钱包开头的 4 位和结尾的 4 位都是相同的,如果不仔细看,可能都不会发现。如果此时直接通过交易记录复制钱包地址进行转账,那么基本就意味着钱会直接转给黑客。
因此可以肯定的是,这位伙伴的钱包确实是被黑客盯上了,黑客希望通过钓鱼的方式来骗走这位伙伴的资产。而且,通过交易哈希页面的数据显示,我们还能够发现,对应的 Transaction Action 也被标记了 Fake_Phishing,这 100% 就是一个黑客地址。如下图所示。
补充小知识:为什么使用 Etherscan 的时候看不到那些无效交易或零转账记录?如何将以太坊浏览器设置为简体中文界面?
这是因为以太坊官方浏览器默认是会隐藏掉无效交易和零转账记录,如果你需要查看此类数据,那么可以通过 Etherscan 的设置页面,开启其中的高级功能即可。同样,如果你喜欢使用简体中文界面,那么也可以在设置页面进行选择。如下图所示。或者,你也可以考虑使用诸如 Oklink 这样的第三方多链浏览器(也支持简体中文显示)。
钱包使用安全问题确实是一个需要特别注意的事情,尤其是针对大额(100万美元以上)资产的钱包。建议可以把资产根据使用情况分配到不同的钱包,以此来提升安全性,比如我自己的钱包就分了下面的几级:
一级是用苹果手机做的冷钱包,就是囤币用的,断网状态且不会做任何的交易/转账操作,这部分资产至少 10 年内我是不会考虑动的。当然,如果你希望通过冷钱包进行交易,那么可以考虑去通过正规渠道购买那些知名的硬件钱包(比如Trezor、Ledger等)
二级是比较大额资金的热钱包,我使用的是 Trust Wallet,且不会做任何的 dApp 授权,只是与其他自己的钱包进行转账,包括与 Binance 的提币或转账操作。
三级是几十个小钱包,有些是测试用的(比如参与各种新项目的交互去体验产品或顺便撸一下空投),有些是之前买山寨或土狗币用的(只是这几年我很少再做这方面的交易了),且每个钱包都是小额资金、几百-几千美金不等。这种钱包的日常授权/签名我就比较随意了,即便被盗也无所谓。虽然,这些钱包使用和管理上似乎有些麻烦,但主要是为了安全~
总之,不同的人在钱包的使用上可能会有不同的偏好,这个就看自己的个人情况了。老韭菜可能更喜欢将资产存放到链上,但对于大部分刚进入这个领域的新人而言,其实直接使用 Binance、OKX 这样的大所存放资产(不超过 10 万美元)反而是更安全的。
接下来,我们继续给大家梳理几个目前比较常见的钓鱼方式:
1.Permit 钓鱼攻击
首先我们需要进行一个基础知识的科普:当我们在以太坊上进行 Token 转账的时候,通常是调用该 Token 智能合约的 Transfer 函数、或 Transfer From 函数来执行的。其中,Transfer 指的是资产拥有者本人进行授权操作并把 Token 转移给其他地址,而 Transfer From 指的是第三方直接将地址内的 Token 转移给其他地址。
Permit 钓鱼攻击的攻击过程如下:
首先,攻击者通过伪造钓鱼链接或钓鱼网站,诱导用户通过钱包进行签名(不上链)。
其次,攻击者调用 Permit 函数完成授权。
然后,攻击者通过调用 Transfer From 函数,将受害者资产转出,完成钓鱼攻击。
这种钓鱼方式有一个特点,即攻击者拿到签名授权后执行 Permit 和 Transfer From 操作,而受害人地址的链上交易记录中默认是看不到授权记录的,但在攻击者地址中可以看到。
一般来说,这种签名授权攻击是一次性的,不会重复或持续产生钓鱼风险。大白话解释就是:签名钓鱼无法盗走你钱包的助记词(或私钥),一次签名钓鱼只能使用一次,且只针对该帐户对应链的对应币种(比如你授权了USDT、那么黑客只能盗走你的USDT)。简单而言就是被钓鱼一次签名,黑客只能用一次,除非你后面继续进行误签被黑客利用。
2.Uniswap Permit2 钓鱼攻击
这种钓鱼方式和上面提到的 Permit 类似,都属于链下签名钓鱼。所谓 Uniswap Permit2 是 Uniswap 在 2022 年推出的一种智能合约,根据官方的说法,这是一个代币审批合约,允许代币授权在不同的应用程序中共享和管理,创造一个更统一、更具成本效益、更安全的用户体验。目前,很多项目都与 Permit2 进行了集成。
最近也看了 bocaibocai(X@wzxznl)写的几篇文章,进一步了解了 Uniswap Permit2 这种钓鱼攻击的方式。这里我简单给大家做个概要:
当我们要在某 DEX 上进行 Swap 操作时,传统的交互方式是我们需要先 Approve 给这个 DEX 进行授权,然后再进行 Swap 交易,这通常需要花费我们两笔 Gas 费,对于用户来说摩擦成本太大了,而 Permit2 可以把这个步骤给省去,这样可以非常有效的降低用户的交互成本,带来更好的用户体验。
也就是说,Permit2 作为用户和 dApp 之间的中间人,用户只需要把 Token 的权限授权给 Permit2 合约,所有集成 Permit2 合约的 Dapp 都可以共享这个授权额度,对于用户来说,减少了交互成本和提高了用户体验,对于 dApp 来说,用户体验的提升带来更多的用户和资金。
这本是一个双赢的局面,但同时这也可以是一个双刃剑。在传统的交互方式中,不管是授权还是进行资金的转移对于操作的用户来说都是链上的交互。而 Permit2 则将用户的操作变为了链下签名,所有链上的操作都由中间角色(如 Permit2 合约和集成了 Permit2 的项目方等)来完成,这种方案带来的好处是由于链上交互的角色从用户转移为了中间角色,但对于用户来说,链下签名是最容易放下防备的环节,比如当我们用钱包登入某些 dApp 的时候会需要签名进行连接,而绝大多数人并不会仔细检查签名的内容也并不理解签名的内容(对应普通用户而言,签名界面看起来就是一堆代码),而这就是最可怕的地方。
另外一个很可怕的点是,不管你要 Swap 的金额是多少,Uniswap 的 Permit2 合约都会默认让你授权该 Token 全部余额的额度,虽然 MetaMask 等钱包会让你自定义输入金额,但估计大部分人都会直接点击最大或默认值,而 Permit2 的默认值是无限的额度。如下图所示。
而这也就意味着,只要你与 Uniswap 有过交互并授权额度给 Permit2 合约,你就会暴露在这个钓鱼骗局的风险之下。
举个例子,小李之前使用 Uniswap 的过程中授权给了 Uniswap Permit2 无限的 USDT 额度,而小李在日常进行钱包操作的时候又不小心掉入了黑客设计的 Permit2 签名钓鱼陷阱,黑客拿到了小李的签名后就可以利用小李的签名在 Permit2 合约中进行了 Permit 和 Transfer From 两个操作把小李的资产转移走。
这种钓鱼攻击方式的具体步骤大致是:
首先,用户的钱包在被钓鱼之前已使用过 Uniswap 并将代币额度授权给了 Uniswap Permit2 合约(上文已经提到过,Permit2 的默认值是无限的额度授权)。
其次,攻击者伪造钓鱼链接或钓鱼网站页面,诱导用户通过钓鱼链接或网站进行钱包签名,然后攻击者就可以获取所需的签名信息(这个步骤和 Permit 钓鱼类似)。
然后,攻击者调用 Permit2 合约的 Permit 函数,完成授权。
最后,攻击者调用 Permit2 合约的 Transfer From 函数,将受害者资产转出,完成钓鱼攻击。
一般情况下,这种攻击方式接收资产的地址会比较多,有些是专门用于实施钓鱼的地址(甚至会伪造与被害者钱包地址收尾相同的地址),有些则是专门提供钓鱼服务的黑产地址(比如一些DaaS供应商地址、目前针对加密钱包的钓鱼似乎也已经形成了一条完整的黑色产业链)。如下图所示。
那么,该怎么防范 Permit、Permit2 这种问题呢?
首先可以考虑使用比如 Scamsniffer 这样的浏览器安全插件(我自己的谷歌浏览器一直在使用该插件)防范钓鱼链接,其次就是可以考虑使用 Revoke Cash 这样的工具来定期检查并取消那些陌生或不必要的授权或签名。如下图所示。
或者也可以考虑直接使用 Scamsniffer 推出的专门针对 Uniswap Permit2 的授权管理工具进行定期检查,若有异常授权,建议及时取消授权。如下图所示。
当然,最重要的还是自己的安全意识,不要随便访问那些来历不明的链接或网站,平时进行 dApp 交互授权的时候要多进行必要检查。
补充小知识:如何识别钱包签名是属于 Permit、还是 Permit2?
日常进行各种签名的时候,我们会看到授权确认界面上面会出现一些代码,我们需要通过这些代码来进行识别,如下图所示。
上图中的 Owner(授权方地址)、Spender(被授权方地址)、Value(授权数量)、Nonce(随机数)、Deadline(过期时间)。
3.Claim 钓鱼攻击
这种钓鱼方式也是非常常见的,比如我们经常刷 X 平台的话,就会发现有很多所谓免费领取空投的信息,甚至有时候我们的钱包里面也会莫名收到一些空投的 NFT 小图片(图片上面可能有个域名地址)。
而如果你点击进入了指定的钓鱼网站,并进行了 Claim 操作,那么你钱包中的资产可能就会直接被黑客转走了。
那么,该怎么防范这种问题呢?
首先是不要相信那种天上掉馅饼的事情(即不要乱点那些来路不明的免费领域 NFT、空投等链接),其次在进行任何 Claim 操作的时候,一定要核实自己访问的地址是不是真实的官网地址,不要掉以轻心。
4.相似地址转账钓鱼
今年的 5 月 3 日就发生了这样一起案例,一个巨鲸遭遇了相同首尾号地址钓鱼攻击,被钓走 1155 枚 WBTC(当时价值约 7000 万美元)。
慢雾之前针对该事件有过具体的分析,我就不再赘述了,感兴趣的小伙伴可以去搜索回顾一下。
这种钓鱼方式其实看起来比较简单:
首先,黑客会提前批量生成大量钓鱼地址,这种地址都具有一定的迷惑性,比如首 4 位及尾 6 位与受害者目标转账地址一致的地址。
其次,进行分布式部署批量程序后,根据链上用户动态,向目标转账地址发起相同首尾号地址钓鱼攻击。
然后,等目标用户(受害者)进行转账后,黑客立即使用碰撞出来的钓鱼地址尾随一笔交易,这样钓鱼地址就出现在了用户的交易记录里。如下图所示。
接着,由于用户习惯从钱包历史记录里复制最近转账信息,看到了这笔尾随的钓鱼交易后没有仔细检查自己复制的地址是否正确,结果将 1155 枚 WBTC 误转给了钓鱼地址。
那么,该怎么防范这种问题呢?
首先,是可以将常用的地址保存到钱包的地址簿当中(或加入白名单),下次转账可以从钱包的地址簿中找到目标地址。其次,要仔细核对地址是否正确,不要只简单地核对前几位或者后几位就进行转账,进行大额转账之前建议先进行小额转账测试。
5.授权签名钓鱼
其实我们上文提到的 Permit、Uniswap Permit2、Claim 也都属于授权钓鱼范畴。而提到授权,还有不少的方式可以被黑客利用,比如另外比较常见的 Approve(即授权,相当于是告诉 USDT 的合约,Uniswap可以挪用我钱包中的USDT)、Increase Allowance(增加授权额度)、等等。
而攻击的方式也基本是:攻击者通过钓鱼链接或钓鱼网站,或者直接黑了项目方的官网挂上木马,然后诱导用户点击并授权钱包。
当然,我们上面也仅是列举了 5 种目前比较普遍的钓鱼攻击方式,而目前黑客的攻击手段也是五花八门、层出不穷的。所谓道高一尺魔高一丈,只有你想不到的,没有黑客想不到的。钱包使用安全问题,不容忽视。
本期内容我们就分享到这里,更多文章可以通过话李话外主页进行查看。
声明:以上内容只是个人角度观点及分析,仅作为学习记录和交流之用,不构成任何投资建议。加密领域为极高风险市场,很多项目有随时归零的风险,请理性看待,自我负责。