赞
踩
简要:随着网络安全要求的提高,作为IT开发人员‘网络安全,信息安全’已是不可忽略的问题,目前市面上已有不少开源的安全扫描工具,但针对web前端插件漏洞扫描的开源扫描工具,目前我还没有接触到,有接触过的在评论区或私信推荐我一下呗,目前的操作手段是进行‘手动扫描’,现根据npm官网已有的扫描策略总结出初级的简要的操作规范,仅供参考。
CVE知识参考:https://baike.baidu.com/item/CVE/9483464?fr=aladdin
npm audit 是npm 6新增的一个命令,是npm官网根据CVE相关漏洞库给出的扫描功能命令,可以允许开发人员分析复杂的代码并查明特定的漏洞,该命令会在项目中更新或者下载新的依赖包之后自动运行,如果你在项目中使用了具有已知安全问题的依赖,就收到官方的警告通知。方便开发和测试人员进行一定的漏洞排查,其扫描结果给出了漏洞来源,已经漏洞版本等各种相关的信息,并给出了修补方案,给我们解决漏洞提高了很大的帮助。
近期又新增了CWE漏洞扫描,和CVE扫描同步,无需特别操作。
npm audit需要包package.json和package-lock.json文件。它是通过分析 package-lock.json
文件,继而扫描我们的包分析是否包含漏洞的。
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 上公共提交中的漏洞
在 GitHub 上报告的安全公告
扫描对象: 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的插件版本。
执行步骤:
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命令台报告,可以看到漏洞插件相关版本和漏洞描述等信息,图文报告相对更全面,按照相应的分析和建议,把漏洞插件升级到已解决版本或者以上的版本即可。
可以看到信息内容:漏洞涉及问题、漏洞危险等级、所在依赖包,依赖包的依赖层级、详细信息 等等信息。
项目路径>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.
在项目根目录下找到npm-audit-html文件,用浏览器打开即可:
图一:图文报告总览:
由图可见:漏洞总数,项目依赖总数,扫描时间;严重、高级、中等、低级、提示漏洞总数;漏洞插件列表。
图例二:
漏洞描述信息详见列表,1漏洞描述,2漏洞插件名称,3漏洞等级,4漏洞库来源级漏洞编号。
上图中右上角:风险值,风险最大值10分,超过7分为高风险,严重风险的漏洞,必须给予解决
概述:解决的主要途径是升级插件版本,项目初期,能升级的就升级。项目中后期,非功能插件直接升级,如果是像编辑器,图表插件等这样功能性强的插件,需考虑升级风险,升级后需做针对性的功能分析和测试。
升级插件参考方案:风险项都可以通过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相关命令不会直接升级大版本,但锁定版本的依赖也会被升级,且深层次的依赖包不受大版本的限制,因为深层次的依赖包的上层依赖已经被升级了。
假设当前我们直接依赖了一个具有安全漏洞的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
假设我们现在的依赖路径非常深:
@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 指定更新的深度。这也是深层依赖无视大版本升级的原因。
寻找可替代插件,一般也是针对功能性插件,比如图表插件。
若无解决方案,需针对当前漏洞给出漏洞风险评估方案并得到结果反馈。不可瞒报,不可漏报,不可夸大其词或者轻描淡写,尽可能的实事求是。
一般可不予解决标准:风险值<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私有仓库
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。