缓解供应链攻击
有时 npm 包会被破坏并被恶意软件发布。幸运的是,有 Socket、Snyk、 Xygeni 和 Aikido 等公司能够及早发现这些受损软件包。 npm 源通常在几小时内删除受影响的版本。然而,恶意软件发布和被检测到之间总会有一段时间,在此期间你可能会受到攻击。幸运的是,你可以使用 pnpm 做一些事情来最大限度地降低风险。
阻止有风险的安装后脚本#
从历史上看,大多数受损软件包都使用 postinstall 脚本在安装后立即运行代码。为了缓解这种情况,pnpm v10 禁用依赖项中 postinstall 脚本的自动执行。尽管可以使用 dangerouslyAllowAllBuilds 全局重新启用它们,但我们建议使用 allowBuilds 明确列出受信任的依赖项。这样,如果依赖项过去不需要构建,那么在发布受损版本时它就不会突然运行恶意脚本。尽管如此,我们仍然建议在更新带有 postinstall 脚本的受信任的包时要谨慎,因为它可能会受到损害。
防止出现奇异的传递依赖关系#
你可以通过将 blockExoticSubdeps 设置为 true 来阻止传递依赖项使用特殊来源(例如 git 存储库或直接 tarball URL)。这样可以确保所有传递依赖关系都从可信来源解析,从而降低供应链攻击的风险。
延迟依赖更新#
另一种降低安装受损软件包风险的方法是推迟更新依赖包。由于恶意软件通常会很快被检测到,因此将更新延迟 24 小时很可能会阻止你安装错误版本。 minimumReleaseAge 设置定义了版本发布后 pnpm 安装之前必须经过的最少分钟数。在 pnpm v11 中,默认值为 1440(1 天),这意味着新发布的软件包至少要 1 天后才能被解析。若要选择退出,在 pnpm-workspace.yaml 中设置 minimumReleaseAge: 0。你也可以将其设置为 10080,以便在安装新版本之前等待一周。
强制执行信任政策#
为了进一步保护你的供应链,pnpm 还支持 trustPolicy 设置。pnpm 当设置为 no-downgrade 时,如果软件包的信任级别与以前的版本相比有所降低(例如,如果该软件包以前是由受信任的发布者发布的,但现在只有来源信息或没有信任证据),则此设置将阻止安装该软件包。这可以帮助你避免安装可能已被入侵或不太可信的版本。
如果你需要允许特定软件包或版本绕过信任策略检查,可以使用 trustPolicyExclude 设置。这对于已知软件包很有用,这些软件包可能不符合信任要求,但仍然可以安全使用。
此外, trustPolicyIgnoreAfter 设置允许您忽略对超过指定时间之前发布的软件包的信任检查。这对于缺少带有签名或来源信息的发布流程的旧版本软件包很有帮助。
使用锁文件#
不用说,你应该总是用锁文件锁定你的依赖关系。将你的锁文件提交到你的资源库,以避免意外的更新。
将依赖固定到其来源的注册源#
如果你从不止一个注册源安装,请对必须来自特定注册源的包使用 namedRegistries 别名。自 v11.20.0 起,pnpm 会把这些包以带注册源限定的键(<name>@<registryName>:<version>)记录在锁文件中,因此发布相同名称与版本的另一个注册源无法悄悄替换该包。参见锁文件中的命名注册源。未使用别名安装的包,仍像以前一样通过默认的 registries 配置来解析。