关于 npm audit 以及 npm audit fix 的修复策略了解

本文详细介绍了npm audit命令,用于检测npm项目的安全漏洞,并探讨了npm audit fix的修复策略,包括直接依赖和间接依赖的修复情况。文章讨论了npm audit的可用性与npm源和版本的关系,指出不同npm源可能影响命令的可用性,同时说明了npm audit fix在处理大版本升级时的限制。最后,提到了GitHub Advisory Database作为漏洞数据来源的重要角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

什么是 npm audit

使用 npm audit

npm audit 衍生命令 

npm audit 是否可用和什么相关

是否和 npm 源有关?

是否和 npm 版本有关?

看看不同 npm 版本使用 npm audit 的效果

关于漏洞列表

GitHub Advisory Database 是什么数据库

npm audit fix修复策略

直接依赖漏洞

不锁版本号

锁版本号

大版本升级测试

间接依赖漏洞

npm audit fix修复策略总结

参考文档


什么是 npm audit

  • npm audit 是npm 6 新增的一个命令,可以允许开发人员分析复杂的代码并查明特定的漏洞。 该命令会在项目中更新或者下载新的依赖包之后自动运行,如果你在项目中使用了具有已知安全问题的依赖,就收到官方的警告通知。

  • npm audit需要包package.jsonpackage-lock.json文件。它是通过分析 package-lock.json 文件,继而扫描我们的包分析是否包含漏洞的。

  • npm audit 返回的漏洞数据来源于 Github Advisory Database 。

  • npm官方文档(npm-audit)


使用 npm audit

npm 源下,执行 npm audit,如果有已知漏洞,则会展示该漏洞的信息

 如上图,可以看到信息包括了 漏洞涉及问题、漏洞危险等级、所在依赖包,依赖包的依赖层级、详细信息 等等信息。


npm audit 衍生命令 

# 扫描项目漏洞把不安全的依赖项自动更新到兼容性版本
npm audit fix

# 在不修改 node_modules 的情况下执行 audit fix,仍然会更改 pkglock
npm audit fix --package-lock-only

# 跳过更新 devDependencies
npm audit fix --only=prod

# 强制执行 audit fix 安装最新的依赖项(toplevel)
npm audit fix --force

# 单纯的获取 audit fix 会做的事,并以 json 格式输出。
npm audit fix --dry-run --json

# 获取详情
npm audit

# 以 JSON 格式打印报告
npm audit --json

# 安装单个包关闭安全审查: 
npm install example-package-name --no-audit
# 安装所有包关闭安全审查 - 运行 
npm set audit false - 手动将 ~/.npmrc 配置文件中的 audit 修改为 false
 


npm audit 是否可用和什么相关

首先我们已知,npm audit需要包package.jsonpackage-lock.json文件。它是通过分析 package-lock.json 文件,继而扫描我们的包分析是否包含漏洞的。在使用这个命令的时候,可能有些同学会发现自己终端的 npm 命令不包含 npm audit 这条命令,产生这个问题的原因我们来探究一下。


是否和 npm 源有关?

首先,在 npm 官方源下,是可以运行 npm audit的,如果切换的 cnpm 源下,就无法调用了。

如上图,在 cnpm 源下,不支持 npm audit

那么是什么原因导致的呢

关于这个问题,我们可以自己创建一个私有源,看看有没有这个命令。
创建私有源,可以看看这个工具--verdaccioverdaccio 可以用于搭建一个私有仓库。具体步骤本文就不细说了,有需要的小伙伴可以看官方文档或者查阅其他笔者的文章。

接下来切入正题,假设我本地已经使用 verdaccio 搭建好了一个私有源,然后我们打开它的配置文件 config.yarm 看看

可以看到在配置中有一个中间件字段,用于确定是否使用 audit,经过测试,当 enabled:false时,无法调用npm audit,当enabled:true时,可以调用npm audit

从这里我们可以知道,不同的 npm 仓库可以决定当前终端是否可以使用 npm audit 命令。


是否和 npm 版本有关?

确定使用 npm audit 所需的版本需为 npm@5.10.0 & npm@6以及以后版本(node 版本中,并没有与 npm@5.10.0 对应的版本,所以推荐使用 npm@6 以后的版本,也就是 Node 版本大于 10.3.0 版本)


看看不同 npm 版本使用 npm audit 的效果

  1. Npm 5.6.0 Node版本小于 10.3.0

  1. npm @5.10.0

可以看到信息来源是 nodesecurity.io/advisories 这个地址,这是 node 安全通告数据库

  1. npm@6.14.12

可以看到信息来源是 github.com/advisories 而该仓库的漏洞来源就包括了之前的 node 安全通告数据库, 至于该仓库漏洞的其他来源可以往下看,后续会有解答

  1. npm@8.19.2

可以看到漏洞来源也是 github.com/advisories ,且展示方式发生了改变。


关于漏洞列表

首先,该漏洞列表的全名叫 - GitHub Advisory Database

GitHub Advisory Database 是什么数据库

About the GitHub Advisory database GitHub 为了让开发者能够轻松实现安全开发,推出了一个名为 Advisory Database 的开放安全咨询数据库,它专注于为开发者提供高质量、可操作的漏洞信息。它不仅仅为 npm 提供漏洞信息。它可以支持不同的生态

Composer (registry: packagist.org/)

Erlang (registry: hex.pm/)

Go (registry: pkg.go.dev/)

GitHub Actions (github.com/marketplace…)

Maven (registry: repo.maven.apache.org/maven2)

npm (registry: www.npmjs.com/)

NuGet (registry: www.nuget.org/)

pip (registry: pypi.org/)

pub (registry: pub.dev/packages/re…)

RubyGems (registry: rubygems.org/)

Rust (registry: crates.io/)

可以看到支持这些生态

GitHub Advisory Database 漏洞来源

  • 机器学习和人工审查结合检测 GitHub 上公共提交中的漏洞
  • 在 GitHub 上报告的安全公告

这些漏洞谁维护的?

github 内部人员, 社群

具体可以看下面readme

github.com/github/advi…

这是仓库 readme,可以看到问题的所在点

有两种方法可以为该存储库中提供的信息做出贡献。

从github.com/advisories,上任何单个建议中,单击针对此漏洞的改进建议(如下所示)以打开“改进的安全建议”表单。编辑表单中的信息,然后单击“提交改进”以打开包含您建议的更改的“拉”请求。或者,您可以直接针对该存储库中的文件提交一个拉请求。为此,请遵循投稿指南。


npm audit fix修复策略

直接依赖漏洞

分三种情况进行实践

不锁版本号

  1. 当前我们直接依赖了一个具有安全漏洞的 lodash@4.17.4 版本:
 

json

复制代码

"dependencies": { "lodash": "^4.17.4" }

  1. 运行 npm audit 查看报告

可以看到给出了建议——运行 npm install lodash@4.17.21

  1. 通过安全漏洞数据库查看修复版本是 4.17.21

由于 ^4.17.4 的依赖范围是 >=4.0.0 < 5.0.0 ,已修复的版本 4.17.21 在这个范围内,那么实际上 npm audit fix 执行的逻辑就是 npm update lodash@4.17. 21。

  1. 运行 npm audit fix,查看版本更新

可以看到实际上就是升级到了 4.17.21,由此可以知道,npm audit fix 的策略就是升级到已修复版本。

但是由于4.17.21已经是 lodash 的最大版本,因此还得确定到底是该命令到底将依赖包升级到了修复版,还是最新版

  1. 继续验证确定到底是升级到修复版,还是最新版

后续找到一个 lodash 4.10.0版本漏洞,4.10.11版本被修复的漏洞条目,用来测试升级版本规律,然后本地安装 lodash 4.10.0 版本,运行 npm audit fix ,发现修复后,包版本变为了4.17.21,而不是 4.10.11,由此得知,npm audit fix 的策略就是升级到最新且已修复的版本,而不是被修复的那一版。(即依赖含有漏洞版本号被修复的版本为)

锁版本号

  1. 再次通过 npm i lodash@4.17.4 安装回含漏洞版本,将当前版本锁住

  1. 运行 npm audit fix ,查看效果,可以看到锁住之后,还是会升级到修复版本

大版本升级测试

  1. 通过 npm i lodash@3.10.1 安装 lodash 3.10.1 版本依赖包,然后运行 npm audit 查看

可以看到相比之前多了一条警告,显示这个包可能是一个breaking changes(重大更改), 对比一下之前安装 loadsh 4.12.4 版本的 npm audit 报告

  1. 接下来运行 npm audit fix 查看报告

可以看到 npm audit fix 对有报警信息的条目此就无能为力了,并且会建议使用 npm audit fix --force,或者手动升级。

  1. 为了再验证是否是大版本问题导致报警,可以再使用 4.0.0版本进行尝试,因为 4.0.0就是 3.10.1 的下一个版本,且大版本已经升级到4.0.0

  1. 运行 npm i lodash@4.0.0 ,安装 lodash 4.0.0 版本

  2. 然后运行 npm audit fix ,发现 lodash 成功升级到 4.17.21

综上所述,可以确定,如果涉及到依赖包的大版本升级,npm audit 会出示一条报警信息,且阻止 npm audit fix 进行自动修复,并建议手动升级或运行 npm audit fix --force


间接依赖漏洞

假设我们现在的依赖路径非常深:@commitlint/cli^7.1.2>@commitlint/load^1.0.1>lodash^3.0.0

因为 @commitlint/loadlodash 的依赖是^3.0.0(>=3.0.0 <4.0.0)4.17.12 不在这个范围,所以我们不能直接通过升级 Lodash 来修复漏洞,这时我们就要向上层依赖进行分析。

假设此时 @commitlint/load 有一个更新版本 @commitlint/load^1.0.2lodash 的依赖是^4.0.0(>=4.0.0 <5.0.0)lodash@4.17.12 在这个依赖范围内,那么修复策略为 npm update @commitlint/load@1.0.2 --depth=2

npm update 只会检查更新顶层的依赖,更新更深层次的依赖版本需要使用 --depth 指定更新的深度。

按照这个逻辑,如果 @commitlint/load 也没有找到可以升级的包,那么再到上层依赖查找,直到找到可以修复漏洞的那个层级的依赖。

这里也证明了为什么有些深层次依赖包无视大版本升级了,是因为他的上层依赖被升级了。


npm audit fix修复策略总结

  • npm audit fix 关于直接依赖的漏洞修复(也就是记录在 package.json中的依赖),如果涉及大版本的升级,则不会直接升级大版本,会在npm audit 报告会展示警告阻止,如果只是涉及到小版本升级,则会修复到当前大版本下最新且已被修复的版本(锁版本的依赖也会被升级)
  • npm audit fix 关于间接依赖( 间接依赖的关系在package.lock.json 有显现,npm audit 报告中也有展示)的升级其实也是遵循了以上的原则,关于为什么有些深层次依赖包无视大版本升级了,是因为他的上层依赖被升级了。

参考文档

docs.npmjs.com/cli/v8/comm…
github.com/advisories
docs.github.com/cn/code-sec…
juejin.cn/post/707823…
www.cnblogs.com/GoodMemoryB…
blog.csdn.net/azl39798585…


转载于:https://juejin.cn/post/7164341054265622541
 

### CentOS 7 安装过程卡住的解决方案 #### 验证ISO镜像完整性 确保所使用的ISO镜像文件无损坏至关重要。可以通过校验下载后的ISO文件哈希值来确认其完整性[^1]。 #### 处理U盘安装问题 对于通过U盘启动安装的情况,如果仅能创建一个小于实际大小的空间用于存储EFI引导文件,则可能是由于选择了错误的方式写入映像所致;建议采用 Rufus 工具并设置为MBR分区方案而非GPT,在Windows环境下准备可启动介质[^2]。 #### 应对特定界面停滞现象 当计算机停留在“Press any key to continue”屏幕时,这通常意味着BIOS未能正确检测到USB设备作为第一个启动项。进入 BIOS 设置菜单调整顺序使 USB 成为首选项可以解决问题。 #### 文件系统兼容性考量 针对无法读取 NTFS 类型磁盘的情形,提前准备好支持 ext4 或其他 Linux 原生格式化的外部驱动器会更加稳妥。另外,某些旧型号电脑可能不具备原生UEFI固件支持,因此选择 Legacy Boot 方式或许有助于顺利完成整个流程。 #### 排除硬件冲突因素 有时新添置的内存条或者其他组件可能会引发兼容性方面的问题从而阻碍操作系统正常加载。移除非必要的附加装置后再试一次也许会有意想不到的效果。 #### 图形化配置阶段异常处理 假如在图形界面上出现了致命性的程序崩溃提示框,不妨切换至纯字符模式继续操作——即按 `Ctrl+Alt+F2` 到 F6 键位之间任选一个组合键离开当前GUI环境,登录命令行终端完成后续步骤。 ```bash # 如果需要重启网络服务以便获取在线资源包 sudo systemctl restart network.service ``` #### 使用最小化安装源减少依赖复杂度 考虑到官方默认仓库里包含大量软件包可能导致yum工具长时间处于忙碌状态甚至陷入僵持局面,推荐挑选精简版Live CD/DVD或者NetInstall ISO来进行初步部署工作,之后再依据需求逐步增添功能模块[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值