清单混淆为新的npm供应链威胁铺平了道路

npm 生态系统中的严重漏洞:manifest 混淆问题

前 npm 工程经理 Darcy Clarke 最近发布的一份报告指出,npm 注册表没有验证 manifest 信息与对应包 tarball 内容的一致性。这种“双重真相”问题为攻击者提供了隐藏脚本或依赖项的机会。

漏洞根源:manifest 混淆

Clarke 将这一漏洞命名为“manifest 混淆”。其核心问题在于,npm API 要求维护者在提交包时,既要在 PUT 请求的正文中提供有效的 manifest,又要在上传的 tarball 包中的 package.json 文件中包含 manifest。由于 npm 服务器不验证这两份 manifest 的一致性,它们可能会存在差异,而不会被察觉。这对于 npm 客户端来说尤为关键,因为这也引发了对哪一份 manifest 是“真实”的疑问。Clarke 在文章中展示了如何通过 npm CLI 或直接访问 npm API 复现这种不一致。

潜在风险

Clarke 指出,这一漏洞具有严重的潜在影响:

  1. 依赖项隐藏:npm 上的包列表可能显示该包没有依赖项,但实际上存在。
  2. 名称和版本不一致:包名或版本可能与 package.json 中的不一致,可能导致缓存污染。
  3. 隐藏脚本:可以隐藏安装期间运行的脚本。

这些不一致性都可能被恶意利用,例如:

  • 伪装成其他包诱导用户误装。
  • 在用户不知情的情况下安装隐藏的依赖项。

影响范围

Clarke 详细分析了这一漏洞对 npm 生态系统中许多第三方客户端、工具以及包管理器的影响,建议用户仔细检查其常用工具的可靠性。

建议

Clarke 最终建议所有 npm 用户停止依赖 npm 注册表的 manifest 文件,转而使用 package.json,但 nameversion 字段除外。

专家观点

在与 InfoQ 的对话中,Sonatype 的安全研究员 Ax Sharma 指出,这些不一致性并不一定是恶意的,可能是合法克隆或分叉的结果,或者是开发者在更新包时未清理过时元数据所致。他还强调:

信任 package.json 并不比信任 npmjs 页面上的信息更可靠。

Sharma 认为,解决方案在于使用能够进行更深入分析的安全工具,例如基于哈希的恶意或漏洞文件分析(即高级二进制指纹识别)。

其他建议

J. M. Rossy 在 Twitter 上建议默认关闭脚本执行功能,以降低风险。

总结

manifest 混淆问题暴露了 npm 生态系统中的严重安全隐患。用户应提高警惕,使用安全工具进行深度分析,并采取必要措施降低风险。如需了解更多细节,建议阅读 Clarke 的原文。

阅读 28
0 条评论