1. 授权认证
  2. 获取用户个人信息
  3. 项目协同
  4. 代码托管
  5. 持续集成
  6. 制品仓库
  7. 测试管理
  1. 项目协同
  2. 代码仓库
  3. DevOps 实践之旅
  4. 一分钟开始持续集成之旅
  5. 持续部署
  6. 制品库

使用持续集成定期扫描漏洞(NPM Audit)

前言

早在 2019 年 7 月,前端开发者熟悉的著名 Lodash 库被爆出存在高严重性的安全漏洞——“原型污染”漏洞,影响到了超 400 万个项目,该漏洞对使用 Lodash 的用户和服务安全性造成了极大威胁。

同时,在近期,美国新思科技公司发布了《2020 年开源安全和风险分析报告》(OSSRA),该报告中表明经过审计的代码中,75% 的代码库中包含漏洞,49% 的代码库中包含高风险漏洞。

对于这些安全漏洞如果平时不重视它们,一旦出现问题,对我们造成的损失是不可估量的,相当于在你的项目中存在着许多不知什么时候就可能爆炸的炸弹。

对此我们该如何去尽量及早的发现这些问题呢,接下来,我们看一下如何在 CODING 中使用持续集成定期扫描漏洞。

准备工作

创建项目

推送 react 项目到仓库

推荐使用 create-react-app 脚手架搭建,它集成了本地开发单元测试Webpack 构建功能,并且初始化了 git 基本配置,简化了 React 开发流程。

npx create-react-app npm-audit

安装成功后,进入 npm-audit 目录下,执行关联远程仓库命令并推送代码。

git remote add origin https://e.coding.net/coding-public/npm-audit/npm-audit.git
git push -u origin master

创建构建计划

将滚动条拉到最下方,选择【自定义构建过程】

可根据自己的需要更改【构建计划名称】,并选择我们刚推上来的代码仓库,完成后点击下方的【确定】按钮即可

配置构建计划

创建后自动跳转到图形化配置页面,点击自定义构建过程下的小加号

选择 命令 -> 执行 Shell 脚本

在右侧的编辑器里输入 npm i ,该步骤是为了安装依赖

然后再次点击小加号,选择 安全 -> 执行 Npm 审计

填写右侧表单

  • 填写 package.json 所在目录
    由于我们项目的 package.json 就在项目的根目录中,所以无需修改
  • 收集 Npm Audit 报告
    是否需要收集报告,这里我们选择默认值勾选即可

配置完成后,点击右上角【保存】

设置定时触发

对于定时任务的更多细节,可点击 使用定时器实现 Nightly,Weekly Build

回到持续集成首页,选择右上角的定时触发

我们将定时触发时间设置为每周一的 15:30 ,实际项目中可根据自己情况来自定义配置

到达触发时间后,可以看到我们的构建任务已经自动触发了

查看构建结果

点击构建任务

来到了构建详情页面,点击【Npm Audit】,查看扫描结果

可以看到,这个代码是存在漏洞的

由于报告内容较长,截图展示不下,这里我把它贴在下文

[workspace] $ npm audit --json
{
  "actions": [
    {
      "action": "review",
      "module": "yargs-parser",
      "resolves": [
        {
          "id": 1500,
          "path": "react-scripts>webpack-dev-server>yargs>yargs-parser",
          "dev": false,
          "optional": false,
          "bundled": false
        }
      ]
    }
  ],
  "advisories": {
    "1500": {
      "findings": [
        {
          "version": "11.1.1",
          "paths": [
            "react-scripts>webpack-dev-server>yargs>yargs-parser"
          ]
        }
      ],
      "id": 1500,
      "created": "2020-03-26T19:21:50.174Z",
      "updated": "2020-05-01T01:05:15.020Z",
      "deleted": null,
      "title": "Prototype Pollution",
      "found_by": {
        "link": "",
        "name": "Snyk Security Team",
        "email": ""
      },
      "reported_by": {
        "link": "",
        "name": "Snyk Security Team",
        "email": ""
      },
      "module_name": "yargs-parser",
      "cves": [],
      "vulnerable_versions": "<13.1.2 || >=14.0.0 <15.0.1 || >=16.0.0 <18.1.2",
      "patched_versions": ">=13.1.2 <14.0.0 || >=15.0.1 <16.0.0 || >=18.1.2",
      "overview": "Affected versions of `yargs-parser` are vulnerable to prototype pollution.  Arguments are not properly sanitized, allowing an attacker to modify the prototype of `Object`, causing the addition or modification of an existing property that will exist on all objects.   \nParsing the argument `--foo.__proto__.bar baz'` adds a `bar` property with value `baz` to all objects.  This is only exploitable if attackers have control over the arguments being passed to `yargs-parser`.\n",
      "recommendation": "Upgrade to versions 13.1.2, 15.0.1, 18.1.1 or later.",
      "references": "-   [Snyk Report](https://snyk.io/vuln/SNYK-JS-YARGSPARSER-560381)",
      "access": "public",
      "severity": "low",
      "cwe": "CWE-471",
      "metadata": {
        "module_type": "",
        "exploitability": 1,
        "affected_components": ""
      },
      "url": "https://npmjs.com/advisories/1500"
    }
  },
  "muted": [],
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 1,
      "moderate": 0,
      "high": 0,
      "critical": 0
    },
    "dependencies": 1612,
    "devDependencies": 0,
    "optionalDependencies": 16,
    "totalDependencies": 1628
  },
  "runId": "1e9778e4-39c4-41df-806d-ca7556e1cca3"
}

我们来简单解读下这个报告输出的一些信息

  • metadata
"metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 1,
      "moderate": 0,
      "high": 0,
      "critical": 0
    },
    "dependencies": 1612,
    "devDependencies": 0,
    "optionalDependencies": 16,
    "totalDependencies": 1628
  }

metadata 中包含了漏洞的数量信息,vulnerabilities 中标明了每种等级漏洞的数量,info、low、moderate、high、critical 从左到右安全漏洞等级从低到高。

  • actions
"actions": [
    {
      "action": "review",
      "module": "yargs-parser",
      "resolves": [
        {
          "id": 1500,
          "path": "react-scripts>webpack-dev-server>yargs>yargs-parser",
          "dev": false,
          "optional": false,
          "bundled": false
        }
      ]
    }
  ]

actions 中包含了漏洞的修复策略,例 path 告知了我们漏洞的路径信息

  • advisories
"advisories": {
    "1500": {
      "findings": [
        {
          "version": "11.1.1",
          "paths": [
            "react-scripts>webpack-dev-server>yargs>yargs-parser"
          ]
        }
      ],
      "id": 1500,
      "created": "2020-03-26T19:21:50.174Z",
      "updated": "2020-05-01T01:05:15.020Z",
      "deleted": null,
      "title": "Prototype Pollution",
      "found_by": {
        "link": "",
        "name": "Snyk Security Team",
        "email": ""
      },
      "reported_by": {
        "link": "",
        "name": "Snyk Security Team",
        "email": ""
      },
      "module_name": "yargs-parser",
      "cves": [],
      "vulnerable_versions": "<13.1.2 || >=14.0.0 <15.0.1 || >=16.0.0 <18.1.2",
      "patched_versions": ">=13.1.2 <14.0.0 || >=15.0.1 <16.0.0 || >=18.1.2",
      "overview": "Affected versions of `yargs-parser` are vulnerable to prototype pollution.  Arguments are not properly sanitized, allowing an attacker to modify the prototype of `Object`, causing the addition or modification of an existing property that will exist on all objects.   \nParsing the argument `--foo.__proto__.bar baz'` adds a `bar` property with value `baz` to all objects.  This is only exploitable if attackers have control over the arguments being passed to `yargs-parser`.\n",
      "recommendation": "Upgrade to versions 13.1.2, 15.0.1, 18.1.1 or later.",
      "references": "-   [Snyk Report](https://snyk.io/vuln/SNYK-JS-YARGSPARSER-560381)",
      "access": "public",
      "severity": "low",
      "cwe": "CWE-471",
      "metadata": {
        "module_type": "",
        "exploitability": 1,
        "affected_components": ""
      },
      "url": "https://npmjs.com/advisories/1500"
    }
  }

advisories 包含了漏洞的详细信息,我们从中选取几个比较重要的来查看

  1. module_name:模块名
  2. severity:漏洞等级
  3. url:更多详情信息
  4. vulnerable_versions:受到影响的版本
  5. patched_versions:已经修复过的版本

总结

通过本文,希望您能够掌握如何在 CODING 持续集成中使用 Npm Audit 定时扫描漏洞,并且能够看懂它所生成的报告内容,同时也希望能够引起您对安全知识的关注。

上一篇恰当地管理安全凭据
最近更新
感谢反馈有用
感谢反馈没用