每月,MetaMask 安全总监 Luker 都会报告您需要了解的最新加密攻击事件和新兴风险。
MetaMask 安全团队的 2022 年 4 月报告涵盖以下内容:Endo 在 npm 依赖链上实现 CommonJS 兼容性里程碑、LavaMoat v6 新增的 'a'a 包命名符号将 metamask-extension 执行时间从约 10 分钟缩短至 1 秒以内(提速约 600 倍)、MetaMask Extension 采用 LavaMoat v6 供应链保护、LavaMoat 的 lockdown() 实现 React Native 兼容性以为 MetaMask Mobile 铺路,以及关于 MetaMask 钱包数据 iCloud 备份的安全提示。请阅读以下详细内容,但首先……
精选 STEM 先驱:Butler Lampson——基于能力的计算机安全之父
Butler Lampson 是一位美国计算机科学家,他系统化地阐明了软件如何控制对资源的访问。他于 1970 年代初开发的访问矩阵模型将能力机制与访问控制列表统一为单一框架,并因此荣获 1992 年图灵奖。他所开创的基于能力的隔离机制,是 Endo 和 LavaMoat 如今用于保护 MetaMask 的隔离沙箱技术的理论基础。
Endo 实现 CommonJS 模块兼容性,揭示 npm 包加载中的剩余缺口
Endo 的 CommonJS 支持于 2022 年 4 月达到重要里程碑。针对 npm 生态系统中真实包(主要从 MetaMask 依赖项中选取)的端到端测试,暴露了 CommonJS 支持不足的情况,并推动了相关实现的完善。一项比较多种导出形式的测试——涵盖在 ESM 中通过 Endo、Node.js 及多种打包工具导入 CommonJS 的场景——有助于明确目标并避免功能回退。
此阶段 Endo CommonJS 支持的主要变更包括:将 exports 与 import * 连接并引入隐式默认导出;改进词法分析器以检测所有 require 的出现位置,并将缺失包错误推迟至运行时;重构 exports 处理逻辑,将 module.exports 设为默认值并识别命名导出;以及新增对嵌套 package.json 中 type:module 的支持,以及 package.json exports 中可选值数组的支持。
进展情况可在 CommonJS 跟踪 epic 中查看。
Endo 现已支持正确加载 CommonJS 模块。从 npm 加载真实包时的所有剩余问题可归为四类:使用缺失功能(如 require.resolve 或 import.meta)、修改全局变量和内置对象、触发防止注入 imports 或 HTML 注释的过滤器,以及 Endo 的导出映射和模块类型解析错误。
Endo 实验性 run 命令支持在隔离环境中执行 JS 文件
基于用于连接 Endo 端到端测试的现有工具,实验性 endo run 命令现已能够在隔离环境(compartments)中执行 JS 文件——类似于 node app.js,但应用了 Endo 的隔离模型。
目前,代码库及其依赖项可通过 require/import 访问所有 Node.js 核心模块。后续工作应增加对 LavaMoat 策略的支持。
LavaMoat v6 'a'a 包命名将 metamask-extension 执行时间提速 600 倍,从 10 分钟缩短至 1 秒以内
LavaMoat v6 引入了新的包标识符符号,以防止因包名冒充和重用而引发的问题。该符号被称为 'a'a,现已用作策略文件中的键名。
初始实现的性能受到 Node.js 在查找和访问文件时低效问题的严重影响。第一次性能优化尝试——仅限于两种简单的记忆化(memoization)场景——将 metamask-extension 中 'a'a 的最坏情况执行时间从 10 分钟缩短至 30 秒,但内存使用峰值的代价过高。
第二轮性能诊断与优化通过新算法、消除递归以及对 Node.js 模块解析的局部性能改进,相比第一轮结果将时间和内存占用均降低了 25 倍以上。
从第一个完整实现到当前版本,执行时间总体提升约 600 倍。
MetaMask Extension 采用 LavaMoat v6 供应链保护
MetaMask Extension 现已在 LavaMoat v6 的保护下运行,推出进度可在 PR #14488 中跟踪。
LavaMoat lockdown() 实现 React Native 兼容性,为 MetaMask Mobile 铺路
使 LavaMoat 在 React Native 应用中正常运行的关键步骤,是执行 SES 的 lockdown() 函数。lockdown() 函数通过列举 JavaScript 中的原始内置对象(primordials)并冻结原型,保护软件免受供应链攻击,使恶意行为者难以实施原型污染攻击。
此次工作中发现的详细见解记录于 React Native 兼容性跟踪器中。实现兼容性的关键要点包括:允许 Metro 通过运行 .cjs 文件来执行 SES bundle、添加特定的 lockdown 选项、移除 Babel 插件,以及移除 Promise polyfill。其他问题则与 MetaMask Mobile 应用本身相关,例如 Sentry 和 EthereumJS 依赖项。
最终成果是向 MetaMask Mobile 应用仓库提交的一个拉取请求。后续步骤包括运行端到端测试,确认 lockdown() 未破坏其他功能,然后再进入下一阶段:将 LavaMoat 集成至 MetaMask Mobile。
iCloud 备份被发现包含经密码加密的 MetaMask 钱包数据
已为应用数据启用 iCloud 备份的 Apple 用户,可能在不知情的情况下备份了经密码加密的 MetaMask 钱包数据。如果您的密码强度不足,且有人钓鱼获取了您的 iCloud 凭据,这可能导致资金被盗。MetaMask 已在 X 上发布指引,说明如何在设备上控制此设置的操作步骤。
MetaMask 2022 年 4 月加密安全报告涵盖了 Endo 在 MetaMask npm 依赖链上实现 CommonJS 兼容性里程碑、LavaMoat v6 通过新的 'a'a 包命名符号将 metamask-extension 性能提升 600 倍,以及 MetaMask 钱包数据 iCloud 备份安全提示。浏览往期 MetaMask 加密安全报告,了解更多威胁、趋势及生态系统安全防护建议。