解读NFT项目6529:推广开放
一万五千字报告教你如何抗击区块链诈骗之二
2.1.3 域名仿冒类攻击介绍
域名仿冒类攻击实施通常需要满足一定的先验条件:
攻击者持有相似的域名
攻击者利用持有的域名部署了类似的DAPP服务;
攻击者部署的服务能够以假乱真,使访问者误以为其访问的是官方网站;
被仿冒站点在近期举办了需要使用区块链钱包进行交互的活动等。
在2022年7月13日左右,由明星代言的Theirsverse NFT项目就遭遇了域名仿冒攻击,攻击者仿造正版域名“theirsverse.com”注册了仿冒的域名“theirverse.com”,为了使访问到仿冒站点的用户更加确信其访问的是官方网站,攻击者进行了如下工作使其站点看起来更加真实:
复制了部署在“theirsverse.com”域名的前端界面并部署到仿冒域名DNS指向的Web服务器处;
通过重构代码的方式对前端逻辑进行了修改及调整,添加诱导用户通过区块链钱包进行approve代币授权操作,并在获得用户授权后直接盗取用户数字资产的逻辑。
经链上数据分析发现了一名遭遇仿冒域名钓鱼攻击的受害者:其损失的数字资产超过1.3w美金。这名受害者的遭遇为很多区块链用户提供了重要的警示作用。Theirsverse项目发行的NFT在7月13日左右正在举办铸造NFT的活动,用户可以支付0.15ETH并mint一个Theirsverse NFT。
受害过程如下:
1)受害者为了及时参与到抢购活动,在开车时尝试使用手机钱包访问项目官方网站;
2)由于受害者没有记住项目方提供的官方网站域名,在输入域名时错将正版域名输入为仿冒域名,由于此时受害人正在开车,并没有注意到域名的差异;
3)攻击者专门在仿冒域名处部署一套完全克隆了官方网站的代码,使受害人确信其访问的站点为项目官方站点;
4)仿冒网站与官方网站相差无异,此时受害者已进入攻击者所布置的钓鱼陷阱,在没有连接区块链钱包并进行交易授权时,此时其数字资产仍然是安全的;
5)受害者使用区块链钱包连接仿冒网站,仿冒站点已具备查看受害者钱包地址信息的权限,用户持有的数字资产及价值已被攻击者获取;
6)此时仿冒站点开始频繁向用户发起授权请求;
7)受害者误以为自己正在访问Theirsverse官方网站,且与区块链交互所需支付的gas费极低,误以为钓鱼站点发出的交易请求是兑换Theirsverse NFT的交易,因此点击了确认按钮。
8)受害者点击了3次交易确认按钮,将钱包中持有的WETH及gOHM代币以及某知名NFT的spend权限(至少可以转移)授予至攻击者控制的区块链合约地址,此时攻击者已具备转账其WETH、gOHM这两种ERC20代币权限。
9)仿冒站点仍然持续弹出交易确认请求,此时受害者发觉异常,开始拒绝该网站发起的任何交易请求,才没有造成更严重的损失。
10)在获得转账权限后攻击者通过运行自动化脚本立刻将用户持有的WETH、gOHM代币转移至其个人钱包地址,链上数据分析工具debank提供的受害者账户资产被盗取的历史记录如下图所示:
受害者被钓鱼后授权了攻击者地址具备spend其WETH及gOHM代币的权限
域名仿冒类攻击分析及安全建议
通过比对分析能够发现域名仿冒攻击成功实施需要满足以下要点:
受害者对站点的真实域名不够熟悉;
攻击者持有的域名与真实域名极度相似;
在仿冒域名DNS指向的服务器处部署了与真实域名相似的服务,使访问者误以为访问的是项目官方网站。
针对该攻击,主要有以下安全建议:
认准正确的域名,必要时可向其他用户进行求证;
使用linktr及link3这类域名聚合服务访问项目官方站点;
通过合约参与mint,但部分白名单项目需要提供hex proof,需要一定的前端调试基础。
安装Revoke.cash插件,能够帮助用户检测资产的授权行为并发出告警。如下图所示:
revoke.cash
存在钓鱼行为的域名,通常会向用户频繁地弹出交易请求:比如你拒绝了第一个弹出的交易请求,他马上会弹第二个,再拒绝再弹,会显得特别嘈杂,所以不放心的时候可以多拒绝几次站点发起的交易看站点行为。一个不希望盗取用户资产的页面按道理是不会频繁地给用户自动弹出交易请求的。
通过申请相近的域名,克隆目标网站的代码逻辑并修改其中与区块链交互的逻辑,使攻击者能够从钓鱼攻击中获利。
2.1.4 站点仿冒类攻击介绍
通过仿冒站点通常会发起两类钓鱼交易:
诱导用户转账特定数量ETH到攻击者账户;肉包子打狗有去无回
诱导用户授予攻击者账户使用其ERC20及ERC721等代币的spend权限等。如诱导用户调用SetApprovalForAll方法将持有的NFT授权至攻击者账户,获得授权后立刻转移资产。
下图为仿冒站点,与正版站点页面样式相差无二
仿冒站点完全复制了官方站点的界面
站点仿冒类攻击分析及防护方案
通过比对分析能够发现站点仿冒攻击成功实施需要满足以下要点:
使访问者误以为访问的是项目官方网站。
观察访问目标站点的时间,知名的项目方通常会配置负载均衡或CDN,加载速度较快;仿冒站点通常只会部署在单服务器节点,访问速度得不到保障。
针对该攻击,主要有以下安全建议:
使用linktr及link3这类域名聚合服务访问项目官方站点;
安装Revoke.cash插件,能够帮助用户检测资产的授权行为并发出告警
2.1.5 钱包仿冒类攻击介绍
区块链钱包是用户接入及区块链网络的重要方式:如果攻击者能够诱导用户下载并启用仿冒钱包,并尝试使用助记词恢复自己已有的区块链钱包,那么攻击者就有机会在用户不知情且无需发起区块链链上交易的情况下通过网络传输的方式自动窃取用户输入到仿冒钱包内的助记词或私钥,进而掌握用户的数字资产。
大部分区块链钱包都会进行代码开源以供用户审计,这也为攻击者进行应用仿冒提供了一定的基础条件。通过下载开源代码的方式可以快速地构建一套带有盗用用户助记词逻辑的仿冒钱包:在不提供完整的钱包功能的情况下仅保留助记词导入、将用户输入的助记词外发至攻击者所控制服务器的功能。仿冒钱包盗取助记词进而盗取用户数字资产攻击的特点是:在资产被盗时,用户无法准确的确定资产丢失原因。
钱包仿冒类攻击分析及防护方案
与站点仿冒攻击类似:仿冒钱包拥有正版钱包相似的界面,但存在外发助记词或私钥等恶意行为。相似的界面是钱包仿冒类攻击成功实施的重要原因。
针对该攻击,主要有以下安全建议:
从官方站点或Github官方release仓库处下载钱包;
选择知名及经过市场验证认可的钱包;
在尝试导入助记词前,多与钱包内功能进行交互。部分仿冒钱包为了省事,只会在复制UI的前提下仅编写导入助记词的逻辑及处理函数,其他的功能一律不写,假设用户点击创建钱包按钮,会提示错误或界面没有任何反应,这时就要开始有所怀疑;
每次安装一个新钱包,都生成一套新的助记词,不导入老钱包,会相对安全。
2.2 合约交互类攻击
2.2.1 合约授权类攻击介绍
在以太坊中,区块链用户可以持有符合ERC20、ERC721及ERC1155标准的代币。
上述代币既可以通过转账操作由用户主动转移至其他账户,也可以通过授权操作授予特定地址使用或转移代币的权限。相关ERC标准中引入的授权方法如下所示:
ERC20:approve方法(授权特定地址,具备使用特定数量代币权限)
ERC721:approve方法(授权特定地址,具备使用特定tokenID的代币权限,比如一个用户持有100个inkepass,希望在opensea上卖其中编号为1的inkepass,只需要调用inkepass合约的approve,将编号为1的inkepass授权opensea的seaport合约,即可允许在opensea使用其编号为1的inkepass。但是opensea现在默认要走setApprovalForAll方法,所以即使approve了特定编号的NFT也没法卖)
ERC721:setApprovalForAll方法(将当前NFT使用权授予某个地址,比如一个用户持有100个inkepass,希望在opensea上卖,只需要调用inkepass合约的setApprovalForAll,授权opensea的seaport合约,即可在opensea上挂售其所有的inkepass)
ERC1155:setApprovalForAll方法(将特定NFT使用权授予某个地址)
授权操作在ERC20,ERC721及ERC1155标准中是合法的,但是在标准设立时没有考虑权限滥用问题:若用户将其持有的代币使用权限授予黑客所控制的区块链地址,那么用户所有资产将面临被黑客滥用及盗取的风险。
合约授权类攻击分析及安全建议
下图为受害者账户授权gOHM代币给攻击者账户的交易记录:
授权操作
通过分析链上记录分析,受害者0118.eth在攻击者诱导下,调用gOHM Token智能合约中的approve方法,将gOHM代币的使用权限授予至攻击者控制的智能合约账户:0xA31573be292BD03d36DB137B6C2AB6eAA3d5e572,授权其转移的代币数量是8.8058个(精度为18位)。随后攻击者利用其控制的智能合约账户,将受害者账户中的资产全部转移至0xc1a7575开头的攻击者账户。
将受害者的gOHM代币全部转移
针对该攻击,主要有以下安全建议:
存在钓鱼行为的域名,通常会向用户频繁地弹出交易请求:比如你拒绝了第一个弹出的交易请求,他马上会弹第二个,再拒绝再弹,会显得特别嘈杂,所以不放心的时候可以多拒绝几次站点发起的交易看站点行为。一个不希望盗取用户资产的页面按道理是不会频繁地给用户自动弹出交易请求的。
使用Rabby这类带有授权检查的钱包,在进行敏感操作时会对用户进行显著的提示。
SetApprovalForAll方法的函数选择器值为0xa22cb465,在看到与交易交互数据前几位为0xa22cb465,一定要谨慎确认目标合约安全性,交易发起站点的可信度等。
安装Revoke.cash插件,能够帮助用户检测资产的授权行为并发出告警,比如下图的ERC20代币授权操作即被检查出
ERC20代币授权告警
授权NFT操作时仔细观察一下Metamask弹出的交易详情,下图给出了用户在希望卖出Boki NFT 的时候,需要授权opensea合约的操作,重点需要关注权限请求字段“http://opensea.io may access and spend this asset”,一定要确保这个https开头的站点域名用户是相信的,而如果在钓鱼站点弹出的权限请求字段会是这样“钓鱼站点域名 may access and spend this asset”,如果发现其中域名你无法相信时,一定要拒绝交易。必要时还可点击“您正在允许以下合同访问您的资金”中的合约,去区块链浏览器查询下目标地址的行为及操作,如果有恶意行为(例如频繁转移用户资产)就拒绝,如果是私人地址而不是合约地址一定要拒绝。
ERC721授权接口
授权ERC20代币时同样需要观察交易详情,下图给出了授权https://app.primex.finance使用用户持有的WETH的交易请求,一定要确保这个https开头的站点域名用户是相信的,而如果在钓鱼站点弹出的权限请求字段会是这样“钓鱼站点域名 可以访问并使用此最大数额”,如果发现其中域名你无法相信时,一定要拒绝交易。必要时还可点击“您正在允许以下合同访问您的资金”中的合约(红框圈出了),去区块链浏览器查询下目标地址的行为及操作,如果有恶意行为(例如频繁转移用户资产)就拒绝,如果是私人地址而不是合约地址一定要拒绝。
授权合约使用用户持有的ERC20代币
2.2.2 钓鱼站点发起的不安全合约签名攻击
这一节内容非常重要,攻击者瞄准的目标是用户已授权给Opensea合约Seaport的NFT,如下图所示,已完成步骤1的这类NFT:
授权
用户可以在Etherscan上查看其授权给Seaport合约的NFT,这类NFT都是攻击者希望窃取的目标:
看到了吗,就是下面这些NFT是攻击者的目标,因为这些NFT用户已经授权Opensea使用了,随时可以通过上图Confirm listing操作,只要一个签名就可以进行挂售及调低挂售金额:
已授权给OpenSea的NFT都是攻击目标
钓鱼站点发起的不安全签名攻击介绍
黑客还可以根据开源合约代码构造合法签名数据,并诱导用户进行签署,使攻击者通过签名获利,这一攻击造成的后果是严重的:攻击者能够以极低的价格购买受害者持有的NFT。这一攻击的基本实施流程如下:
有的攻击者会采用空投NFT的方式实施攻击,也有的会直接分发钓鱼站点,并在页面布置一个吸引用户点击的按钮(如mint按钮),用户点击,签名就会中招。
以下流程展示了攻击者以Opensea为目标平台,对用户进行钓鱼的方案:
攻击者向受害者地址空投小图片 NFT
攻击者对空投的 NFT 发起一个高额出价(通常高于 1 WETH)
用户选择接受攻击者的出价,然而 Opensea 上授权失败(原因是该 NFT 的合约只允许特定地址执行授权,例如 onlyOwner 修饰符)
用户前往“NFT项目官网”查询原因(此“官网”往往会在 Opensea 上该 NFT 页面上显示),“官网”首先对连接的钱包地址搜索所有用户授权允许 Opensea 使用(售卖)的 NFT
“官网”布置了各种坑,比如 Free mint 按钮,比如 Stake 按钮等等等等,都是为了引导用户签名,该签名数据是根据 Opensea 挂售 NFT 的签名逻辑(已开源)构造的(接受并验证用户签名的合约为 Opensea 官方的 SeaPort 智能合约,然而签名请求是通过钓鱼站点向用户发起的,待签名数据由攻击者构造并向用户提供)
一旦用户执行签名操作,前面搜索出来的其持有的 NFT 将以0 ETH 的价格在 Opensea 挂单售卖
攻击者布置的脚本会自动抢购用户的以极低价格挂售的 NFT;
此时用户 NFT 资产已经没了。
钓鱼站点发起的不安全签名攻击分析及安全建议
SeaPort为Opensea官方交易所使用的智能合约,但发起签名请求的narotunft.com为攻击者钓鱼站点:钓鱼站点提供的待签名数据对攻击者有益,通过将签名数据中的售卖价格设置为1(单位不是1ETH而是1ether,相当于几乎不花钱就可以买走用户挂单的NFT),诱导用户签署(签署后,对应的NFT将以低价挂售)最终获利。用户在实施签名操作时没有对待签名数据来源(钓鱼站点)及数据内容合法性进行认证是攻击成功实施的重要原因。
不安全的挂单签名
针对该攻击,主要有以下安全建议:
安装revoke.cash,在钓鱼站点发起不安全挂单请求时,会提示用户注意。可以看到由于实验账户中的boki没有授权给Opensea,所以不会出现在告警提醒中。
在站点向用户发起签名请求时,用户需要对站点和待签名数据的合法性进行认证,经确认无误后再执行签名操作,确保签名操作执行的链上行为符合用户预期。在遇到待签名消息为纯16进制不可读数据时,用户应坚持拒绝签名。
2.3 远控类攻击
2.3.1 木马程序攻击案例
通过诱导用户执行存在恶意行为的可执行程序,远程控制用户电脑,若用户电脑中存在数字资产,则直接转移是黑