LavaMoat 是一款免费开源工具,专为关注供应链安全的 JavaScript 开发团队而设计。这一工具由 MetaMask 联合创始人 Kumavis 创立,同时解决了 Web3 中的安全问题以及开源生态系统中长期存在的结构性安全隐患。
如果你正在使用 JavaScript(简称 JS)进行开发,就必须了解其依赖项的安全现状。JS 工程师很少从零开始构建应用;他们通常会将现有代码片段(通常称为"依赖项")引入项目,像积木一样加以使用。这对协作和提升开发速度大有裨益,但如果某个依赖项中包含恶意代码,该怎么办?
软件供应链安全涵盖所有与应用程序相关的内容(如依赖项),以及参与开发过程的各个环节(如构建工具或 CI 系统)。JavaScript 是开发者最常用的编程语言,同时也极易遭受供应链攻击。这份来自 2017 年的漏洞时间线显示,约半数攻击源自 npm——一个广受欢迎的开源 JS 包来源:
来源:SonaType
JavaScript 之所以成为攻击目标,原因在于:
广泛普及: 前端和后端均有使用
环境权限: 在运行 JavaScript 的环境中,你可以获取大量权限,例如网络访问权限
可变性: 默认情况下,一切皆可修改
2018 年的 Copay 钱包黑客事件引发了 Kumavis 解决这一问题的兴趣,也成为设计 LavaMoat 的主要参考案例。Copay 是 BitPay 推出的一款自托管比特币钱包,遭遇了一次供应链攻击,导致用户资金被盗。攻击者控制了该钱包所使用的某个 npm 依赖项,从而得以实施攻击。
那么,如何解决这个问题?目前有几种常见的解决思路。
完全不使用依赖项?不现实。
虽然这样或许更安全,但你真的愿意放弃开源——那个作为我们共同基础、汇聚了无数共同财富的生态系统吗?放弃分享与协作?如果你想构建复杂的东西,真的愿意花时间重新造轮子吗?
我们也不愿意。
始终审计所有依赖项?同样不现实。
这个想法固然不错,但你有多少依赖项?几百个?几千个?几万个?这根本不切实际——不过,如果你确实想进行手动审计,LavaMoat 可以帮你优先排查最危险的依赖项(后文详述)。
而且,即便你有时间仔细审查每个包,你真的能发现其中的安全漏洞吗?
这很难说。所以,让我们来探索一种不同的解决方案:
LavaMoat?就是它。
与其完全不使用依赖项,或始终审计所有依赖项,不如来看看 LavaMoat 的安全内核——它将各个包封装在独立的隔离区中,并仅授予其所需的访问权限。
请记住,恶意代码要攻击你的系统,必须先获得相应的权限。LavaMoat 的内核会扫描你引入项目的第三方代码,判断各依赖项运行所需的权限,并且 仅授予这些权限**。**
LavaMoat 目前正在 MetaMask 为数千万用户提供保护,并在每个开发流程的三个不同阶段运行:依赖项安装、构建和运行时。
为了更直观地理解,请查看这个依赖关系图可视化仪表盘:
左侧列出了你的依赖项列表,右侧以神经网络的形式展示了依赖关系图。颜色基于危险程度的启发式评估:例如,绿色表示该依赖项未调用任何高权限平台 API。
这里的核心理念是帮助你优先排查需要审计的依赖项。
那么,如何实施呢?
结合三个开发阶段:
安装阶段:@lavamoat/allow-scripts
构建阶段:lavamoat-node
运行时阶段:适用于你的打包工具的 lavamoat-x 插件
这将为恶意代码构筑一道防护壕沟。
规模化软件构建
如果你有兴趣参与贡献,LavaMoat 是开源项目!我们正在努力为尽可能多的打包工具开发插件,并希望让策略审查更加便捷,同时在为包授予网络访问权限时实现更严格的锁定。欢迎在此处参与贡献。
订阅我们的开发者通讯,获取更多最新动态!祝构建顺利。