区块链网QKLW.COM记者报道:SeeDAO IR导言:据安全数据显示,今年以来有记录的因诈骗和安全漏洞带来的加密领域损失已近30亿美元。每一个区块链行业的参与者都无异于身处“大西部”,无时不刻受到隐私、财产损失的风险。
虽然业内已经有部分对区块链诈骗、安全漏洞进行分析的工作,但大多只是针对某些案例,或者对背后机制的讨论不够深入。因此,我们很高兴为大家带来这篇由两位网络安全领域的专家所撰写的万字长文,为大家全面且深入的分析当前几乎所有安全隐患并提供应对策略。
本文作者:
r0ckgh0st.eth:Yumingze,网络安全研究生在读,Conflux ToC 成员,对接并协助孵化Web3应用,在Lecture Notes in Computer Science ,IEEE,信息网络安全等刊物发表论文多篇,Seedao Web3安全课程讲师。在Web3方面的研究兴趣涉及区块链钓鱼分析及防范、区块链供应链攻击机制及抑制,相对擅长代码审计。目前正深度参与DID框架开发及整合。
cybercaf.eth:数字游民,Conflux ToC成员,SeeDAO核心贡献者,SeeDAO投研公会成员,Web3大学核心贡献者,元宇宙与网络安全领域研究者。
前言
自网络诞生以来,攻防领域就一直是研究的热点;区块链诞生之后由于其巨大的财富效应与用户对安全的认识不足,吸引了无数的黑客挖空心思进行攻击。在近几年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项目方账号是相对安全的;
访问钓鱼站点并不可怕,可怕的是随意确认钓鱼站点处发起的区块链交易;
记住正版推特账号的注册时间等不易被仿冒的信息。
查看账户下的回复数及回复信息质量,部分仿冒账号为了避免用户在其下骂街会直接关闭回复功能,或设置只允许特定用户回复。