By: Thinking
背景
随着 TON 生态项目的升温,Web3 钓鱼团伙也开端进入 TON 生态的战场。目前 TON 生态中运用 TonConnect SDK 来处置跨平台/应用钱包衔接和交互的问题,这类计划都难免会遇到一个难题:如何处置跨平台/应用通讯时的域名考证?
通常为了能够让用户在运用钱包衔接 DApp 或确认签名央求的来源能否牢靠时,钱包都会在央求批准页面提示来源的域名,便于用户更好地考证并确认央求的来源能否与自己操作的来源分歧,从而避免遭受歹意来源签名央求的狡诈。
慢雾安全团队此前就发现过这类钱包和 DApp 跨平台/应用通讯时的域名考证安全问题,我们跟 MetaMask SDK 和 WalletConnect Web3Modal 的项目方团队中止了沟通和交流,发现该问题较难处置。因而,目前 MetaMask 和 WalletConnect 尚未完整处置这个问题。
近日,我们发现 TON 生态中的 TonConnect SDK 也存在相同的问题,于是在此披露,希望能够辅佐用户辨认和防备这类风险。
剖析
通常阅读器扩展钱包和 DApp 中止交互时会在网页上注入 JS 脚本(content script),用于转发网页和阅读器扩展之间的音讯。网页和 content script 中止通讯时运用的是 window.postmessage 和 window.addEventListener,而 window.addEventListener 能够经过获取音讯的 origin 来进一步处置音讯,细致操作包含在阅读器扩展钱包展示音讯的 origin,判别音讯的 origin 能否在黑名单内,抵音讯的 origin 中止鉴权等操作。由于 origin 依赖阅读器提供的函数功用来获取,因而无法被伪造。
但是跨平台/应用音讯通讯时,通常经过音讯转发效劳器抵音讯中止转发,而音讯转发效劳器很难抵音讯发起的域名中止检查(由于客户端的数据能够被伪造),因而存在音讯来源被伪造的问题,以下是跨平台/应用音讯通讯的 2 个场景:
- 阅读器网页 音讯转发效劳器 钱包
- 其它 音讯转发效劳器 钱包
以 TonConnect SDK 为例,DApp 运用 TonConnect SDK 作为钱包和 DApp 中止音讯通讯的工具,需求在接入 TonConnect SDK 的时分配置好 dappMetadata,但是 dappMetadata 的数据是难以考证的,歹意 DApp 能够经过修正 dappMetadata 伪装成可信的网站,从而对用户中止狡诈。
import { SendTransactionRequest, TonConnect, UserRejectsError, WalletInfo, WalletInfoInjected } from ‘@tonconnect/sdk’;import { notification } from ‘antd’;import { isMobile, openLink } from ‘src/utils’;
const dappMetadata = { manifestUrl: ‘https://x.x.x/tonconnect-manifest.json’,};
export const connector = new TonConnect(dappMetadata);
把 manifest.json 设置成以下内容就能够将 origin 伪构成 ton.org:
{ “url”: “https://ton.org”,”name”:”FakeandevilDApp”, “iconUrl”: “https://ton-connect.github.io/demo-dapp/apple-touch-icon.png”, “termsOfUseUrl”: “https://ton-connect.github.io/demo-dapp/terms-of-use.txt”, “privacyPolicyUrl”: “https://ton-connect.github.io/demo-dapp/privacy-policy.txt”}
以下是部署上述代码后的 PoC,接下来我们扫描并解析二维码。
TonConnect SDK 经过二维码的方式将 manifestUrl 的数据传送给钱包应用,不像其他 SDK 经过音讯转发效劳器转发。钱包应用会解析扫描取得的 manifestUrl 的数据。能够发现,我们随意伪构成恣意 DApp 的 origin 与钱包中止了通讯,也就是说,攻击者能够应用这个缺陷伪造知名的 DApp 实施钓鱼和狡诈攻击。
https://app.tonkeeper.com/ton-connect?v=2&id=24e3f2fdbea19fcd4fe03da3bc3d534d8b988edd01736f0b127a70cf2c531661&r={“manifestUrl”:”https://tonconnect.pages.dev/tonconnect-manifest.json”,”items”:[{“name”:”ton_addr”}]}
衔接胜利后,伪造的 DApp 经过 TonConnect 发起签名申请,一旦用户确认了,钱包就会将签名后的数据广播到区块链上。由于 origin 伪造极具诈骗性,用户很难鉴别衔接和签名申请的来源。
在 MetaMask SDK 中,经过修正 dappMetadata 即可伪构成知名的 DApp 实施钓鱼和狡诈攻击:
同理,在 WalletConnectModalSign 中,修正 metadata 即可:
import { WalletConnectModalSign } from “https://unpkg.com/@walletconnect/modal-sign-html@2.5.8”;
const connectButton = document.getElementById(“connect-button”);
const web3Modal = new WalletConnectModalSign({ projectId: “32832b2f363c3e960ea28541f380b8d1″, metadata: {name:”FakeandevilDApp”,description:”FakeandevilDApp”, url: “https://walletconnect.com/”, icons: [“https://walletconnect.com/static/favicon.png”], },});
总结
由于目前主流钱包和 DApp 跨平台/应用通讯时的域名考证问题暂时没有较好的处置计划,因而 SDK 项目方通常会额外增加一些考证方式,如:WalletConnect 的 Verify 机制(https://docs.walletconnect.com/cloud/verify),在 DApp 经过考证域名后,钱包方能够经过 Verify API 来判别域名能否可信。
但是,很多主流的 DApp 没有对域名中止 Verify,所以这个处置计划也很难处置伪造 origin 钓鱼攻击。假如绝大多数 DApp 运用 Verify 的方式对域名中止认证,那么将很大水平上让用户避免遭受日益猖獗的伪造 origin 钓鱼攻击。慢雾安全团队在此也倡议用户留意辨认翻开的网站能否和央求批准展示的域名分歧,避免遭受此类攻击。