Web3.0是一个创新机遇与安全挑战并存的新时代。它带来了区块链技术、智能合约、DeFi、DePIN等全新概念,却也浮现出多种多样的恶意攻击、漏洞与诈骗等安全问题。另一方面,由于当前Web3.0产品往往融入许多Web2.0元素,这使得传统的Web2.0的安全风险也成为威胁Web3.0世界的重要因素。
作为全球领先的Web3.0安全机构,CertiK团队一直以来都在主动关注各种原生和衍生的潜在风险,保护成千上万的客户免受损失。
本篇文章中,我们将带大家了解CertiK团队如何发现与解决Web3.0常用协议–WalletConnect中存在的Web2.0漏洞。
WalletConnect是Web3.0最受欢迎的开源协议之一,用于将各种dApp与去中心化钱包连接起来。用户可以通过扫描dApp提供的二维码来建立新的连接。虽然二维码上会显示dApp的名称、图标和来源等详细信息,但是这些信息均由dApp单方面提供,无需经过钱包验证,因此存在网络钓鱼攻击的风险,这也是包括CertiK在内的众多安全团队所重点关注的问题。
为此,WalletConnect推出了“VerifyAPI”。
“VerifyAPI”是WalletConnect针对与其集成钱包推出的主动安全增强措施,会对用户尝试连接的可疑或恶意域名发出警报,从而防止网络钓鱼攻击。该API利用WalletConnect的域名注册表和Blowfish的域名扫描仪来审查连接请求。当用户尝试与dApp连接时,VerifyAPI可使钱包呈现四种状态,来帮助用户评估该域名的安全性并识别潜在风险。
WalletConnect协议中的漏洞是团队在为客户产品进行例行渗透测试时无意发现的。在渗透测试的初始阶段,团队通常会通过全面的探索流程来了解应用程序的功能和与之交互的各种服务。本案例中,客户产品的网络应用程序使用了WalletConnect。我们对HTTP流量的监控获取了向WalletConnect端点发出的请求信息,而其中一条请求引起了我们的特别注意。
在深入研究这个漏洞的具体细节之前,让我们从dApp的角度来看看VerifyAPI的HTTP请求工作流:
1.内嵌的WalletConnectSDK向verify.walletconnect.com发送请求,并在路径中包含项目ID。如果该ID已在WalletConnect注册,服务器将回复一个指向index.js文件的链接和CSRF标记。
2.然后,SDK会执行GET请求,利用之前获得的路径和CSRF标记获取验证请求的JavaScript代码片段。
3.用户确认通过WalletConnect连接钱包并生成QR码后,SDK会向/attestation端点发送POST请求,匹配id,并完成初始dApp设置。
在检查HTTP响应时,我们注意到HTML主体中包含一个直接嵌入JavaScript代码块的标记值。对于经验丰富的Web2.0安全专家来说,这种模式表明存在HTML注入或XSS(跨站脚本)攻击的潜在漏洞。
为了验证这一猜想,我们将上图请求中的标记值修改为XSS有效载荷<svg/onload=alert(document.domain)>,脚本成功执行了,这说XSS漏洞确实存在。
https://verify.walletconnect.com/index.js?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
XSS是一种注入式攻击,可以在可信网站中嵌入恶意脚本。
在Web2.0应用中,攻击者通常利用XSS漏洞访问用户cookie,劫持用户的网络会话和账户控制权。其他攻击包括把用户重定向到有害网站,或发起未经授权的请求。在Web3.0环境中,XSS攻击可以操纵去中心化钱包连接,诱骗用户签署有害交易,从而盗取资产。
接着,我们对XSS问题展开了进一步调查,包括测试各种有效载荷,来评估此漏洞是否会演变为SQL注入或远程代码执行等更严重的风险。
VerifyAPI是开源代码,在查看其代码后,我们了解了XSS漏洞的根本原因——该漏洞来自于validate_format函数验证标记值格式的方式。
if!CsrfToken::validate_format(&query.token){
虽然它检查了标记值是否具有有效的JWT标头,但未能彻底检查整标记值,因此攻击者仍可以通过给JWT标记值附加有效载荷来进行XSS攻击。
fnvalidate_format(s:&str)->bool{jsonwebtoken::decode_header(s).is_ok()}
为了验证潜在威胁,我们的安全团队利用以上的XSS漏洞创建一个演示用的有效载荷。一旦被使用在钓鱼网站上,用户将会收到一个资产授权提示,如果不仔细检查交易数据而点击确认,就会把资产控制权授权给攻击者。
由于用户看到的依然是https://verify.walletconnect.com/域名,对交易签名的警惕程度会大大降低。而对于非专业出身的用户来说,很难去验证交易的全部细节,很有可能会在无意中签署恶意交易,造成损失。
另一方面,我们在研究中没有发现任何可以放大该漏洞影响的方法,例如入侵WalletConnect的其他模块或发起用户被动操作。
在检测到XSS漏洞后,我们的团队迅速向WalletConnect团队提供了一份详细报告。WalletConnect团队迅速确认了我们的发现,并制定了解决问题的时间表。
WalletConnect的补救措施包括更新validate_format函数。此更新采用了白名单方法,标记值只允许使用字母、数字,以及符号-、.和_。虽然理论上仍有可能进行文本注入,但这一关键更新大大降低了XSS攻击的风险。
2023年10月14日:CertiK向WalletConnect报告该漏洞。
2023年10月16日:WalletConnect确认收到报告并确认问题。
2023年10月20日:WalletConnect更新了源代码,并推送至VerifyAPI。
2023年10月20日:CertiK确认XSS问题已得到缓解。
此次事件为我们带来一个重要提示:Web2.0所特有的漏洞不仅会在Web3.0环境中持续存在,而且还会不断演变,以更新的表现形式造成更大的安全威胁。因此,主动防护至关重要。定期审计、渗透测试、谨慎的漏洞评估以及实时跟进最新的安全动态,走在攻击者前面,是Web3.0企业守护安全的最佳做法。
对于DeFi用户来说,保持警惕在任何时候都至关重要。
一定要仔细验证网站或平台的URL,特别是看起来相似的数字与字母。诈骗者经常通过高仿URL欺骗用户。
进行交易时,请仔细查看交易的所有详细信息。钱包应用都会不时针对新的诈骗手法推出新的提示。在点击确认前确保理解钱包的所有提示,并确认目标地址的准确性。
在本篇文章中,我们详细介绍了在WalletConnect的VerifyAPI中发现的XSS漏洞及其影响,强调了Web2.0攻击在Web3.0环境中带来的安全风险。感谢WalletConnect团队的快速反应和有效补救,体现了他们对用户与Web3.0行业安全的强大责任感。
来源:金色财经