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 木马程序攻击案例
通过诱导用户执行存在恶意行为的可执行程序,远程控制用户电脑,若用户电脑中存在数字资产,则直接转移是黑客通过钓鱼远控实施攻击的特点。
远控类攻击主要分为两种类型:1)恶意程序攻击;2)远控软件口令破解类攻击。
在第一类攻击中,攻击者主要通过社交网络分发恶意代码并诱导用户点击达到控制用户主机的目的。如果用户电脑中有Metamask且未锁定时,直接转走资产;如果锁定,可以通过键盘钩子窃取用户键入的解锁口令,利用该口令破解私钥。
第二类攻击主要利用了部分远控软件在引入安全特性时引入的脆弱点:破解会话口令即可控制受控主机。在区块链场景下,部分用户为使用区块链需要自行运行RPC节点,为方便随时掌握节点运行情况需要配置远控工具以便实时查看受控主机状态,更新配置文件。大部分用户所设置的会话控制口令为弱口令,远控工具默认提供的会话口令也易于被攻击者破解。当会话口令被破解,攻击者将直接接管受控主机的控制权限,盗取区块链数字资产。
前段时间BoxMrChen就遭遇了这类攻击
钓鱼可执行程序类攻击分析及安全建议
运行不安全的exe程序,脚本,设置较弱的解锁口令是上述攻击实施的主要原因。
针对上述攻击提供的安全建议如下
善用沙箱及虚拟机,从任意用户处接受的文件,不要直接打开,用沙箱观察一下有没有发起远程连接(IP连接,如下图):
远控工具存在连接远程主机185.106.92.91的行为
metamask设置强解锁口令,这个口令是参与加密钱包私钥的,如果太弱的口令被黑客推测并破解后,用户的私钥也是不安全的。
不要随便拿Windows电脑运行exe文件,或解压缩zip文件并立刻运行其中的可执行程序。
重要资产存在硬件钱包内。
优先使用Mac作为主机。
安装杀软及防火墙
2.3.2 0day攻击
通常是尚未披露的应用类漏洞,攻击者利用这类漏洞通常能够实现远程溢出,并执行任意命令实现控制用户电脑。在控制用户电脑后查询本地安装钱包的信息,并尝试进行资产转移。
0day攻击分析及安全建议
及时更新系统版本
及时更新浏览器插件版本
钱包设置强解锁口令
2.4 私钥扫描攻击
部分开发者在开发代码时,由于缺乏安全意识,直接将其持有的钱包私钥以明文形式存储至所开发的应用代码中,攻击者可直接利用Github等开源平台的API编写自动扫描脚本,在匹配并获取私钥后快速检测目标账户中持有的数字资产并转移。
针对该攻击,主要有以下安全建议:
善用.gitignore文件,并将私钥配置信息放入.env文件内,避免被推送至Github,下图给出了使用hardhat生成DAPP项目时默认的。gitignore文件
为项目开发专门注册一个新钱包,比如我可以使用Metamask进行链上交互,开发钱包可以使用Rabby Wallet,使开发账户与日常使用区块链的账户进行助记词级别的隔离。把rabby Wallet内的钱包私钥导入到Metamask也能很方便的进行开发,即使私钥丢失,丢失的也是开发账户的资产。
不往开发账户内充值任何主网资产,只存测试网资产。
2.5 供应链攻击
区块链中的供应链攻击主要包括以下几类:
开发环境供应链攻击,代码投毒
硬件钱包供应链攻击:快递替换,固件篡改
软件钱包供应链攻击:加入恶意代码窃取用户助记词,直接加后门等
2.5.1 开发环境供应链攻击
随着前端开发框架应用场景逐步扩张,越来越多的前端框架安全漏洞被披露,在2022年7月份,知名的NFT白名单领取平台premint就遭遇了黑客攻击,黑客在premint平台的前端代码中注入恶意JS脚本以实施钓鱼攻击:通过欺骗用户签署将NFT使用权授予攻击者钱包地址的交易而实施。这一攻击所造成的后果是严重的,为补偿用户损失,premint共向受害者赔付了超过340ETH。
部分灰色产业利用开源代码配合供应链的攻击方法,利用包管理分发存在恶意行为的区块链开发框架,利用恶意框架黑客可直接盗取DAPP开发者的账户私钥,严重影响用户和开发者的数字资产安全。下图给出了被供应链共计污染的区块链开发框架,黑客可直接提取开发者所使用的钱包助记词并发送至黑客控制的亚马逊云服务器,对DAPP程序开发者和用户持有的数字资产安全带来严重的威胁。
窃取助记词
开发环境供应链攻击分析及安全建议
开发者在选用区块链SDK开发套件时,需要对开发框架的合规性及安全性进行分析,避免使用被供应链攻击污染的SDK开发套件。通过对开发框架所包含组件的数据完整性,软件包内容分发网络安全性进行查验,能够避免因供应链攻击或前端框架漏洞导致存在恶意行为的JS脚本注入到DAPP运行网站的实际业务逻辑中所引发代码污染风险,切实有效的保障DAPP用户持有的数字资产安全。
2.5.2 软硬件钱包供应链攻击
2022年8月4日,知名公链Solana发生大规模用户丢币事件,大量用户声称其持有的SOL及SPL标准代币被转移至特定的四个Solana钱包,随后Solana官方安全研究人员发现,盗币事件与支持Solana的区块链钱包Slope相关:Slope钱包违规使用了sentry监控服务,将用户的任何行为及操作数据都会被上传至Slope官方的服务器并被记录:在用户创建Solana钱包时,钱包对应的助记词及私钥都以明文形式上传至服务器。安全研究人员通过抓包检测到Slope钱包存在明文传输用户隐私信息行为如下:
不管该钱包是新创建的,还是用户导入的,其私钥都会被发送至Slope钱包服务器处保存
软硬件钱包供应链攻击分析及安全建议
私钥丢失了,资产就不受用户控制了,只是缺少一个触发的盗窃动作的时间点。在Slope钱包攻击案例中:不管该钱包是新创建的,还是用户导入的,其私钥都会被发送至Slope钱包服务器处保存。
硬件钱包的供应链攻击也是一样的,半路被人调换一个一模一样的钱包,但固件已被人篡改的可能性同样存在。
针对上述安全攻击给出的安全建议如下:
选择知名及经过市场验证的钱包
从官方渠道购买硬件钱包,避免李鬼李逵
在使用硬件钱包创建地址时,多生成几次助记词,看看助记词随机性怎么样,有一些攻击就是通过扰乱硬件钱包的随机数种子,使攻击者易于生成一样的私钥并盗取用户资产。
选购带有抗供应链攻击的硬件钱包,如ledger和keystone
Ledger Live会对硬件钱包进行检测
2.6 NFT钓鱼攻击案例分析
这应该是本文的最后一个案例,是日常遇到的一个很有意思的钓鱼,攻击者先通过推特分发了一个钓鱼链接,进去之后就会弹窗要连钱包,随后请求授权,简单看了一下站点的源代码。
钓鱼站点后台配置逻辑
该站点有两种盗取用户数字资产的业务逻辑:
1)以0.02ETH的价格销售NFT,但支付的0.02ETH会直接通过转账打入黑客账户;
2)检测已连接钱包内持有的NFT资产,一旦该NFT在最近7天内的最低交易价格大于0.1ETH,即诱导用户授权攻击者账户具备转账对应NFT的权限,在授权后将NFT转移至攻击者账户并变现。
3.结语
编写本文的缘由来自SeeDao投研工会的一次讨论,舟舟当时提出了一个在2.2.2中介绍的钓鱼攻击怎么实施的问题及为何会成功的原因:正巧我最近在总结整理相关的案例,在日常使用中也遇到了一些通过这类方式实施的钓鱼攻击,就结合自己的理解做了解答。大家后续讨论了下,认为很有必要整理一篇相关的攻击手段及安全建议,供大家进行参考,这便是此篇文章产生的原因。在这里也要特别感谢SeeDao及舟舟的提议。
利用区块链网络实施钓鱼欺骗及诈骗类的攻击越来越多,各类攻击手段层出不穷。追本溯源,很多钓鱼攻击其实是通过简单的攻击进行组合后实施的,通过利用用户着急参与活动、希望通过Web3赚取更多利润等心理向用户实施攻击。
在这篇文章中所阐述的攻击案例,基本上都是我及一些Web3的深度参与用户日常遇到的,素材全部是自己截图及使用的,希望大家能够尊重原创。为了这篇文章的出炉,我写了两天时间,但素材的积累和整理花费了超过2个月的时间,本来希望以另一种形式与大家见面(可能是论文),但是发现该类文章的实践性偏强,时效性不适合在论文中发表。但未来我也会仍然持续的探索,用更加通用的方式发表相关的内容。此文中参考他人的内容,基本都已通过外链的方式放入,也特别感谢相关作者在构建更加安全的Web3使用环境所做出的努力。
作为一名网络安全专业的学生,我也深感荣幸和责任,掌握屠龙刀法应该让我们更好的惩恶扬善,即使没有惩恶的能力(至少我这菜鸡没有),但把已有的攻击案例总结归纳,让大家有一颗防范之心,应该能在一定程度上减少受害者的损失及受害几率。就像Nice discord钓鱼的那次,我也在群里拦住了很多访问目标站点的网友,我想一定程度上减少了他们的损失,这样大家都很开心。安全的研究和防护往往需要从一件小事做起,才能支撑已经发展了多年还在持续发展的链上系统。