Hacker News 中文摘要

RSS订阅

Pnpm新增设置以抵御供应链攻击 -- Pnpm has a new setting to stave off supply chain attacks

文章摘要

pnpm 10.16版本引入了一个新设置minimumReleaseAge,用于延迟安装新发布的依赖包,以减少安装被攻击版本的风险。该设置指定了版本发布后必须经过的分钟数才能安装,例如设置为1440分钟则仅安装至少一天前发布的包。同时,可以通过minimumReleaseAgeExclude设置排除特定依赖,使其不受此限制。

文章总结

pnpm 10.16 版本发布

发布日期:2025年9月12日

主要更新内容:

新增延迟依赖更新设置

近期发生了几起流行软件包被成功攻击的事件。为了降低安装受感染版本的风险,pnpm 引入了一个新设置,用于延迟安装新发布的依赖项。通常情况下,此类攻击会很快被发现,恶意版本会在一个小时内从注册表中移除。

新设置名为 minimumReleaseAge,它指定了版本发布后必须经过的分钟数,pnpm 才会安装该版本。例如,设置 minimumReleaseAge: 1440 确保只能安装至少一天前发布的包。

如果需要为某些依赖项禁用此限制,可以在 minimumReleaseAgeExclude 设置下列出它们。例如,以下配置将始终安装最新版本的 webpack,无论其发布时间如何:

yaml minimumReleaseAgeExclude: - webpack

相关 issue: #9921

高级依赖过滤功能

新增了对 finders 的支持。过去,pnpm listpnpm why 只能通过名称(和可选的版本)搜索依赖项。现在,可以通过“finder 函数”根据依赖项的其他属性进行搜索。

例如,查找所有在 peer 依赖中包含 react@17 的包,可以在 .pnpmfile.cjs 中添加以下 finder:

javascript module.exports = { finders: { react17: (ctx) => { return ctx.readManifest().peerDependencies?.react === "^17.0.0"; }, }, };

然后通过以下命令使用该 finder 函数:

bash pnpm why --find-by=react17

pnpm 将找到所有在 peer 依赖中包含 React 17 的依赖项,并打印它们在依赖图中的确切位置。

还可以通过在 finder 中返回字符串来输出一些额外信息。例如,以下 finder 将输出匹配包的许可证信息:

javascript module.exports = { finders: { react17: (ctx) => { const manifest = ctx.readManifest(); if (manifest.peerDependencies?.react === "^17.0.0") { return `license: ${manifest.license}`; } return false; }, }, };

相关 PR: #9946

其他修复

  • 修复了在 Node.js 24 下执行 pnpm 时打印的弃用警告 #9529
  • 如果 nodeVersion 未设置为确切的 semver 版本,则抛出错误 #9934
  • pnpm publish 现在可以发布 .tar.gz 文件 #9927
  • 使用 Ctrl-C 取消正在运行的进程时,pnpm run 应返回非零退出代码 #9626

评论总结

评论主要围绕软件包管理和依赖更新的安全性、延迟更新策略、以及相关工具和解决方案展开。以下是主要观点和论据的总结:

  1. 延迟更新的有效性

    • 有评论认为延迟更新并不能完全解决问题,反而可能延长攻击检测时间。例如,评论1指出:“如果每个人都等3天才安装最新版本,那么检测到问题的时间将超过3天。”
    • 也有评论支持延迟更新,认为这是应对供应链攻击的有效策略。评论8提到:“uv工具通过隐藏功能支持延迟更新,已成为流行的标志。”
  2. 更新策略的合理性

    • 一些开发者认为生产环境中应更谨慎地更新依赖,避免过早使用新版本。评论3质疑:“JS生态系统真的这么快吗?难道不能等一两个月再更新包?”
    • 评论13则主张:“正确的设置应该是无限秒,更新应该是深思熟虑的,而不是自动的。”
  3. 权限管理与安全性

    • 有评论建议引入权限系统,限制包的访问权限。评论9提出:“为什么包管理器不推动权限系统,让包在package.json中定义所需权限?”
    • 评论11则认为根本解决方案是通过哈希值而非名称解析包,以减少攻击面:“真正的解决方案是停止通过名称解析包,而是通过哈希值解析。”
  4. 工具与解决方案

    • 一些评论提到现有工具和商业产品支持延迟更新。评论6指出:“有些商业产品也支持其他生态系统的延迟更新,如Maven、NuGet等。”
    • 评论15建议在企业环境中使用代理注册表和防火墙来过滤包:“在企业设置中,通常有代理注册表,可以设置防火墙来过滤许可证、CVE、发布日期等。”
  5. 生态系统与开发者行为

    • 有评论对JS生态系统的快速更新表示担忧,认为开发者应更加谨慎。评论3提到:“作为C++开发者,我倾向于在发布后的前六个月避免在生产环境中使用任何依赖。”
    • 评论16则调侃了开发者对便利性的依赖:“没有‘开发者懒惰、开发者愚蠢、left-pad退化’的评论,我们该怎么办?”

总结:评论中既有对延迟更新策略的支持,也有对其有效性的质疑。开发者对更新策略的谨慎态度、权限管理的需求、以及现有工具的改进建议是讨论的核心。同时,JS生态系统的快速更新和开发者行为也成为关注的焦点。