包管理和安全扫描

学海无涯,心存高远。

需求分析

  • 每一个项目都会用到很多的第三方依赖,我们需要知晓和保证第三方依赖的安全行。
  • 我们需要定期的更新和检查第三方依赖。

工具介绍

我使用的是开源的 Dependency-Check,Dependency-Check 是一种软件组合分析 (SCA) 工具,它试图检测项目依赖项中包含的公开披露的漏洞。它通过确定给定依赖项是否存在通用平台枚举 (CPE) 标识符来做到这一点。如果找到,它将生成链接到相关 CVE 条目的报告。

目前 Dependency-check 有一个命令行界面、一个 Maven 插件、一个 Ant 任务和一个 Jenkins 插件。核心引擎包含一系列分析器,用于检查项目依赖关系,收集有关依赖关系的信息(在工具中称为证据)。

如何使用

通过命令行运行

从开源仓库中获取 https://github.com/jeremylong/DependencyCheck

以 MAC 为例,我下载的 7.0 版本的 dependency-check-7.0.0-release.zip。解压之后运行以下命令:

1
2
3
4
5
6
7
8
9
10
$ brew update && brew install dependency-check
$ dependency-check -h

// 获取项目路径
$ cd meta-service-api/target
$ pwd
/Users/huapeiliang/IdeaProjects/meta-service-api/target

// 扫描 meta-service-api 并将报告输出到项目路径下
$ dependency-check --out . --scan /Users/huapeiliang/IdeaProjects/meta-service-api/target/meta-service-api.jar

第一次运行可能需要很长时间,它会从 NIST 托管的国家漏洞数据库 (NVD) 下载和处理数据。执行完成后如下所示:

1
2
3
4
5
6
7
...
[INFO] Finished RetireJS Analyzer (1 seconds)
[INFO] Finished Sonatype OSS Index Analyzer (4 seconds)
[INFO] Finished Vulnerability Suppression Analyzer (0 seconds)
[INFO] Finished Dependency Bundling Analyzer (0 seconds)
[INFO] Analysis Complete (35 seconds)
[INFO] Writing report to: /Users/huapeiliang/IdeaProjects/meta-service-api/target/./dependency-check-report.html

从下面的报告里可以看到,dependency-check 一共扫描了 138 项依赖。其中 22 个依赖易受攻击,60 个依赖发现了漏洞。

dependency-check-report.png

在 Summary 的总结列表中清晰的展示了:依赖、漏洞的 ID、所属包、最高严重性、CVE 数量、信赖程度、证据数量

以 aws-java-sdk-core-1.12.215.jar 为例,在 Dependencies 里面可以看到详细的说明。从说明中可以看到,这个问题在 1.12.261 版本中得到了解决,所以最好的解决办法就是升级版本。

dependency-check-report1.png

使用 Maven 存储库 搜索 aws-java-sdk-core 最新版本。不搜不知道,一搜吓一跳,短短几个月里,aws-java-sdk-core 包竟然进行了 60+ 次更新。

Lunix 官方示例:

1
2
$ ./bin/dependency-check.sh -h
$ ./bin/dependency-check.sh --out . --scan [path to jar files to be scanned]

Windows 官方示例:

1
2
> .\bin\dependency-check.bat -h
> .\bin\dependency-check.bat --out . --scan [path to jar files to be scanned]

Maven 插件

需要定期扫描推荐使用这种方式,Dependency-check-maven 使用起来非常简单,可以作为独立插件使用,也可以作为站点插件的一部分使用。该插件需要 Maven 3.1 或更高版本。

重要的是要了解,第一次执行此任务时,它可能需要 20 分钟或更长时间,因为它会从 NIST 托管的国家漏洞数据库 (NVD) 下载和处理数据:https ://nvd.nist.gov

首次批量下载后,只要每隔 7 天至少执行一次插件,更新只需几秒钟。

默认情况下,依赖检查插件绑定到verifyorsite阶段,具体取决于它是否配置为构建或报告插件。下面的示例可以使用mvn verify或在报告示例中执行mvn site。

示例一:在目标目录中创建dependency-check-report.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<project>
    ...
    <build>
        ...
        <plugins>
            ...
            <plugin>
              <groupId>org.owasp</groupId>
              <artifactId>dependency-check-maven</artifactId>
              <version>7.1.1</version>
              <executions>
                  <execution>
                      <goals>
                          <goal>check</goal>
                      </goals>
                  </execution>
              </executions>
            </plugin>
            ...
        </plugins>
        ...
    </build>
    ...
</project>

示例二:创建 dependency-check-report.html 并在 CVSS 大于或等于 8 时使构建失败

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<project>
    ...
    <build>
        ...
        <plugins>
            ...
            <plugin>
              <groupId>org.owasp</groupId>
              <artifactId>dependency-check-maven</artifactId>
              <version>7.1.1</version>
              <configuration>
                  <failBuildOnCVSS>8</failBuildOnCVSS>
              </configuration>
              <executions>
                  <execution>
                      <goals>
                          <goal>check</goal>
                      </goals>
                  </execution>
              </executions>
            </plugin>
            ...
        </plugins>
        ...
    </build>
    ...
</project>