前端劫持:当真正的网站反过来对付你

·阅读 5 分钟·作者:SSP Editorial Team
SSP Academy 封面:前端与 DNS 劫持

前端劫持:当真正的网站反过来对付你

大多数防钓鱼建议都可以归结为一条规则:确认自己访问的是真正的网站。自己输入网址、使用书签、忽略消息中的链接。这是好建议,但它有一个盲区:有时候,真正的网站在真正的地址上,也会开始提供恶意内容。

这就是前端劫持。一个去中心化应用背后的智能合约可能完全安全,而你用来访问它们的网站却已被悄悄替换,它要求你签署的每一笔交易都是为了清空你的钱包而设计的。

网站与协议是两回事

一个去中心化应用由两部分组成:

  • 区块链上的合约,负责保管资金并执行规则。
  • 前端,也就是网站,负责读取数据、构建交易,并把交易发送到你的钱包等待签名。

合约通常经过审计、公开透明且难以修改。前端则是一个普通网站,托管在普通的基础设施上,而且它决定了究竟什么内容会摆到你面前让你签名。如果攻击者控制了网站,他们根本不需要碰合约,只需要让你签下他们的交易,而不是真正的那一笔。

前端是如何被劫持的

  • DNS 劫持。攻击者夺取域名的设置权限(通常是通过域名注册商或管理该域名的账户),把真正的地址指向自己的服务器。你浏览器里的网址是对的,网站却不是。
  • 托管或部署环境被攻破。能够访问项目托管服务、构建流水线或部署密钥的攻击者,推送一个被篡改过的网站版本。
  • 恶意依赖。网站加载的某个第三方脚本或库(数据分析工具、界面组件、钱包连接包)被攻破,所有使用它的网站都开始提供攻击者的代码。
  • 注入脚本。某个漏洞让攻击者得以把代码插入到一个原本合法的页面中。

无论哪种情况,访问过程看起来都一切正常:同样的网址、同样的设计、同样的流程,直到出现交易请求为止。

攻击是什么样子的

被劫持的前端通常会瞄准少数几类高价值请求:

  • 向攻击者地址发起的无限额代币授权,被包装成一个普通的“授权以继续”步骤。
  • NFT 的“全部授权”,被包装成挂单出售或领取。
  • 链下签名,例如许可签名或交易市场订单,之后可以被提交上链,在不再提示你的情况下转走资金。
  • 直接转账,被伪装成存款、领取或迁移。

关键破绽在于:你正在做的事情与你被要求签署的内容不一致。兑换一小笔金额,不应该需要向一个你不认识的地址授予无限额度。领取一份奖励,也不应该需要把所有资产转出去。

如何保护自己

你无法通过观察页面来识别被劫持的服务器。你的防线在签名这一步,因为攻击者的意图必须在这里显露出来。

  • 在钱包里阅读每一个请求,而不是在网站上。页面可以显示任何内容;钱包才会显示你实际签署的是什么。
  • 检查授权中的支出方和金额。陌生地址和无限额度都值得你立刻停下来。
  • 警惕流程中的突然变化。如果一个网站在某个步骤从来不要求签名或授权,却突然开始要求,这就是一个警告信号。
  • 有模拟功能就用起来。预览一笔交易将会做什么,可以揪出实际效果与标签不符的请求。
  • 关注官方公告。发现前端被攻破的项目,通常会很快在官方渠道发出警告。如果感觉哪里不对劲,先核实再签名。
  • 拿不准时,事后撤销。如果你在某个网站被攻破期间批准过什么,请立即撤销该授权。

这些建议是对钓鱼攻击经典防范建议的补充,而不是替代。检查网址能保护你免受假网站之害;阅读请求则能保护你免受变坏了的真网站之害。

SSP 能在哪些方面帮到你

当通过 WalletConnect 连接的去中心化应用请求 SSP 签名时,请求会显示是哪个网站发起的、所在网络以及地址,并且 SSP 会在你批准之前解码常见调用:转账、授权以及 NFT 全部授权请求都会被标注出来,风险较高的请求还会附带明确警告。消息会尽可能以可读文本显示,同时也可以查看原始数据。

随后,每个请求还需要在另一台设备上的 SSP Key 中进行第二次批准。这并不能阻止被劫持的网站提出恶意请求,但它给了你两次清楚看清请求真面目的机会,而且两次都不在攻击者控制的页面上。

对于团队,SSP Enterprise 金库会在签名人批准之前提供交易模拟和风险警告,因此通过被攻破的前端构建的提案,会得到每一位需要签名的成员再一次独立的审视。

坦率的总结

前端劫持可以在不触碰合约、也不改变网址的情况下,把一个值得信赖的网站变成攻击者的工具。你无法通过检查地址栏发现它。

你能做的,是把每一个签名请求都当作真正的界面来对待:在钱包里阅读它,检查支出方、金额和收款方,拒绝任何与你本来打算做的事情不符的请求。

分享本文

相关文章