区块链诈骗攻击案例分析及防御方案整理。
撰文:r0ckgh0st.eth、cybercaf.eth,Conflux ToC 成员
据安全数据显示,今年以来有记录的因诈骗和安全漏洞带来的加密领域损失已近 30 亿美元。每一个区块链行业的参与者都无异于身处「大西部」,无时不刻受到隐私、财产损失的风险。
虽然业内已经有部分对区块链诈骗、安全漏洞进行分析的工作,但大多只是针对某些案例,或者对背后机制的讨论不够深入。因此,我们很高兴为大家带来这篇由两位网络安全领域的专家所撰写的万字长文,为大家全面且深入的分析当前几乎所有安全隐患并提供应对策略。
0.前言
自网络诞生以来,攻防领域就一直是研究的热点;区块链诞生之后由于其巨大的财富效应与用户对安全的认识不足,吸引了无数的黑客挖空心思进行攻击。在近几年 Defi 与 NFT 高速发展的环境下,利用区块链网络实施的钓鱼诈骗攻击更是越来越多,各类攻击场景及攻击方法层出不穷。
本文前半部分阐述了区块链安全基础知识,重点阐述了用户在使用区块链相关应用时应重点关注的安全要素。后半部分整理常见的利用区块链欺骗用户资产的攻击案例,通过对黑客攻击手法进行分析,引出针对特定攻击手段的防护方案。
1.区块链安全基础
区块链安全基础思维导图
根据柯克霍夫原则,即使已掌握了密码系统的运作步骤,但是在密钥未被泄露的前提下,密码系统仍然是安全的。在区块链环境下,保护钱包私钥,是保护链上数字资产的重要措施和前提。
1.1 私钥及助记词安全
区块链钱包软件所管理的私钥通常是 256bit 长的随机字符串,为便于展示区块链钱包工具会将 256bit 数据转换为 32 字节长的 16 进制编码。「0x40e667191f4497cc3ab018ceb524a32c2f4875fbfb0103322767f46f5b319244」即为区块链钱包软件生成的钱包私钥。通过将私钥导入区块链钱包,用户即可掌握钱包内对应的数字资产。利用椭圆曲线密码框架,开发者可以利用私钥数据便捷的计算出与之对应的公钥信息,通过对公钥进行 keccak256 运算[7]并取运算结果的最后 20 字节,即获得区块链钱包地址。使用以太坊 ethers 工具库生成公私钥,并根据公钥信息计算钱包地址的代码运行结果如下图所示:
公私钥生成钱包地址方法
考虑到哈希运算具有抗强碰撞和弱碰撞特性,因此在不掌握钱包私钥的前提下攻击者难以通过随机碰撞的方式构造出两个完全一致的区块链钱包地址。为便于用户记忆及保存,在 BIP39 提升改进计划中引入了使用助记词表示区块链钱包私钥的方法。为便于理解,读者可以认为一组由 12、15、18、21 或 24 个单词组成的助记词列表即对应一组区块链钱包私钥。在助记词处于保密状态时,用户的钱包私钥及数字资产是安全的。
在创建区块链钱包时,助记词及私钥数据是异常敏感的,在进行敏感操作前用户检查周边环境是否有可疑人物、高清摄像头等可能产生窥屏事件的不安全因素。用户通常需要使用纸笔或助记词钢板记录钱包助记词并妥善保存(如锁入保险箱)。在使用区块链网络时,用户应当做到不向任何人透露与助记词及私钥相关的任何信息,切实保障用户数字资产的安全性。
1.2 智能合约安全
智能合约的出现使以太坊网络相较比特币网络具备了更好的延展性,开发者可通过以太坊提供的 SDK 开发工具编写智能合约代码便捷的开发 DAPP。在以太坊中,智能合约是一种部署后则代码逻辑无法被篡改的计算机程序。待智能合约部署后,区块链用户即可以按照智能合约对应的代码逻辑与合约进行交互。
用户在与智能合约交互前,应检查:1)智能合约代码是否已通过区块链浏览器完成了开源操作;2)对智能合约代码关键逻辑(例如要调用的智能合约方法)进行审计,待确保代码不存在恶意使用或转移用户数字资产的敏感行为后,再调用智能合约方法。
调用经过合约开源认证或已通过知名智能合约审计公司安全性审计的智能合约方法,能够在一定程度上保障用户持有数字资产的安全性。
1.3 区块链钱包安全
区块链钱包软件为其用户提供了私钥管理,钱包账户管理,远程过程调用(RPC)节点管理、交易签名、交易管理、与智能合约交互及硬件钱包连接等功能。区块链钱包软件存在的重要作用就是为用户提供了一个界面友好的私钥容器、密钥管理系统及交易签名代理工具,确保用户能够在不具备管理私钥及区块链交易广播工具能力的基础上,能够便捷的与区块链网络进行交互。
从钱包是否与互联网存在直接连接进行分类,区块链钱包划分为 1)冷钱包;2)热钱包。
从钱包运行平台进行分类,钱包可以划分为 1)PC 主机钱包;2)浏览器插件钱包;3)移动手机端钱包;4)硬件钱包;5)网页钱包等。
优先选择从官方渠道分发的区块链钱包软件。以浏览器插件钱包为例,用户可以从官方网站,浏览器应用商店,插件钱包官方 Github 仓库等渠道下载并安装浏览器插件钱包。在日常使用过程中,需要定期更新区块链钱包、底层操作系统、浏览器并保持其版本总是处于最新状态,以此来保护用户持有的数字资产安全。
在使用区块链钱包软件时,用户应设置强解锁口令以避免遭受口令爆破攻击。在离开电脑前,应主动锁定屏幕和钱包,以避免遭遇因电脑钱包处于未锁定状态导致数字资产被滥用。Metamask 钱包提供的自动锁定定时功能如下所示。
5 分钟后钱包自动锁定
用户应当优先选择官方渠道购买的硬件钱包。待收到钱包后,需要访问硬件钱包官方网站对钱包完整性及固件版本进行验证,以避免遭受供应链攻击。针对硬件钱包实施的攻击层出不穷:在使用硬件钱包签名交易时,用户需查看待签名交易的完整内容,并对交易合法性进行认证,避免进行盲签名,以避免遭受非法交易签名攻击进而丢失数字资产。
用户在收到硬件钱包并创建区块链账户时,应当多次执行创建钱包生成助记词功能。通过记录硬件钱包生成的助记词与之及对应取得区块链钱包地址,比对不同创建钱包操作所生成的助记词差异,确保硬件钱包生成私钥所使用的随机数种子足够安全,创建钱包操作所生成的私钥足够随机。
盲签名 又名 Blind Signing 起源于一个问题:如果给我们提供了一份内容完全密封的合同,只留下签名页可见,你会愿意签署这份合同吗?我的答案是否认的:不会签署这份合同,避免签署对自己不利的合同内容。
在区块链环境中,应用硬件钱包与智能合约进行交互与 Blind Signing 很像,因为签署智能合约交互交易时,用户无法通过硬件钱包获取智能合约的底层行为逻辑。Ledger 的屏幕是非常小的,无法向用户与智能合约交互交易的全貌。用户若 enable Blind Signing 时,就代表其已经接受尽管 Ledger 无法向用户展示智能合约全貌的前提下,任然利用 Ledger 批准与智能合约进行交互的交易:此时,用户已经同意信任其发送的交易,而不是选择对交易合法性及行为进行校验。
更多关于 Blind Signing 的资料可参考如下链接:
1.4 可信 RPC 节点
以太坊中知名的 RPC 节点服务主要包括 Infura、Alchemy、Moralis 等,BSC 链的 RPC 节点服务商主要由 BSC 链官方提供。
近年来受到关注的新公链解决方案如 Polygon、Optimism、Avalanche 及 Fantom 的 RPC 节点服务主要由 Ankr 提供,区块链用户在使用特定公链时,需要通过在钱包内添加 RPC 节点地址链接的方式与对应的区块链 RPC 节点建立连接,以便通过 RPC 远程调用的方式实现与区块链的通信及交互。RPC 节点的作用是重要的,如果没有 RPC 节点,用户个人将难以接入区块链网络。
下图给出了 Conflux eSpace 区块链网络对外公开的 RPC 节点信息,通过钱包连接 RPC 节点,在用户发起转账和智能合约交互时,由 RPC 代理将交易打包发送至区块链网络,最终使交易以区块形式进上链。
用户应当选择安全性经过验证的 RPC 节点服务商,以保障其钱包数据来源的可靠性及与区块链网络交互的稳定性。恶意的 RPC 节点提供商可能会恶意显示不正确的区块链状态并记录用户的链上活动数据,严重危害用户数据安全。
1.5 DM 及邮件安全
部分攻击者会通过使用社交网络私信或发送电子邮件等方式向目标用户发起攻击,通过精心设计钓鱼场景的方式使受害者确信:只要按照攻击者指示进行操作(访问特定站点、与特定智能合约进行交互或将助记词导入至区块链钱包),即可获得奖励:当受害者选择相信攻击者时,其已进入了由攻击者精心构造的钓鱼诈骗陷阱。由于区块链交易具有不可篡改和不可逆的特性:大量区块链钓鱼攻击受害者在发现资产因为自身疏忽而被转移至攻击者持有的区块链账户后,丢失的资产早已无法挽回。
下图给出了一封以盗取区块链数字资产为目标的钓鱼邮件:用户需要在特定截止日期(DDL)前在平台处登记区块链钱包,不然就冻结(威胁)账户。在收到这类电子邮件时,不点击邮件或私信中包含的任何超链接信息或按钮,待与官方核实确认邮件内容合法性后,再对邮件进行处理。
钓鱼邮件
设置防钓鱼码能够在一定程度解决钓鱼邮件的问题,下图给出了 premint 平台提供的防钓鱼码功能:
1.6 开发环境安全
开发者在开发 DAPP 应用时所使用的环境即为开发环境,保护开发环境安全,是保护应用开发者及 DAPP 应用使用者资产安全的重要前提。DAPP 应用是基于区块链网络交互框架开发的(如 ethers,web3.js 等),为了方便用户使用 DAPP,开发者通常需使用基于 JavaScript 脚本开发的前端框架 react 或 vue 构建 DAPP 应用前端,便于用户直接利用前端 UI 直接与智能合约进行交互。前端开发框架有助于 DAPP 开发团队便捷的开发支撑 DAPP 应用运行和使用的前端系统。
选取经过市场验证的 SDK 能够在一定程度上确保资产安全。
1.7 搜索引擎安全
完全相信搜索引擎结果,是钓鱼攻击成功实施的原因之一
搜索引擎,是一种按照特定策略、运用特定计算机程序从互联网上采集信息,在对信息进行整理和归纳后,对外向用户所提供的一种检索及结果展示系统,是帮助用户查找特定资料及信息的有力支撑工具。
在区块链环境中,用户需访问 DAPP 官方网站时,通常也会将搜索引擎的检索结果作为参考之一,这给了攻击者可乘之机。攻击者可以通过仿冒知名的 DAPP 平台界面 UI,并对仿冒站点进行 SEO 优化,使仿冒站点出现在搜索引擎结果的第一位或靠前位置。出于对搜索引擎结果的信任,最终导致用户持有的数字资产丢失。仿冒 DAPP 通过 SOE 优化进入搜索引擎结果靠前位置的案例。尽管 Google 已将其标记为 Ad,但由于其结果出现在搜索结果第一位,仍然有部分用户中招。
SOE 优化使钓鱼站点出现在搜索结果
被仿冒的 DAPP 应用为 x2y2 这一 NFT 交易平台,其官方链接为 x2y2.io,而仿冒站点链接为 x2y2market.com。黑客通常会选取与被仿冒 DAPP 相近或相关的域名以达到欺骗并盗取用户数字资产的目的。
1.8 交易签名安全
在开始这一内容前,我们需要明确一个概念,什么是交易?什么是签名?什么时候会签名,在区块链中的交易有以下几类。
- 转账交易:如将 1ETH 转账至另一个钱包地址
- 与智能合约交互的交易:如调用智能合约的 SafeTransferFrom 方法,将 NFT 转移至另一个钱包地址,这相当于发起一笔写智能合约的交易
所有交易在上链之前,都需要使用交易发起人对交易 Hash 进行签名,在交易上链的过程中,通过对签名结果认证的方式验证交易合法性,合法的交易打包上链的这一刻交易行为将生效:不管是转账的 ETH 还是转移的 NFT 都会进入目标地址中。
此外,还有另外一种签名,比如登录 mirror 时需要签名来验证用户掌握连接 mirror 的区块链账户。
确保交易签名安全的重点是:1)确保用户在确认交易时所看到的待签名内容是符合用户预期的;2)确保用户签名的交易发送后,区块链能够按照用户对交易的预期执行。用户所见即所签,所签即所行。确保经用户签名的交易被发送后,执行结果是符合用户预期的是保障签名安全的重要指导方针。
在窃取用户私钥无果的前提下:部分黑客打起了盗用签名数据的歪心思:通过诱导用户对不安全的交易数据进行签名:诱导用户访问钓鱼页面并在钓鱼页面中将存在盗取资产操作的交易利用 keccak256 生成待签名数据推送至用户,若用户因疏忽进行了签名操作,则黑客即获取到能够向区块链节点证明交易合法性的签名数据。此时,黑客只需要将签名数据和构造的交易广播至区块链网络,即可实现滥用受害者账户数字资产的目的(通常为盗取 NFT)。
下图给出了一个不安全的待签名请求,发起该请求的站点为钓鱼站点 https://thejewsnfts.xyz,在后文我们还将对其通过仿冒推特账户实施攻击的方法进行阐述。
不安全的待签名数据
在站点向用户发起签名请求时,用户需要对站点和待签名数据的合法性进行认证,经确认无误后再执行签名操作,确保签名操作执行的链上行为符合用户预期。在遇到待签名消息为纯 16 进制不可读数据时,用户应坚持拒绝签名。
下图给出了一个相对安全的待签名消息,用户通过签名该消息实现使用区块链钱包账户登录进入 Web3 系统的目的:
登录 cryptonatty 系统所使用的签名数据
1.9 区块链浏览器
区块链浏览器为用户提供一个界面友好的查询区块链链上数据的接口。以太坊区块链浏览器 Etherscan 为用户提供了链上交易数据查询,资产转移信息查询,智能合约代码查询,智能合约交互,区块数据查询,地址资产分析、运算服务费用估算、区块链域名解析等功能,利用这些功能,
用户可以快速的获取账户的余额信息;对智能合约代码进行安全审计,实时查询链上交易费用等。一笔以太坊交易主要包含以下信息:交易 hash,交易状态,交易区块号,交易时间戳,交易提交账户,交易接收账户,交易发送金额(案例中为 0.1Eth),为完成交易所支付的交易费用及交易的单位燃料费用成本等。在使用区块链浏览器查询交易数据及交易详情时,应优先选择由区块链官方开发或推荐的区块链浏览器,通过检查目标合约的交易安全与否规避潜在的钓鱼或基于合约的授权攻击。
以太坊交易样例
区块链浏览器是帮助区块链使用者验证交易是否成功的一项重要工具:用户 A 声称其通过区块链网络向用户 B 转账了 1ETH,交易验证者可要求用户 A 分享交易 Hash 并使用区块链浏览器搜索检查交易信息中的交易接收账户是否为 B,同时检查交易发送金额字段是否为 1ETH 来验证交易执行情况。此外,交易验证者还可以通过区块链浏览器直接检查用户 B 钱包地址余额变动情况,以验证 B 地址余额是否已增加 1ETH。
区块链浏览器还提供了智能合约开源展示的功能,便于用户在与智能合约交互前对代码安全性进行审查。用户应当掌握检查智能合约是否已处于开源验证状态的方法。用户应当优先选择与已完成智能合约代码开源验证的处理的智能合约进行交互。用户应通过区块链浏览器,对智能合约代码安全性进行审计,在确保代码不存在权限滥用或恶意使用用户数字资产的行为后,再与合约进行交互。已完成智能合约代码开源验证处理的智能合约在区块链浏览器中的展示信息如下所示:
完成合约认证的智能合约代码
2.区块链诈骗攻击案例总结
在这一章节,我们将重点介绍黑客以盗取区块链数字资产为目标,通过构造钓鱼场景的方式在不需要掌握用户私钥的前提下盗取数字资产,通过分析这类攻击的特性,按照 1-1 对应的方式,给出防护方案。例如 2.1.1 中给出了 DM 类仿冒攻击后马上即介绍针对 DM 类钓鱼攻击的安全建议及防护方案。诈骗攻击的产生原因也就呼之欲出:既然用户在努力保护自己的私钥,也知道私钥很重要,那我就用一个更合理的办法让用户亲自把数字资产送给我。
区块链诈骗攻击思维导图
2.1 仿冒类攻击
2.1.1 DM 类钓鱼攻击介绍
利用社交平台向用户发起私聊实施钓鱼攻击,是一种相对简单且易于实施的攻击:通过精心构造的诈骗场景诱导用户向特定区块链地址转账或访问钓鱼页面。
用户参与某抽奖活动并中奖,奖品是免费向用户赠送的,但用户需要向特定钱包转账 0.02ETH 作为 gas 费,对方再将中奖奖品转发给中奖用户。
下图给出了攻击者利用社交平台向用户发起私聊并实施钓鱼攻击的案例截图。
钓鱼场景搭建:中奖
DM 类钓鱼攻击分析及安全建议
黑客希望通过利益冲昏被钓鱼者的头脑,在使用区块链时,应当坚信没有免费的午餐。
Ledger 硬件钱包在其安全使用建议中专门指出:不要与在 Discord、Twitter 或任何其他社交平台上给你发送私人信息的人进行互动及交互,在 Web3 环境中,任何人都没有理由直接通过社交联系用户,并向其发送信息。
在使用 Discord 及 Twitter 时,可以选择关闭 DM 选项或不查看推特的私信请求,眼不见为净。
2.1.2 账号仿冒类攻击介绍
通过仿冒社交账号的方式实施钓鱼攻击:将社交账号名称,头像,介绍等信息设置为与被仿冒社交账号相近的内容,并通过社交网络释放钓鱼链接的方式实施钓鱼攻击。在区块链环境中,知名的 DAPP 项目方通常会遭受社交账号仿冒类攻击,严重威胁到用户持有的数字资产安全。
下图给出了一个正版社交账号:
正版账号
下图给出了仿冒账号通过社交网络释放的钓鱼站点链接:
仿冒账号
账号仿冒类攻击分析安全建议
通过比对分析能够发现仿冒攻击成功实施需要满足以下要点:
- 相似的域名:专门注册「thejewsnfts.xyz」这一域名以便以假乱真,而正版域名为「thejewsnft.com」,xyz 后缀的域名在 DAPP 中较为常见,以假乱真;
- 相似的推特用户名:为了以假乱真,攻击者还专门按照正版账户的推特用户名设置规则进行了仿冒,仿冒账户为@TheJewsETH,正版账户为@TheJewsNFT;
- 相似的推特昵称:仿冒账户的昵称与正版昵称相比仅多了「FREE MINT ALIVE」,暗示用户 NFT 铸造活动正在进行中,利用用户急切参与活动的心理诱导其访问仿冒账户通过社交网络分发钓鱼站点执行铸造 NFT 操作;
- 足够逼真的钓鱼站点:钓鱼站点实际并没有提供铸造 NFT 的功能,而是通过钓鱼诱导用户将其账户持有的高价值 NFT 使用权授权给攻击者持有的区块链钱包账户。若用户访问钓鱼站点并授权交易,则其授权资产将被攻击者掌握;
- 获得授权后,攻击者可直接调用 NFT 对应合约中的 SafeTransferFrom 方法,将资产转移。
针对该攻击,主要有以下安全建议:
- 认准正确的社交账号,必要时通过社交平台搜索进行对比;
- 通过可信的站点关注 DAPP 应用社交账号,例如通过 premint 活动关注的 NFT 项目方账号是相对安全的;
- 访问钓鱼站点并不可怕,可怕的是随意确认钓鱼站点处发起的区块链交易;
- 记住正版推特账号的注册时间等不易被仿冒的信息。
- 查看账户下的回复数及回复信息质量,部分仿冒账号为了避免用户在其下骂街会直接关闭回复功能,或设置只允许特定用户回复。
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。
受害过程如下:
- 受害者为了及时参与到抢购活动,在开车时尝试使用手机钱包访问项目官方网站;
- 由于受害者没有记住项目方提供的官方网站域名,在输入域名时错将正版域名输入为仿冒域名,由于此时受害人正在开车,并没有注意到域名的差异;
- 攻击者专门在仿冒域名处部署一套完全克隆了官方网站的代码,使受害人确信其访问的站点为项目官方站点;
- 仿冒网站与官方网站相差无异,此时受害者已进入攻击者所布置的钓鱼陷阱,在没有连接区块链钱包并进行交易授权时,此时其数字资产仍然是安全的;
- 受害者使用区块链钱包连接仿冒网站,仿冒站点已具备查看受害者钱包地址信息的权限,用户持有的数字资产及价值已被攻击者获取;
- 此时仿冒站点开始频繁向用户发起授权请求;
- 受害者误以为自己正在访问 Theirsverse 官方网站,且与区块链交互所需支付的 gas 费极低,误以为钓鱼站点发出的交易请求是兑换 Theirsverse NFT 的交易,因此点击了确认按钮。
- 受害者点击了 3 次交易确认按钮,将钱包中持有的 WETH 及 gOHM 代币以及某知名 NFT 的 spend 权限(至少可以转移)授予至攻击者控制的区块链合约地址,此时攻击者已具备转账其 WETH、gOHM 这两种 ERC20 代币权限。
- 仿冒站点仍然持续弹出交易确认请求,此时受害者发觉异常,开始拒绝该网站发起的任何交易请求,才没有造成更严重的损失。在获得转账权限后攻击者通过运行自动化脚本立刻将用户持有的 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 钓鱼攻击案例分析
这应该是本文的最后一个案例,是日常遇到的一个很有意思的钓鱼,攻击者先通过推特分发了一个钓鱼链接,进去之后就会弹窗要连钱包,随后请求授权,简单看了一下站点的源代码。
钓鱼站点后台配置逻辑
const address = “0x6261B75c1087198BE93F83D09DF404d8709843Db”; // Your wallet that you have to receive NFTs
const infuraId = “8c15147b9b1c4498b7b7a260e437058a” // Infuria ID | https://infura.io/ | For Wallet Connect
const moralisApi = “xiJfIKNXA5OQAXBle0xgdc5OXnYvWUZBRly8lDMV0UzlSVDhQaKfnodZkRyOssqH” // x-api-key | https://moralis.io/ | For NFTs
const collectionInfo = {
name: “NFTs GIVEAWAY”,
title: “THE STICKMAN TOY”, // Title prefix (ex “Buy your {name}”) – You can use {name} to insert the collection name
date: “30.07.2022”,
socialMedia: {
discord: “https://discord.gg/example”,
twitter: “https://twitter.com/example”,
},
medias: {
preview: “preview.gif”,
favicon: “logo.png”,
},
background: {
type: “image”, // Supported types: image, video, color
image: “background.jpg”, // Image for image type, video preview for video type
video: “background.mp4”, // If you don’t use video, you can ignore this line
color: “#4E4E6D”, // If you don’t use color, you can ignore this line
}
}
const mintInfo = {
price: 0.02, // Price per NFT.
totalSupply: 999, // Total supply of NFTs.
minUnits: 1, // Min units to buy.
maxUnits: 10, // Max units to buy.
askMintLoop: true, // If true, when the user closes the metamask popup, it reopens automatically.
}
const nftsInfo = {
active: true, // Active (true) or not (false) NFTs stealer.
minValue: 0.1, // Minimum value of the last transactions (in the last ‘checkMaxDay’ days) of the collection.
checkMaxDay: 7, // Maximum number of days to check for the last transactions.
receiveAddress: “” // leave empty if you want to use the same address
}
/*
= = = = = END OF SETTINGS = = = = =
*/
//#region Check Configuration
if (mintInfo.minUnits > mintInfo.maxUnits) console.error(`Error: minUnits (${mintInfo.minUnits}) is greater than maxUnits (${maxUnits})`);
if (mintInfo.minUnits <= 0) console.error(`Error: minUnits (${mintInfo.minUnits}) is less than or equal to 0`);
if (!address.startsWith(“0x”) ||
(
address.length >= 64 ||
address.length <= 40
)
) console.error(`Error: ${address} is not a valid Ethereum address.`);
//#endregion
该站点有两种盗取用户数字资产的业务逻辑:
- 以 0.02ETH 的价格销售 NFT,但支付的 0.02ETH 会直接通过转账打入黑客账户;
- 检测已连接钱包内持有的 NFT 资产,一旦该 NFT 在最近 7 天内的最低交易价格大于 0.1ETH,即诱导用户授权攻击者账户具备转账对应 NFT 的权限,在授权后将 NFT 转移至攻击者账户并变现。
3.结语
编写本文的缘由来自 SeeDao 投研工会的一次讨论,舟舟当时提出了一个在 2.2.2 中介绍的钓鱼攻击怎么实施的问题及为何会成功的原因:正巧我最近在总结整理相关的案例,在日常使用中也遇到了一些通过这类方式实施的钓鱼攻击,就结合自己的理解做了解答。大家后续讨论了下,认为很有必要整理一篇相关的攻击手段及安全建议,供大家进行参考,这便是此篇文章产生的原因。在这里也要特别感谢 SeeDao 及舟舟的提议。
利用区块链网络实施钓鱼欺骗及诈骗类的攻击越来越多,各类攻击手段层出不穷。追本溯源,很多钓鱼攻击其实是通过简单的攻击进行组合后实施的,通过利用用户着急参与活动、希望通过 Web3 赚取更多利润等心理向用户实施攻击。
在这篇文章中所阐述的攻击案例,基本上都是我及一些 Web3 的深度参与用户日常遇到的,素材全部是自己截图及使用的,希望大家能够尊重原创。为了这篇文章的出炉,我写了两天时间,但素材的积累和整理花费了超过 2 个月的时间,本来希望以另一种形式与大家见面(可能是论文),但是发现该类文章的实践性偏强,时效性不适合在论文中发表。但未来我也会仍然持续的探索,用更加通用的方式发表相关的内容。此文中参考他人的内容,基本都已通过外链的方式放入,也特别感谢相关作者在构建更加安全的 Web3 使用环境所做出的努力。
作为一名网络安全专业的学生,我也深感荣幸和责任,掌握屠龙刀法应该让我们更好的惩恶扬善,即使没有惩恶的能力(至少我这菜鸡没有),但把已有的攻击案例总结归纳,让大家有一颗防范之心,应该能在一定程度上减少受害者的损失及受害几率。就像 Nice discord 钓鱼的那次,我也在群里拦住了很多访问目标站点的网友,我想一定程度上减少了他们的损失,这样大家都很开心。安全的研究和防护往往需要从一件小事做起,才能支撑已经发展了多年还在持续发展的链上系统。
编写这篇文章离不开身边朋友的支持,谢谢豆子,w33d,yzbban,Heisenberg,SeeDao 安全学习小组的群友们,Inkepass 群友们,LookmeDao 的群友们以及老白链游群的群友们。
由于时间匆忙,加上自己研究还不够透彻,有些内容并没有完全展开或存在纰漏,还请各位批评指正。大家随时可以在 SeeDao 投研工会联系我,期待大家的意见和建议。