安全漏洞之web前端CVE漏洞扫描

简要:随着网络安全要求的提高,作为IT开发人员‘网络安全,信息安全’已是不可忽略的问题,目前市面上已有不少开源的安全扫描工具,但针对web前端插件漏洞扫描的开源扫描工具,目前我还没有接触到,有接触过的在评论区或私信推荐我一下呗,目前的操作手段是进行‘手动扫描’,现根据npm官网已有的扫描策略总结出初级的简要的操作规范,仅供参考。
CVE知识参考:https://baike.baidu.com/item/CVE/9483464?fr=aladdin

Npm audit介绍

  • npm audit 是npm 6新增的一个命令,是npm官网根据CVE相关漏洞库给出的扫描功能命令,可以允许开发人员分析复杂的代码并查明特定的漏洞,该命令会在项目中更新或者下载新的依赖包之后自动运行,如果你在项目中使用了具有已知安全问题的依赖,就收到官方的警告通知。方便开发和测试人员进行一定的漏洞排查,其扫描结果给出了漏洞来源,已经漏洞版本等各种相关的信息,并给出了修补方案,给我们解决漏洞提高了很大的帮助。

  • 近期又新增了CWE漏洞扫描,和CVE扫描同步,无需特别操作。

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

  • 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漏洞扫描结果来源:github.com/advisories GitHub 为了让开发者能够轻松实现安全开发,推出了一个名为 Advisory Database 的开放安全咨询数据库,它专注于为开发者提供高质量、可操作的漏洞信息。它不仅仅为 npm 提供漏洞信息。它可以支持不同的生态

GitHub Advisory Database 漏洞来源

CVE扫描

1、扫描工作准备

扫描对象: node+npm环境的项目
扫描前: 扫描前需对项目使用的镜像进行检查,如果使用的是淘宝或者华为镜像源,将无法使用npm audit的功能,优先使用官方的镜像源。
切换回官方镜像源命令:

npm config set registry https://registry.npmjs.org/
npm config set registry https://registry.npmmirror.org/ 

注意: 一般非官方源都不支持npm audit,npm audit支持npm官方库的插件的安全扫描,这就需要我们在官方源镜像上进行扫描并替换或升级到无漏洞的稳定的插件版本,得到稳定package.json和package-lock.json文件,然后再切换到其他镜像源,再其他镜像源插件库里下载使用package.json和package-lock.json的插件版本。

2、npm audit命令是否可用问题

  • 目前淘宝镜像和华为镜像确认是不支持的,其他私有源库,是否支持的看私有源的相关配置,配置中有一个中间件字段,用于确定是否使用 audit,当
    enabled:false时,无法调用npm audit,当enabled:true时,可以调用npm audit。不同的 npm
    仓库可以决定当前终端是否可以使用 npm audit 命令。
  • 确定使用 npm audit 所需的版本需为 npm@5.10.0 & npm@6以及以后版本(node 版本中,并没有与
    npm@5.10.0 对应的版本,所以推荐使用 npm@6 以后的版本,也就是 Node 版本大于 10.3.0 版本,且不同版本的npm audit的执行结果展示不同。

3、扫描步骤

执行步骤:
1,拉取项目到本地后,删除node_module文件包后,切镜像源到npm官方网站,进行重新安装
执行命令:

npm config set registry https://registry.npmjs.org/
npm install

2,安装npm扫描报告文件:首先安装npm-audit-html,然后输出报告,得到图文界面报告
安装和执行命令:

npm i -g npm-audit-html
npm audit --json | npm-audit-html

图文报告见项目根目录,根目录下新创建了npm-audit.html文件,直接打开即可查看
或执行npm audit 得到命令窗口的扫描结果详情报告
注意:如果扫描报错,可能是多次切换镜像源导致,需强清缓存,再次执行npm audit扫描安全漏洞问题,得到扫描结果
强清缓存执行命令:

npm cache clean –force

注意:解决完漏洞问题后,需恢复项目设定的镜像源:删除node_module(必要时删除package-lock.js文件并强清缓存),将镜像源切回原镜像源,重新npm install 启动项目检查项目是否能正常运行和打包。

漏洞解决方案

简要: 通过图文报告或cmd命令台报告,可以看到漏洞插件相关版本和漏洞描述等信息,图文报告相对更全面,按照相应的分析和建议,把漏洞插件升级到已解决版本或者以上的版本即可。

1、cmd命令执行解析报告

可以看到信息内容:漏洞涉及问题、漏洞危险等级、所在依赖包,依赖包的依赖层级、详细信息 等等信息。

项目路径>npm audit

                       === npm audit security report ===
# Run  npm install --save-dev @vue/cli-service@5.0.8  to resolve 11 vulnerabilities
SEMVER WARNING: Recommended action is a potentially breaking change
  Moderate        Open Redirect in node-forge
  Package         node-forge
  Dependency of   @vue/cli-service [dev]
  Path            @vue/cli-service > webpack-dev-server > selfsigned >
                  node-forge
  More info       https://github.com/advisories/GHSA-8fr3-hfg3-gpgp
  Low             Prototype Pollution in node-forge debug API.
  Package         node-forge
  Dependency of   @vue/cli-service [dev]
  Path            @vue/cli-service > webpack-dev-server > selfsigned >
                  node-forge
  More info       https://github.com/advisories/GHSA-5rrq-pxf6-6jx5
  Moderate        Improper Verification of Cryptographic Signature in
                  `node-forge`
  Package         node-forge
  Dependency of   @vue/cli-service [dev]
  Path            @vue/cli-service > webpack-dev-server > selfsigned >
                  node-forge
  More info       https://github.com/advisories/GHSA-2r2c-g63r-vccr
  High            Improper Verification of Cryptographic Signature in
                  node-forge
  Package         node-forge
  Dependency of   @vue/cli-service [dev]
  Path            @vue/cli-service > webpack-dev-server > selfsigned >
                  node-forge
  More info       https://github.com/advisories/GHSA-x4jg-mjrx-434g
  High            Improper Verification of Cryptographic Signature in
                  node-forge
  Package         node-forge
  Dependency of   @vue/cli-service [dev]
  Path            @vue/cli-service > webpack-dev-server > selfsigned >
                  node-forge
  More info       https://github.com/advisories/GHSA-cfm4-qjh2-4765
  High            Inefficient Regular Expression Complexity in nth-check
  Package         nth-check
  Dependency of   @vue/cli-service [dev]
  Path            @vue/cli-service > cssnano > cssnano-preset-default >
                  postcss-svgo > svgo > css-select > nth-check
  More info       https://github.com/advisories/GHSA-rp65-9cf3-cjxr
  High            Inefficient Regular Expression Complexity in nth-check
  Package         nth-check
  Dependency of   @vue/cli-service [dev]
  Path            @vue/cli-service > @intervolga/optimize-cssnano-plugin >
                  cssnano > cssnano-preset-default > postcss-svgo > svgo >
                  css-select > nth-check
  More info       https://github.com/advisories/GHSA-rp65-9cf3-cjxr
  Low             URL parsing in node-forge could lead to undesired behavior.
  Package         node-forge
  Dependency of   @vue/cli-service [dev]
  Path            @vue/cli-service > webpack-dev-server > selfsigned >
                  node-forge
  More info       https://github.com/advisories/GHSA-gf8q-jrpm-jvxq
  High            glob-parent before 5.1.2 vulnerable to Regular Expression
                  Denial of Service in enclosure regex
  Package         glob-parent
  Dependency of   @vue/cli-service [dev]
  Path            @vue/cli-service > copy-webpack-plugin > glob-parent
  More info       https://github.com/advisories/GHSA-ww39-953v-wcq6
  High            glob-parent before 5.1.2 vulnerable to Regular Expression
                  Denial of Service in enclosure regex
  Package         glob-parent
  Dependency of   @vue/cli-service [dev]
  Path            @vue/cli-service > webpack-dev-server > chokidar >
                  glob-parent
  More info       https://github.com/advisories/GHSA-ww39-953v-wcq6
  Critical        ejs template injection vulnerability
  Package         ejs
  Dependency of   @vue/cli-service [dev]
  Path            @vue/cli-service > webpack-bundle-analyzer > ejs
  More info       https://github.com/advisories/GHSA-phwq-j96m-2c2q
# Run  npm install xlsx@0.18.5  to resolve 3 vulnerabilities
  Moderate        Denial of Service in SheetJS Pro
  Package         xlsx
  Dependency of   xlsx
  Path            xlsx
  More info       https://github.com/advisories/GHSA-g973-978j-2c3p
  Moderate        Denial of Service in SheetJS Pro
  Package         xlsx
  Dependency of   xlsx
  Path            xlsx
  More info       https://github.com/advisories/GHSA-3x9f-74h4-2fqr
  Moderate        Denial of Service in SheetsJS Pro
  Package         xlsx
  Dependency of   xlsx
  Path            xlsx
  More info       https://github.com/advisories/GHSA-8vcr-vxm8-293m
# Run  npm install --save-dev webpack@5.74.0  to resolve 1 vulnerability
SEMVER WARNING: Recommended action is a potentially breaking change
  High            glob-parent before 5.1.2 vulnerable to Regular Expression
                  Denial of Service in enclosure regex
  Package         glob-parent
  Dependency of   webpack [dev]
  Path            webpack > watchpack > watchpack-chokidar2 > chokidar >
                  glob-parent
  More info       https://github.com/advisories/GHSA-ww39-953v-wcq6
# Run  npm install --save-dev @vue/cli-plugin-babel@5.0.8  to resolve 1 vulnerability
SEMVER WARNING: Recommended action is a potentially breaking change
  High            glob-parent before 5.1.2 vulnerable to Regular Expression
                  Denial of Service in enclosure regex
  Package         glob-parent
  Dependency of   @vue/cli-plugin-babel [dev]
  Path            @vue/cli-plugin-babel > webpack > watchpack >
                  watchpack-chokidar2 > chokidar > glob-parent
  More info       https://github.com/advisories/GHSA-ww39-953v-wcq6
# Run  npm install --save-dev @vue/cli-plugin-eslint@5.0.8  to resolve 1 vulnerability
SEMVER WARNING: Recommended action is a potentially breaking change
  High            glob-parent before 5.1.2 vulnerable to Regular Expression
                  Denial of Service in enclosure regex
  Package         glob-parent
  Dependency of   @vue/cli-plugin-eslint [dev]
  Path            @vue/cli-plugin-eslint > globby > fast-glob > glob-parent
  More info       https://github.com/advisories/GHSA-ww39-953v-wcq6
# Run  npm install echarts@5.3.3  to resolve 1 vulnerability
SEMVER WARNING: Recommended action is a potentially breaking change
  Moderate        Prototype Pollution in the merge and clone helper methods
  Package         zrender
  Dependency of   echarts
  Path            echarts > zrender
  More info       https://github.com/advisories/GHSA-fhv8-fx5f-7fxf
found 18 vulnerabilities (2 low, 6 moderate, 9 high, 1 critical) in 1552 scanned packages
  run `npm audit fix` to fix 3 of them.
  15 vulnerabilities require semver-major dependency updates.

2、图文报告解析

在项目根目录下找到npm-audit-html文件,用浏览器打开即可:
图一:图文报告总览:
由图可见:漏洞总数,项目依赖总数,扫描时间;严重、高级、中等、低级、提示漏洞总数;漏洞插件列表。
在这里插入图片描述
图例二:
漏洞描述信息详见列表,1漏洞描述,2漏洞插件名称,3漏洞等级,4漏洞库来源级漏洞编号。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上图中右上角:风险值,风险最大值10分,超过7分为高风险,严重风险的漏洞,必须给予解决

解决方案建议

1、升级插件

概述:解决的主要途径是升级插件版本,项目初期,能升级的就升级。项目中后期,非功能插件直接升级,如果是像编辑器,图表插件等这样功能性强的插件,需考虑升级风险,升级后需做针对性的功能分析和测试。
升级插件参考方案:风险项都可以通过CVE索引迅速地找到相应的修补控制措施,如图例:(中文翻译后的图例)

漏洞插件分类:
1,主要插件(直接依赖插件漏洞):在package.json中配置的插件
2,依赖型插件(间接依赖插件漏洞):一般见于package-lock.json中,依赖插件可能层级很深,如存在漏洞的插件d依赖c,c依赖b,b依赖a

插件升级具体建议:
1,直接使用npm audit fix相关命令一键修复,对直接依赖和间接依赖都有效:npm audit fix 的策略就是升级到最新且已修复的版本,而不是被修复的那一版。(即依赖含有漏洞版本号被修复的版本)
择优选择执行命令:

# 扫描项目漏洞把不安全的依赖项自动更新到兼容性版本
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 fix相关命令不会直接升级大版本,但锁定版本的依赖也会被升级,且深层次的依赖包不受大版本的限制,因为深层次的依赖包的上层依赖已经被升级了

2,手动升级插件

  • 升级主插件,建议先卸载再安装
  • 升级依赖插件一般升级父级插件
(1)直接依赖插件

假设当前我们直接依赖了一个具有安全漏洞的echarts版本:
eg: “dependencies”: {
“echarts”: “^4.1.4”
}
运行npm audit命令查看报告时,可以看到:

# Run  npm install echarts@5.3.3  to resolve 1 vulnerability
SEMVER WARNING: Recommended action is a potentially breaking change
  Moderate        Prototype Pollution in the merge and clone helper methods
  Package         zrender
  Dependency of   echarts
  Path            echarts > zrender
  More info       https://github.com/advisories/GHSA-fhv8-fx5f-7fxf

建议手动运行 npm install echarts@5.3.3

(2)间接依赖漏洞插件

假设我们现在的依赖路径非常深:

@commitlint/cli^7.1.2>@commitlint/load^1.0.1>lodash^3.0.0

因为 @commitlint/load 对 lodash 的依赖是^3.0.0(>=3.0.0 <4.0.0),4.17.12 不在这个范围,所以我们不能直接通过升级 Lodash 来修复漏洞,这时我们就要向上层依赖进行分析。
假设此时 @commitlint/load 有一个更新版本 @commitlint/load^1.0.2 对 lodash 的依赖是^4.0.0(>=4.0.0 <5.0.0),lodash@4.17.12 在这个依赖范围内,那么修复策略为:

 npm update @commitlint/load@1.0.2 --depth=2

按照这个逻辑,如果 @commitlint/load 也没有找到可以升级的包,那么再到上层依赖查找,直到找到可以修复漏洞的那个层级的依赖。
注意:npm update 只会检查更新顶层的依赖,更新更深层次的依赖版本需要使用 --depth 指定更新的深度。这也是深层依赖无视大版本升级的原因。

2、寻找可替代插件

寻找可替代插件,一般也是针对功能性插件,比如图表插件。

3、自行解决漏洞

  1. 根据CVE漏洞库的分析和建议,找到相应的漏洞源,自行进行修补;或等待CVN官方解决后,在进行插件升级。
  2. 绕过漏洞
    针对功能性插件,可根据插件漏洞概述,分析相应的功能点。在使用过程中,不使用相应的功能点,或拦截该功能点,防止漏洞暴露被恶意攻击。

4、不予解决方案输出

若无解决方案,需针对当前漏洞给出漏洞风险评估方案并得到结果反馈。不可瞒报,不可漏报,不可夸大其词或者轻描淡写,尽可能的实事求是。
一般可不予解决标准:风险值<7
漏洞风险不予修改评估方案:内容需包括漏洞风险内容,风险具体描述,涉及功能点,涉及范围,不予解决的预备方案,不予解决理由,理由支撑点,是否有后续的解决计划,计划实施时间点等。

结果归档

概要:每一轮CVE风险扫描,解决最规范的行为是要有相应的文件支撑和记录,方便后续版本的开发和跟进,也方便插件升级后续问题的追溯,做好归档,防止后期被甩锅。尤其是功能插件的升级,比如echarts的大版本升级,部分属性用法会有不同,呈现UI效果也会不同,如果升级插件后没有及时调整代码,也没测功能点,上线后大家一起背锅,而升级插件的人没有及时通知到测试或相关开发人员,大锅就是你的。
归档文件必备:CVE扫描图文报告文件,cmd命令执行文件,漏洞风险插件解决方案文档,漏洞修复后CVE扫描结果等

注意事项
如果项目为初期项目,npm audit扫描出问题,在不改变整体框架的流程的情况下,鉴于项目为框架搭建初期,未进入或刚进入开发阶段,遵从最新最稳定版本性能最优原则,直接使用npm官网插件检查强行升级策略。执行:npm audit fix –force或其他相应的操作。
初期即检,相对于项目中后期在检查来说,大幅度降低后期插件安全检查的工作量,也大幅度缩减了插件升级排查的时间。
如果项目已进入中后期,忌用‘最新最稳定版本性能最优原则’,忌用npm audit fix –force或者类似这样的一键查询强制升级命令,尽可能的按需按优升级,尽可能的减少对项目中已有功能的影响。

参考文档:
Audit npm官方文档(npm-audit)
GitHub Advisory Database
GitHub Advisory Database 中浏览安全公告
搭建npm私有仓库

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值