专栏名称: 前端早读课
我们关注前端,产品体验设计,更关注前端同行的成长。 每天清晨五点早读,四万+同行相伴成长。
目录
相关文章推荐
前端早读课  ·  【第3405期】了解npm audit以及修复漏洞 ·  昨天  
前端大全  ·  这样的Git规范,Leader看了都说好! ·  2 天前  
前端早读课  ·  【早阅】防止针对 JavaScript ... ·  5 天前  
NE时代新能源  ·  【NE云之声】HPD功率模块大展示! ·  6 天前  
NE时代新能源  ·  【NE云之声】HPD功率模块大展示! ·  6 天前  
前端大全  ·  Chrome 129:正式推出原生的 ... ·  1 周前  
51好读  ›  专栏  ›  前端早读课

【第3405期】了解npm audit以及修复漏洞

前端早读课  · 公众号  · 前端  · 2024-11-01 08:00

正文

前言

主要介绍了如何使用 npm audit 命令在 Node.js 项目中检查和修复依赖中的安全漏洞,并提供了解决这些问题的策略和最佳实践。今日前端早读课文章由 @飘飘翻译分享。

正文从这开始~~

在构建 Node.js 项目时,你通常会依赖第三方库来加快开发速度并利用社区支持的解决方案。例如,你可能会使用 axios 这样的包来发起 HTTP 请求,或者使用 express 来设置服务器。这些库本身通常也依赖于其他包才能正常工作。这种依赖关系链可能会变得复杂,并且任何包中的漏洞都可能使您的应用程序面临安全风险。

【第3354期】使用 eslint-plugin-depend 移除无用的 NPM 包

这就是 npm audit 发挥作用的地方。

audit 问题是指什么?

在典型的 Node.js 项目中,当你安装一个包时,你不仅会引入该特定的库,还会引入其整个依赖树。例如:

  • 如果你安装了 axios ,它依赖于像 follow-redirects 和 form-data 这样的包。

  • 反过来,form-data 可能依赖其他包,如 combined-stream, asynckit 等等。

这会导致了一个多级依赖树,其中可能包含数百甚至数千个包。由于你可能不会直接处理所有这些子依赖项,因此很难手动检查每个包是否存在漏洞。

audit 问题指的是在你的直接依赖项(例如,axios 或 express)或它们的子依赖项中发现的已知漏洞。npm audit 会根据 npm 维护的公共漏洞数据库,对整个依赖树进行安全漏洞扫描。

【早阅】npm vs npx - 基本区别是什么?

npm audit 做什么?

npm audit 命令通过将项目的依赖项与已知漏洞数据库进行比较来检查项目的安全问题。它扫描 package.jsonpackage-lock.json 和 node_modules 文件夹中的任何易受攻击的包。

它检查:

  • 安全漏洞:这些可能是代码缺陷、废弃的功能,或不安全的做法,使您的应用程序容易受到安全攻击。

  • 严重等级级别:根据对应用程序可能造成的影响,漏洞被分为低、中、高或严重等不同级别。

在运行完 npm audit 之后,将看到一份详细的报告,其中包含以下信息:

  • 易受攻击的包:包含漏洞的包。

  • 易受攻击版本:标记为不安全的包的版本。

  • 修补版:用于解决该问题的版本。

  • 严重程度:该漏洞是低级、中级、高级还是关键性漏洞。

  • 路径:显示了导致存在漏洞的包的依赖链。

  • 建议 URL:指向 npm 咨询页面的链接,提供更多有关漏洞的信息。

以下是一个 npm 审计报告的示例:
 # npm audit report

minimatch <3.0.5
Regular Expression Denial of Service - https://github.com/advisories/GHSA-f8q6-p94x-37v3
fix available via `npm audit fix`
node_modules/minimatch
glob 3.2.3 - 5.0.15
Depends on vulnerable versions of minimatch
node_modules/glob
express >=4.13.0
Depends on vulnerable versions of glob
node_modules/express

这份报告告诉你:

  • 这个名为 minimatch 的包的版本小于 3.0.5 ,它存在正则表达式拒绝服务漏洞。

  • 易受攻击的 minimatch 包被 glob 使用,它是 express 的子依赖项。

npm audit 的严重性级别

npm 生态系统中的漏洞根据它们可能带来的风险被分为不同严重程度等级:

  • 低:不太可能被轻易利用的轻微漏洞。

  • 中等:可能会被利用但影响有限的漏洞。

  • 高:如果被利用,可能会造成严重损害的重大漏洞。

  • 严重:容易被利用的严重漏洞,可能导致数据泄露或服务器被接管等严重问题。

在上述示例中, minimatch 包被标记为存在 Regular Expression Denial of Service (ReDoS) 漏洞,如果攻击者构造了一个恶意的正则表达式,这可能会是一个严重的性能问题。

解决 npm audit 问题

npm audit 工具不仅会告诉你有哪些漏洞,还会为你提供修复漏洞的方法。

运行 npm audit fix:对于许多漏洞, npm audit 提供了自动修复功能。你可以运行:

 npm audit fix

此命令尝试将你的软件包升级到非易受攻击的版本,同时保持向后兼容性。它将安装遵循语义版本控制的补丁版本(patch 版本)的软件包,这意味着你不必担心破坏性更改。

使用 npm audit fix —force: 在某些情况下,自动修复可能需要破坏性更改,因为依赖项的更高版本会大幅提升主版本号。要修复这些问题,您可以使用 --force 选项:

 npm audit fix --force

这将尝试安装包的最新版本,即使这意味着主要版本更新,这可能会破坏你现有代码的兼容性。在使用 --force 时要小心,因为它可能会安装可能导致代码兼容性问题的更新。

在前面的例子中,假设要修复 minimatch 漏洞,可能需要升级到 glob 的更高版本,这可能会为 express 引入破坏性更改。在这种情况下, npm audit fix --force 将执行必要的更新,但你需要彻底测试你的项目以确保所有内容仍然可以正常工作。

为什么在修复后 npm audit 问题后仍然存在

你可能会遇到这样的情况,即使按照 npm audit 给出的建议修复了问题,漏洞仍然存在。这可能会让人感到沮丧,但通常是由于更深层次的嵌套依赖或包元数据未解决的问题导致的。让我们一起探讨当 npm audit fix 不起作用时,如何解决这些问题。

解决持续存在的 npm audit 问题

1、移除 package-lock.json :有时,锁定文件可能是遗留依赖问题的原因。首先删除 package-lock.json 文件。

2、移除 node_modules :删除 node_modules 目录可确保所有依赖项重新安装并更新

3、获取该易受攻击软件包的最新稳定版本:为了确保您正在使用安全版本,请检查该易受攻击软件包的最新稳定版本。你可以使用 npm 命令进行此操作:

 npm show minimatch version

4、添加 'overrides' 部分:如果您尚未这样做,可以使用 npm 的 "overrides" 功能(从 npm 8 及以上版本中可用)来强制安装特定版本的易受攻击的包。这样可以确保 npm 在所有依赖项中安装非易受攻击的包版本。在你的 package.json 中,添加或更新 overrides 部分。例如,为了确保 minimatch 使用安全版本,可以添加:

 "overrides": {
"minimatch": "10.0.1"
}

5、重新安装依赖项:在更新了 overrides 部分并确保 package-lock.json 和 node_modules 被移除后。运行 npm install 重新安装已更新的依赖项。

6、处理嵌套依赖:在某些情况下,受影响的包可能深嵌在依赖树中(即,它是另一个包的子依赖),您可能需要在 package.json 中维护这种嵌套层次结构,以确保覆盖正确应用。例如,如果 minimatch 是像 glob 这样的子包的依赖,而 glob 被 express 使用,您可以添加如下覆盖:

 "overrides": {
"minimatch": {
"glob": "^7.1.7",
"another-package": "^1.0.0"
}
}

这种结构确保了覆盖应用于依赖树中所有 minimatch 的实例,即使它们是嵌套的。

通过遵循这些步骤,您可以在运行 npm audit fix 之后解决持续存在的 npm audit 问题。这种方法可以确保即使在深度嵌套的依赖关系中,也能通过在整个依赖树中强制使用安全版本的包来解决漏洞。

预防措施:管理依赖性的最佳实践

1、定期运行 npm audit:养成定期运行 npm audit 的习惯,尤其是在添加新依赖或在将代码推送到生产环境之前。这有助于早期发现漏洞并防止它们积累。

2、保持依赖项更新:使用工具如 npm outdated 或 npm-check 查看是否存在可用的更新版本或更安全的依赖项。保持依赖项更新是减少漏洞暴露的关键步骤。

3、使用 npm audit --production :如果某些漏洞仅与开发依赖项(如构建工具或测试框架)相关,可以通过运行以下命令将审计范围缩小到仅包含生产依赖项:

 npm audit --production

这可以确保你只看到可能影响您部署的应用的问题。

4、切换到活跃维护的库:如果你正在使用一个不再活跃维护且存在未解决安全问题的库,考虑切换到一个更活跃维护的替代品。例如,如果 jsonwebtoken 不再维护且存在关键漏洞,你可能会切换到另一个处理 JWT 的流行库,如 node-jose 。

结论

npm audit 是识别和修复 Node.js 项目中安全漏洞的不可或缺的工具。它通过突出显示已知的安全问题,帮助您在复杂的直接和间接依赖关系之间导航,并指导您找到解决方案。

然而,如果不引入破坏性更改,自动修复可能并不总是可行的,有时即使更新了,漏洞也可能仍然存在。了解 npm 依赖项的工作原理、保持包版本的最新状态,以及知道何时应用手动补丁,对于确保 Node.js 应用程序的安全性大有裨益。

通过定期审计、自动化修复和仔细打补丁的主动方式进行依赖管理,可以确保应用程序的安全性和及时更新,从而将安全漏洞的风险降至最低。

关于本文
译者:@飘飘
作者:@Niraj Chauhan
原文:https://www.niraj.life/blog/understanding-npm-audit-fixing-vulnerabilities-nodejs/

这期前端早读课
对你有帮助,帮” 
 “一下,
期待下一期,帮”
 在看” 一下 。