用户一定不要点击伪装成奖励、空投等利好消息的不明链接。
撰文:SharkTeam
Web3 钓鱼是一种针对 Web3 用户的常见攻击手段,通过各种方式窃取用户的授权、签名,或诱导用户进行误操作,目的是盗窃用户钱包中的加密资产。
近年来,Web3 钓鱼事件不断出现,且发展出钓鱼即服务的黑色产业链(Drainer as a Service, DaaS),安全形势严峻。
本文中,SharkTeam 将对常见的 Web3 钓鱼方式进行系统分析并给出安全防范建议,供大家参考,希望能帮助用户更好的识别钓鱼骗局,保护自身的加密资产安全。
Permit 是针对 ERC-20 标准下授权的一个扩展功能,简单来说就是你可以签名批准其他地址来挪动你的 Token。其原理是你通过签名的方式表示被授权的地址可以通过这个签名来使用你的代币,然后被授权的地址拿着你的签名进行链上 permit 交互后就获取了调用授权并可以转走你的资产。Permit 链下签名钓鱼通常分为三步:
(1)攻击者伪造钓鱼链接或钓鱼网站,诱导用户通过钱包进行签名(无合约交互,不上链)。
签名对象:DAI/USDC/WETH 等 ERC20 代币(这里是 DAI)
holder:// 签名地址
spender:// 钓鱼者地址
nonce:0
expiry:1988064000 // 过期时间
allowed:true
如果签名了,钓鱼者就从受害者这边获得了用于盗出 DAI/USDC/WETH 等 ERC20 代币(这里是 DAI)的签名(一段 r, s, v 值,钓鱼者与 permit 函数交互时需要用到)。
(2)攻击者调用 permit 函数,完成授权。
https://etherscan.io/tx/0x1fe75ad73f19cc4c3b658889dae552bb90cf5cef402789d256ff7c3e091bb662
(3)攻击者调用 transferFrom 函数,将受害者资产转出,完成攻击。
在这里先说明一下 transfer 和 transferFrom 的区别,当我们直接进行 ERC20 转账的时候,通常是调用 ERC20 合约中的 transfer 函数,而 transferFrom 通常是在授权第三方将我们钱包内的 ERC20 转移给其他地址时使用。
https://etherscan.io/tx/0x9c02340896e238fc667c1d84fec78af99b1642c986fe3a81602903af498eb938
补充说明:这种签名是一个无 Gas 的链下签名,攻击者拿到后会执行 permit 和 transferFrom 链上交互,所以在受害人地址的链上记录中看不到授权记录,在攻击者地址中可以看到。一般来说这种签名是一次性的,不会重复或持续产生钓鱼风险。
Permit2 是 Uniswap 为了方便用户使用,在 2022 年底推出的一个智能合约,它是一个代币审批合约,允许代币授权在不同的 DApp 中共享和管理,未来随着越来越多的项目与 Permit2 集成,Permit2 合约可以在 DApp 生态系统中实现更加统一的授权管理体验,并且节约用户交易成本。
Permit2 出现之前,在 Uniswap 上进行代币兑换需要先授权(Approve)再兑换(Swap),需要操作两次,也需要花费两笔交易的 Gas 费。在 Permit2 推出后,用户一次性把额度全部授权给 Uniswap 的 Permit2 合约,之后的每次兑换只需要进行链下签名即可。
Permit2 虽然提高了用户的体验,但随之而来是针对 Permit2 签名的钓鱼攻击。和 Permit 链下签名钓鱼类似,Permit2 也是链下签名钓鱼,此种攻击主要分为四步:
(1)前提条件是用户的钱包在被钓鱼之前已使用过 Uniswap 并将代币额度授权给了 Uniswap 的 Permit2 合约(Permit2 默认会让用户授权该代币的全部余额的额度)。
https://etherscan.io/tx/0xd8f0333b9e0db7175c38c37e490379bde5c83a916bdaa2b9d46ee6bff4412e8f
(2)攻击者伪造钓鱼链接或钓鱼页面,诱导用户进行签名,钓鱼攻击者获取所需的签名信息,和 Permit 链下签名钓鱼类似。
(3)攻击者调用 Permit2 合约的 permit 函数,完成授权。
https://etherscan.io/tx/0xd8c3f55dfbc8b368134e6236b296563f506827bd5dc4d6c0df39851fd219d658
(4)攻击者调用 Permit2 合约的 transferFrom 函数,将受害者资产转出,完成攻击。
https://etherscan.io/tx/0xf6461e003a55f8ecbe919a47b3c0dc6d0f068e48a941658329e35dc703138486
补充说明:这里攻击者接收资产的地址通常有多个,通常其中一个金额最大的接收者是实施钓鱼的攻击者,另外的则是提供钓鱼即服务的黑产地址(钓鱼即服务 DaaS 的供应商地址,例如 PinkDrainer、InfernoDrainer、AngelDrainer 等)。
eth_sign 是一种开放式签名方法,可以对任意哈希进行签名,攻击者只需构造出任意恶意需签名数据(如:代币转账,合约调用、获取授权等)并诱导用户通过 eth_sign 进行签名即可完成攻击。
MetaMask 在进行 eth_sign 签名时会有风险提示,imToken、OneKey 等 Web3 钱包均已禁用此函数或提供风险提示,建议所有钱包厂商禁用此方法,防止用户因缺乏安全意识或必要的技术积累被攻击。
personal_sign、signTypedData 是常用的签名方式,通常用户需要仔细核对发起者、域名、签名内容等是否安全,如果是有风险的,要格外警惕。
此外,如果像上面这种情况 personal_sign、signTypedData 被用成「盲签」,用户看不到明文,容易被钓鱼团伙利用,也会增加钓鱼风险。
攻击者通过伪造恶意网站,或者在项目官网上挂马,诱导用户对 setApprovalForAll、Approve、Increase Approval、Increase Allowance 等操作进行确认,获取用户的资产操作授权并实施盗窃。
(1)setApprovalForAll
以 PREMINT 挂马钓鱼事件为例,项目方网站上的一个 js 文件(https://s3-redwood-labs.premint.xyz/theme/js/boomerang.min.js)被注入了恶意代码,执行后会动态创建注入恶意 js 文件(https://s3-redwood-labs-premint-xyz.com/cdn.min.js?v=1658050292559)。攻击由这个恶意脚本发起。
用户因未及时发现风险,对 setApprovalForAll 操作进行了确认,无意间泄漏了对资产的操作授权,导致资产被盗。
(2)Approve
与 setApprovalForAll 类似,用户对 Approve 操作进行了确认,泄漏了对资产的操作授权,导致资产被盗。
Approve 误授权:
https://etherscan.io/tx/0x4b0655a5b75a9c078653939101fffc1d08ff7e5c89b0695ca6db5998214353fa
攻击者通过 transferFrom 转移资产:
https://etherscan.io/tx/0x0dedf25777ff5483bf71e70e031aacbaf50124f7ebb6804beb17aee2c15c33e8
Increase Approval 和 Increase Allowance 函数攻击原理也与此类似,默认状态下攻击者对受害者地址代币的操作上限额度为 0,但经过这两个函数的授权之后,攻击者提高了对受害者代币的操作上限,随后就能将该额度的代币转移。
(3)Increase Approval
Increase Approval 误授权:
https://etherscan.io/tx/0x7ae694080e2ad007fd6fa25f9a22ca0bbbff4358b9bc84cc0a5ba7872118a223
攻击者通过 transferFrom 转移资产:
https://etherscan.io/tx/0x15bc5516ed7490041904f1a4c594c33740060e0f0271cb89fe9ed43c974a7a69
(4)Increase Allowance
Increase Allowance 误授权:
https://etherscan.io/tx/0xbb4fe89c03d8321c5bfed612fb76f0756ac7e99c1efaf7c4d99d99f850d4de53
攻击者通过 transferFrom 转移资产:
https://etherscan.io/tx/0xb91d7b1440745aa07409be36666bc291ecc661e424b21b855698d488949b920f
地址污染钓鱼也是近期猖獗的钓鱼手段之一,攻击者监控链上交易,之后根据目标用户历史交易中的对手地址进行恶意地址伪造,通常前 4~6 位和后 4~6 位与正确的对手方地址方相同,然后用这些恶意伪造地址向目标用户地址进行小额转账或无价值代币转账。
如果目标用户在后续交易中,因个人习惯从历史交易订单中复制对手地址进行转账,则极有可能因为大意将资产误转到恶意地址上。
2024 年 5 月 3 日就因为此地址污染钓鱼手法被钓鱼 1155WBTC,价值超过 7 千万美元。
正确地址:0xd9A1b0B1e1aE382DbDc898Ea68012FfcB2853a91
恶意地址:0xd9A1C3788D81257612E2581A6ea0aDa244853a91
正常交易:
https://etherscan.io/tx/0xb18ab131d251f7429c56a2ae2b1b75ce104fe9e83315a0c71ccf2b20267683ac
地址污染:
https://etherscan.io/tx/0x87c6e5d56fea35315ba283de8b6422ad390b6b9d8d399d9b93a9051a3e11bf73
误转交易:
https://etherscan.io/tx/0x3374abc5a9c766ba709651399b6e6162de97ca986abc23f423a9d893c8f5f570
目前,各钱包和安全插件已逐步实现对钓鱼黑名单和常见钓鱼方式的可视化风险提醒,对签名信息也展示的愈发完整,提高了普通用户识别钓鱼攻击的能力。但攻防技术总是在相互对抗又不断发展的,更隐蔽的钓鱼方式也在不断出现,需要提高警惕。利用 CREATE2 绕过钱包和安全插件的黑名单检测就是近期比较常见的方式。
Create2 是以太坊'Constantinople'升级时引入的操作码,允许用户在以太坊上创建智能合约。原来的 Create 操作码是根据创建者的地址和 nonce 来生成新地址的,Create2 允许用户在合约部署前计算地址。Create2 对以太坊开发者来说是一个非常强大的工具,可以实现先进和灵活的合约交互、基于参数的合约地址预计算、链下交易和特定分布式应用的灵活部署和适配。
Create2 在带来好处的同时也带来了新的安全风险。Create2 可以被滥用来生成没有恶意交易历史的新地址,绕过钱包的黑名单检测和安全告警。当受害者签署恶意交易时,攻击者就可以在预先计算的地址上部署合约,并将受害者的资产转账到该地址,且这是一个不可逆的过程。
该攻击特点:
(1) 允许预测性创建合约地址,使攻击者能够在部署合约之前欺骗用户授予权限。
(2) 由于授权时合约尚未部署,因此攻击地址是一个新地址,检测工具无法基于历史黑名单来进行预警,具有更高的隐蔽性。
以下是一个利用 CREATE2 进行钓鱼的示例:
https://etherscan.io/tx/0x83f6bfde97f2fe60d2a4a1f55f9c4ea476c9d87fa0fcd0c1c3592ad6a539ed14
在这笔交易中,受害者把地址中的 sfrxETH 转给了恶意地址(0x4D9f77),该地址是一个新的合约地址,没有任何交易记录。
但是打开这个合约的创建交易可以发现,该合约在创建的同时完成了钓鱼攻击,将资产从受害者地址转出。
https://etherscan.io/tx/0x77c79f9c865c64f76dc7f9dff978a0b8081dce72cab7c256ac52a764376f8e52
查看该交易的执行情况,可以看到 0x4d9f7773deb9cc44b34066f5e36a5ec98ac92d40 是在调用 CREATE2 之后创建的。
另外,通过分析 PinkDrainer 的相关地址可以发现,该地址每天都在通过 CREATE2 创建新的合约地址进行钓鱼。
https://etherscan.io/address/0x5d775caa7a0a56cd2d56a480b0f92e3900fe9722#internaltx
钓鱼攻击日益猖獗,也因不法获利颇丰,已逐步发展出以钓鱼即服务(Drainer as a Service, DaaS)的黑色产业链,比较活跃的如 Inferno/MS/Angel/Monkey/Venom/Pink/Pussy/Medusa 等,钓鱼攻击者购买这些 DaaS 服务,快速且低门槛的构建出成千上万钓鱼网站、欺诈账号等,如洪水猛兽冲进这个行业,威胁着用户的资产安全。
以 Inferno Drainer 为例,这是一个臭名昭著的网络钓鱼团伙,他们通过在不同网站上嵌入恶意脚本来实现钓鱼。例如,他们通过传播 seaport.js、coinbase.js、wallet-connect.js 伪装成流行的 Web3 协议功能(Seaport、WalletConnect 和 Coinbase)诱导用户集成或点击,在得到用户确认后,会自动将用户资产转到攻击者地址中。目前已发现超过 14,000 个包含恶意 Seaport 脚本的网站,超过 5,500 个包含恶意 WalletConnect 脚本的网站,超过 550 个包含恶意 Coinbase 脚本的网站,以及超过 16,000 个与 Inferno Drainer 有关的恶意域名,超过 100 个加密品牌的品牌名称受到影响。如下是一个 Inferno Drainer 相关的钓鱼网站。
该网站的 head 部分包含 seaport.js 和 wallet-connect.js 两个恶意脚本。Inferno Drainer 钓鱼网站的另一个典型特征是用户无法通过鼠标右键打开网站源代码,这使得这些钓鱼网站的隐蔽性更高。
在钓鱼即服务框架下,通常 20% 的被盗资产被自动转移给 Inferno Drainer 的组织者地址,钓鱼实施者保留剩余的 80%。除此之外,Inferno Drainer 定期提供创建和托管网络钓鱼网站的免费服务,有时钓鱼服务也会要求收取被骗资金的 30% 的费用,这些网络钓鱼网站是为那些能够吸引受害者访问但缺乏创建和托管网站的技术能力或根本不想自己执行此任务的钓鱼攻击者设计的。
那么,这种 DaaS 骗局是如何运行的,下图是 Inferno Drainer 的加密诈骗方案的分步描述:
(1) Inferno Drainer 通过名为 Inferno Multichain Drainer 的 Telegram 频道推广他们的服务,有时攻击者也通过 Inferno Drainer 的网站访问该服务。
(2) 攻击者通过 DaaS 服务功能,设置并生成属于自己的钓鱼网站,并通过 X(Twitter)、Discord 和其他社交媒体进行传播。
(3) 受害者被诱导并扫描这些钓鱼网站上包含的二维码或其他方式来连接他们的钱包。
(4) Drainer 检查受害者最有价值、最容易转移的资产,并初始化恶意交易。
(5) 受害者确认了这笔交易。
(6) 资产被转移给犯罪分子。 在被盗资产中,20% 转移给 Inferno Drainer 开发商,80% 转移给钓鱼攻击者。
下图为 DaaS 服务页面,Inferno Drainer 向客户显示他们的统计数据:连接数量(受害者已将钱包连接到钓鱼网站)、成功点击(如果受害者已确认交易)以及被盗资产的价值。
DaaS 服务的每个客户都可以自定义属于自己的 Drainer 功能:
(1)首先,用户一定不要点击伪装成奖励、空投等利好消息的不明链接;
(2)官方社媒账户被盗事件也越来越多,官方发布的消息也可能是钓鱼信息,官方消息也不等于绝对安全;
(3)在使用钱包、DApp 等应用时,一定要注意甄别,谨防伪造站点、伪造 App;
(4)任何需要确认的交易或签名的消息都需要谨慎,尽量从目标、内容等信息上进行交叉确认。拒绝盲签,保持警惕,怀疑一切,确保每一步操作都是明确和安全的。
(5)另外,用户需要对本文提到的常见钓鱼攻击方式有所了解,要学会主动识别钓鱼特征。掌握常见签名、授权函数及其风险,掌握 Interactive(交互网址)、Owner(授权方地址)、Spender(被授权方地址)、Value(授权数量)、Nonce(随机数)、Deadline(过期时间)、transfer/transferFrom(转账)等字段内容。
参考文献
https://x.com/evilcos/status/1661224434651529218
https://x.com/RevokeCash/status/1648694185942450177
https://web3caff.com/zh/archives/63069
https://www.group-ib.com/blog/inferno-drainer/
https://blocksec.com/blog/how-phishing-websites-bypass-wallet-security-alerts-strategies-unveiled
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。