< 返回新闻中心

LavaMoat 来到 SSP — 为多签上线运行时沙盒

·阅读 4 分钟·作者:SSP Editorial Team
安全徽章下排列挂锁、带勾盾牌、芯片与闪电图标,头条写着「LavaMoat 来到 SSP」。

2025-10-23,SSP Wallet v1.27.0 落地,带来本年最深一层的运行时安全变化:由 MetaMask 率先实践的 JavaScript 分区框架 LavaMoat,如今已集成进 SSP。钱包加载的每一个第三方依赖,都被封进各自独立的沙盒,因此一个被植入恶意代码的包——这是每一个现代钱包都要面对的 npm 供应链风险——再也无法读取或篡改钱包其他部分的行为。本版还收紧了 Content Security Policy,把一个安全测试页藏在彩蛋手势之后,并附带若干 UI 打磨。

SSP 迎来运行时沙盒

LavaMoat,30 秒说清:一个运行时,它接管 JavaScript 应用的依赖树,把每个包隔进自己的隔间,只允许各隔间访问策略文件明确授权的全局变量和 API。默认情况下,一个第三方依赖既不能读取 localStorage,也不能调用 fetch,无法触及 keyring,也无法对 Object.prototype 做猴子补丁。一旦它尝试,运行时就把它挡下。

这是与大多数 Web 应用不同的安全姿态。在多数 Web 应用里,任何被引入的包,运行时拿到的权限和应用本身一样多。在 SSP 内部,处理私钥的代码、与交易所 API 对话的 swap 集成、以及第三方 UI 工具,过去都共享同一个全局作用域。从 v1.27.0 起,不再如此。

为什么分区很重要

分区要中和的威胁,是 npm 供应链攻击。这一模式在野外已被反复见证:攻击者拿下一个流行包,发布恶意版本,沿着传递性依赖的浪潮,直接或间接地灌进每一个引用它的应用。对钱包而言,一个以应用完整权限运行的恶意包,后果是灾难性的——它可以读取内存中的种子素材、外传私钥,或在用户签名前重写交易目的地址。

LavaMoat 不会阻止攻击抵达应用。它去掉的是后果。被植入的依赖,即便埋在依赖树第五层之深,运行时所在的隔间也无法触及签名表面、无法越过策略允许的网络出口、无从读取其他隔间的状态。包被攻陷 ≠ 钱包被攻陷——这一等价关系在 v1.27.0 第一次成立。

这一切补充而非取代了今年早些时候落地的保护。SSP 的源码已经被 Halborn 的完整审计验证过,你装上的那个二进制也已经能通过确定性构建与 GPG 签名核验回那份源码。LavaMoat 把运行时这一段补上:即使依赖在签名之后才"变坏",它也无法上升到钱包级权限。

更严格的 Content Security Policy

与运行时沙盒并肩,v1.27.0 还在浏览器层收紧了 Content Security Policy。CSP 是钱包为自己声明的预算——它允许从哪些来源加载脚本、允许与哪些来源通信、允许哪些内联行为。更严格的 CSP,会在 LavaMoat 在页面内部落地策略之前,就已经压缩了攻击者可活动的空间。

合在一起便是两层遏制:浏览器拒绝加载声明策略之外的资源,而真正跑起来的 JavaScript 又被 LavaMoat 分区。每一层覆盖一种失败模式——这正是纵深防御的全部要义。

一个隐藏的安全测试页

为内部验证之用——这是本次发布唯一一个故意带"彩蛋"的功能——v1.27.0 包含一个并未出现在常规导航里的安全测试页。在版本号上连续快速点击多次,即可显现。该页对 LavaMoat 策略与 CSP 规则进行一轮成套检查,让评审人员与红队可以确认:他们手头检查的那一份构建里,保护确实在生效,而无需自己为钱包加装探针。它并不面向日常用户,背后也没有任何可被利用的东西;它只是更方便地验证 v1.27.0 所承诺的内容。

纵深防御:审计 + 可复现 + 沙盒

v1.27.0 真正有意思的,不是孤立的 LavaMoat,而是三件事如何组合。经审计的源码(Halborn),任何人都能对源码进行核验的可复现二进制(确定性构建),以及一个把任何被攻陷依赖都关在隔间里的运行时。三者合并,问题就从"我是否信任 SSP 的整棵依赖树?"变成了"我是否信任经审计的核心?"——一个更小、也更容易回答的信任面。

UI 打磨叠在上面:swap 中的交易所 Logo 现在显示正确,品牌色彩在各屏之间也被统一。让钱包能"扛得住"的,正是分区。

分享本文

相关文章