npm 供应链攻击
在现代前端开发中,包管理工具如 npm 为我们提供了极大的便利。然而,随着依赖生态系统的复杂化,供应链攻击的风险也在增加。近期,Vant 组件被投毒的事件引起了广泛关注,攻击者通过篡改 postinstall 脚本,试图在用户系统中执行恶意代码。为应对此类威胁,pnpm 提供了 onlyBuiltDependencies 和 onlyBuiltDependenciesFile 配置选项,帮助开发者在安装依赖时限制哪些包可以执行安装脚本,从而提升项目的安全性。
理解 postinstall 脚本的风险
在 npm 包的 package.json 文件中,postinstall 脚本会在包安装完成后自动执行。虽然这对于执行必要的构建步骤或初始化操作非常有用,但也可能被恶意者利用,执行未经授权的代码,危及系统安全。
pnpm 的安全特性
pnpm 作为高性能的包管理工具,提供了更细粒度的控制,允许开发者指定哪些依赖可以在安装过程中执行脚本。这主要通过以下两个配置实现:
-
onlyBuiltDependencies:此字段允许在安装期间执行安装脚本的包名列表。如果此字段存在,那么只有列出的包能够运行安装脚本。示例:
1{ 2 "pnpm": { 3 "onlyBuiltDependencies": ["fsevents"] 4 } 5}在上述配置中,只有
fsevents包被允许在安装时执行其安装脚本。 -
onlyBuiltDependenciesFile:此配置选项允许用户指定一个 JSON 文件,该文件列出了在 pnpm 安装过程中允许运行安装脚本的包。通过使用它,可以增强安全性或确保在安装过程中只有特定的依赖项执行脚本。示例:
1{ 2 "dependencies": { 3 "@my-org/policy": "1.0.0" 4 }, 5 "pnpm": { 6 "onlyBuiltDependenciesFile": "node_modules/@my-org/policy/onlyBuiltDependencies.json" 7 } 8}在
onlyBuiltDependencies.json文件中,应包含允许执行安装脚本的包名称列表:1[ 2 "fsevents" 3]
实施步骤
-
确定可信赖的依赖包:审查项目中的依赖,确定哪些包确实需要在安装时执行脚本。
-
配置
pnpm设置:在项目的package.json中,添加pnpm字段,并根据需要使用onlyBuiltDependencies或onlyBuiltDependenciesFile进行配置。 -
创建
onlyBuiltDependencies.json文件(如果适用):如果选择使用onlyBuiltDependenciesFile,则需要在指定路径创建包含允许执行安装脚本的包名称列表的 JSON 文件。 -
测试和验证:运行
pnpm install,确保只有指定的包执行了安装脚本,并验证项目功能正常。
注意事项
-
定期更新依赖:保持依赖包的更新,及时获取安全补丁,减少被攻击的风险。
-
监控安装日志:在安装过程中,关注 pnpm 的日志输出,确保未授权的包未尝试执行安装脚本。
-
教育团队成员:确保团队中的所有开发者了解这些安全措施的重要性,并在各自的项目中加以实施。
通过合理配置 pnpm 的 onlyBuiltDependencies 和 onlyBuiltDependenciesFile,可以有效防范因 postinstall 脚本被投毒而引发的安全问题,保障项目的安全性和稳定性。