これは、なにをしたくて書いたもの?
OWASP Dependency-Check Maven Pluginという、依存ライブラリの脆弱性情報を確認できるプラグインがあるということを知りまして。
dependency-check-maven – Usage
ちょっと、こちらを試してみようかなと。
OWASP Dependency-Check?
OWASP Dependency-Checkというのは、プロジェクトの依存するコンポーネント(ライブラリ)の公開されている既知の脆弱性を
確認してくれるソフトウェアです。
OWASP Dependency Check - OWASP
確認の結果、脆弱性が見つかった場合は該当するCVEのリストが表示されます。
ドキュメントによると、Java、.NETがサポートされており、Python、Ruby、PHP、Node.jsが実験的にサポートされている模様。
dependency-check-maven – Usage
sbtやApache Ant向けのタスクもあったりします。一覧は、こちら。
その他のファイルの種類によるAnalyzerは、こちら。
dependency-check – File Type Analyzers
今回は、Apache Maven向けのものを使って試していきたいと思います。
OWASP Dependency-Check Maven Plugin
というわけで、OWASP Dependency-Check Maven Pluginを使ってみようと思います。
OWASP Dependency-Check Maven Pluginは、OWASP Dependency-Checkというソフトウェア群の、Apache Maven向けのプラグインです。
※そのまま
dependency-check-maven – Usage
使い方やできることはトップページにほぼ書いてありますが、だいたいこんな感じです。
- 「mvn dependency-check:check」による依存ライブラリの脆弱性の確認とレポート作成
- 「mvn dependency-check:aggregate」によるレポート作成(「mvn site」と合わせて使う)
チェック対象のライブラリのスコープは、後でもまた書きますが、testスコープ以外をデフォルトでチェックします。
また、脆弱性情報はNVDのJSONフィードからダウンロードしてデータベースを構築するのですが、特に初回はけっこうな時間が
かかります。
ドキュメントには、初回はダウンロードや情報の更新に10分以上かかることがあると書かれていますが、手元の環境では4分ほどで
実行できました。
2回目以降は省略されますが、定期的にローカルのデータを更新する必要があります(プラグインが行います)。
NVDのデータを4時間ごと、RetireJSを24時間ごとに確認しているみたいです。
試してみる
それでは、早速試してみましょう。
今回の環境は、こちらです。
$ java -version openjdk version "11.0.3" 2019-04-16 OpenJDK Runtime Environment (build 11.0.3+7-Ubuntu-1ubuntu218.04.1) OpenJDK 64-Bit Server VM (build 11.0.3+7-Ubuntu-1ubuntu218.04.1, mixed mode, sharing) $ mvn -version Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T04:00:29+09:00) Maven home: $HOME/.sdkman/candidates/maven/current Java version: 11.0.3, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-11-openjdk-amd64 Default locale: ja_JP, platform encoding: UTF-8 OS name: "linux", version: "4.15.0-54-generic", arch: "amd64", family: "unix"
まずは、pom.xmlにOWASP Dependency-Check Maven Pluginを追加します。
<build> <plugins> <plugin> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> <version>5.0.0</version> </plugin> </plugins> </build>
今回は、お試しとしてApache Struts 2の古いバージョンを持ってきました。
<dependencies> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.34</version> </dependency> </dependencies>
実行は、「mvn dependency-check:check」で行います。
$ mvn dependency-check:check
結果、2つのJARファイルから脆弱性情報が検出されました。
One or more dependencies were identified with known vulnerabilities in owasp-dependency-check-example: struts2-core-2.3.34.jar (pkg:maven/org.apache.struts/struts2-core@2.3.34, cpe:2.3:a:apache:struts:2.3.34:*:*:*:*:*:*:*) : CVE-2018-11776, CVE-2018-1327 commons-fileupload-1.3.2.jar (pkg:maven/commons-fileupload/commons-fileupload@1.3.2, cpe:2.3:a:apache:commons_fileupload:1.3.2:*:*:*:*:*:*:*) : CVE-2016-1000031 See the dependency-check report for more details.
対応するCVEのIDも出力されていますね。
この時、「target/dependency-check-report.html」にレポートが出力されているので確認してみましょう。
より細かい情報を見ることができ、NVDへのリンクも表示してくれたりします。


1番簡単な使い方はこんな感じですね。
主な設定は、こちらを見るとよいでしょう。
dependency-check-maven – dependency-check:check
dependency-check-maven – Goals
また、レポートの読み方はこちらにも書かれています。
dependency-check – How To Read The Reports
ちなみに、最新版に更新すると
<dependencies> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.20</version> </dependency> </dependencies>
脆弱性情報はなくなりましたよ。
[INFO] --- dependency-check-maven:5.0.0:check (default-cli) @ owasp-dependency-check-example --- [INFO] Central analyzer disabled [INFO] Checking for updates [INFO] Skipping NVD check since last check was within 4 hours. [INFO] Skipping RetireJS update since last update was within 24 hours. [INFO] Check for updates complete (7 ms) [INFO] Analysis Started [INFO] Finished Archive Analyzer (0 seconds) [INFO] Finished File Name Analyzer (0 seconds) [INFO] Finished Jar Analyzer (0 seconds) [INFO] Finished Dependency Merging Analyzer (0 seconds) [INFO] Finished Version Filter Analyzer (0 seconds) [INFO] Finished Hint Analyzer (0 seconds) [INFO] Created CPE Index (2 seconds) [INFO] Finished CPE Analyzer (2 seconds) [INFO] Finished False Positive Analyzer (0 seconds) [INFO] Finished NVD CVE Analyzer (0 seconds) [INFO] Finished RetireJS Analyzer (0 seconds) [INFO] Finished Sonatype OSS Index Analyzer (1 seconds) [INFO] Finished Vulnerability Suppression Analyzer (0 seconds) [INFO] Finished Dependency Bundling Analyzer (0 seconds) [INFO] Analysis Complete (4 seconds) [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 12.538 s [INFO] Finished at: 2019-06-29T20:45:53+09:00 [INFO] ------------------------------------------------------------------------
閾値を越えたCVSSスコア以上の脆弱性があった場合は、エラーにする
指定したCVSSスコア以上の脆弱性があった場合は、エラーにすることもできます。ここでは、8以上であればエラーにしてみましょう。
<plugin> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> <version>5.0.0</version> <configuration> <failBuildOnCVSS>8</failBuildOnCVSS> </configuration> </plugin>
Apache Struts 2は、脆弱性を含んだバージョンに戻しておきます。
<dependencies> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.34</version> </dependency> </dependencies>
確認。
$ mvn dependency-check:check
2つ、8以上のものがあったようです。エラーとなりました。
[ERROR] Failed to execute goal org.owasp:dependency-check-maven:5.0.0:check (default-cli) on project owasp-dependency-check-example: [ERROR] [ERROR] One or more dependencies were identified with vulnerabilities that have a CVSS score greater than or equal to '8.0': [ERROR] [ERROR] struts2-core-2.3.34.jar: CVE-2018-11776 [ERROR] commons-fileupload-1.3.2.jar: CVE-2016-1000031 [ERROR] [ERROR] See the dependency-check report for more details.
ちなみに、スコアについてはこちらを参照。

CVSS v2.0とCVSS v3.0でスコアが違ったりするのですが、じゃあどちらで見ているのかというと、両方見ているようです。
「mvn site」に統合する
「mvn site」の結果に統合することもできます。以下のように設定。
<reporting> <plugins> <plugin> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> <version>5.0.0</version> <reportSets> <reportSet> <reports> <report>aggregate</report> </reports> </reportSet> </reportSets> </plugin> </plugins> </reporting> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> <version>3.7.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> <version>3.0.0</version> </plugin> </plugins> </build>
「mvn site」を実行すると、「Project Reports」に「dependency-check:aggregate」が表示されるようになります。

レポート。

特定のスコープの依存関係は、チェック対象外にする
特定のスコープのライブラリを、チェックの対象外にすることができます。
やや作為的ですが、Apache Struts 2の依存関係に含まれているCommons Fileuploadを切り出して、providedスコープにしてみましょう。
<dependencies> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.34</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency> </dependencies>
ドキュメントにもサンプルとしてもあるのですが、今回はprovidedおよびruntimeスコープをチェック対象外にしてみます。
<plugin> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> <version>5.0.0</version> <configuration> <skipProvidedScope>true</skipProvidedScope> <skipRuntimeScope>true</skipRuntimeScope> </configuration> </plugin>
すると、providedスコープであるCommons Fileuploadは、レポートには含まれなくなります(生成されるHTMLからもいなくなります)。
One or more dependencies were identified with known vulnerabilities in owasp-dependency-check-example: struts2-core-2.3.34.jar (pkg:maven/org.apache.struts/struts2-core@2.3.34, cpe:2.3:a:apache:struts:2.3.34:*:*:*:*:*:*:*) : CVE-2018-11776, CVE-2018-1327 See the dependency-check report for more details.
デフォルトがどうなっているかというと、設定に関するページを見ましょう。
dependency-check-maven – Goals
| スコープ | デフォルトでチェック対象に含まれるか | スキップするためのプロパティ |
|---|---|---|
| compile | 含まれる | なし |
| test | 含まれない | skipTestScope |
| runtime | 含まれる | skipRuntimeScope |
| provided | 含まれる | skipProvidedScope |
| system | 含まれる | skipSystemScope |
また、dependencyManagementに記載した内容も確認してくれるようですが、デフォルトではスキップします。この挙動を変更したい場合は、
skipDependencyManagementプロパティを使用します。
ローカルの脆弱性情報を更新する
OWASP Dependency-Check Maven Pluginは、脆弱性情報をデータベースに持っているのですが、これの更新だけを実行することが
できます。
「mvn dependency-check:update-only」です。
$ mvn dependency-check:update-only
dependency-check-maven – dependency-check:update-only
なのですが、今回は更新されませんでした。ログに出ていますが、NVDは4時間、RetireJSは24時間ごとに確認するようです。
[INFO] --- dependency-check-maven:5.0.0:update-only (default-cli) @ owasp-dependency-check-example --- [INFO] Central analyzer disabled [INFO] Checking for updates [INFO] Skipping NVD check since last check was within 4 hours. [INFO] Skipping RetireJS update since last update was within 24 hours. [INFO] Check for updates complete (9 ms
実はこれ、「mvn dependency-check:check」の時にも実行されているので、「update-only」は本当に更新のみです。
ローカルの脆弱性情報をクリアする
また、ローカルに持っている脆弱性情報をクリアするには、以下のコマンドを実行します。
$ mvn dependency-check:purge
ローカルに持っているデータが削除されるので、次回はダウンロードからやり直しになります。
[INFO] --- dependency-check-maven:5.0.0:purge (default-cli) @ owasp-dependency-check-example --- [INFO] Database file purged; local copy of the NVD has been removed [INFO] RetireJS repo removed successfully [INFO] OSS Cache directory purged
ローカルに持っている脆弱性情報とは、どこに?
ここまで書くと、ローカルに持っている脆弱性情報(NVD、RetireJSの情報)をどこに持っているのかが気になります。
答えは、Mavenローカルリポジトリ内です。プラグインとは、違う場所にあるんですね。
$ find $HOME/.m2/repository/org/owasp/dependency-check-data/4.0 -type f $HOME/.m2/repository/org/owasp/dependency-check-data/4.0/odc.mv.db $HOME/.m2/repository/org/owasp/dependency-check-data/4.0/oss_cache/63/a0/63a0e302861c0932765a8fe91c9f2e51bd8d310f $HOME/.m2/repository/org/owasp/dependency-check-data/4.0/oss_cache/bf/f9/bff94743cb2638fcaeac582bb552bf8f92d37708 $HOME/.m2/repository/org/owasp/dependency-check-data/4.0/oss_cache/c7/33/c733b453bc7d85ced5328c2ad8581aaeddc02d5a $HOME/.m2/repository/org/owasp/dependency-check-data/4.0/oss_cache/0c/b4/0cb45bbb31457160fc2912bb6136ede905212009 $HOME/.m2/repository/org/owasp/dependency-check-data/4.0/oss_cache/81/27/812716eca563c1ca19b74b73f9a1fdda59d39c68 $HOME/.m2/repository/org/owasp/dependency-check-data/4.0/oss_cache/e9/04/e904eec7818f16ffa89f58cce17fb986f4f7eaf5 $HOME/.m2/repository/org/owasp/dependency-check-data/4.0/oss_cache/26/fc/26fca3f904f26e5120503afea2c3c84da1f8da2d $HOME/.m2/repository/org/owasp/dependency-check-data/4.0/oss_cache/86/f7/86f71e409e1c0914d5da165d7cf99617cc8e3870 $HOME/.m2/repository/org/owasp/dependency-check-data/4.0/oss_cache/80/c3/80c3ee85a1f342d209d1fe00d90636995fa420e0 $HOME/.m2/repository/org/owasp/dependency-check-data/4.0/oss_cache/d4/36/d4369d9dc8466cf688c01ef731ba1050c56c7b54 $HOME/.m2/repository/org/owasp/dependency-check-data/4.0/oss_cache/3b/4d/3b4da8057f9948ecb69821740f7c548e5d3404aa $HOME/.m2/repository/org/owasp/dependency-check-data/4.0/jsrepository.json
まとめ
OWASP Dependency-Check Maven Pluginを試してみました。
NVDで公開されている脆弱性情報で、依存ライブラリを確認できるのでなかなか便利なのではないでしょうか。
実行する時は、専用のMaven Profileを作るなり、「mvn site」を実行する時なり、通常のビルドとは違うタイミングで定期的に
行う感じになるんでしょうね。
オマケ
初回実行時のログを載せておきます。
[INFO] Central analyzer disabled [INFO] Checking for updates [INFO] NVD CVE requires several updates; this could take a couple of minutes. [INFO] Download Started for NVD CVE - 2003 [INFO] Download Started for NVD CVE - 2002 [INFO] Download Complete for NVD CVE - 2003 (1733 ms) [INFO] Processing Started for NVD CVE - 2003 [INFO] Download Started for NVD CVE - 2004 [INFO] Download Complete for NVD CVE - 2002 (2537 ms) [INFO] Download Started for NVD CVE - 2005 [INFO] Processing Started for NVD CVE - 2002 [INFO] Download Complete for NVD CVE - 2004 (1826 ms) [INFO] Processing Started for NVD CVE - 2004 [INFO] Download Started for NVD CVE - 2006 [INFO] Download Complete for NVD CVE - 2005 (2043 ms) [INFO] Download Started for NVD CVE - 2007 [INFO] Processing Started for NVD CVE - 2005 [INFO] Processing Complete for NVD CVE - 2003 (3473 ms) [INFO] Download Complete for NVD CVE - 2006 (2378 ms) [INFO] Download Started for NVD CVE - 2008 [INFO] Processing Started for NVD CVE - 2006 [INFO] Download Complete for NVD CVE - 2007 (2503 ms) [INFO] Download Started for NVD CVE - 2009 [INFO] Processing Started for NVD CVE - 2007 [INFO] Download Complete for NVD CVE - 2008 (2653 ms) [INFO] Download Started for NVD CVE - 2010 [INFO] Processing Started for NVD CVE - 2008 [INFO] Download Complete for NVD CVE - 2009 (2315 ms) [INFO] Download Started for NVD CVE - 2011 [INFO] Processing Started for NVD CVE - 2009 [INFO] Download Complete for NVD CVE - 2010 (2838 ms) [INFO] Download Started for NVD CVE - 2012 [INFO] Processing Started for NVD CVE - 2010 [INFO] Processing Complete for NVD CVE - 2004 (8680 ms) [INFO] Download Complete for NVD CVE - 2011 (4902 ms) [INFO] Download Started for NVD CVE - 2013 [INFO] Processing Started for NVD CVE - 2011 [INFO] Download Complete for NVD CVE - 2012 (3556 ms) [INFO] Download Started for NVD CVE - 2014 [INFO] Download Complete for NVD CVE - 2014 (2485 ms) [INFO] Download Started for NVD CVE - 2015 [INFO] Download Complete for NVD CVE - 2013 (3924 ms) [INFO] Download Started for NVD CVE - 2016 [INFO] Download Complete for NVD CVE - 2015 (2415 ms) [INFO] Download Started for NVD CVE - 2017 [INFO] Download Complete for NVD CVE - 2016 (2629 ms) [INFO] Download Started for NVD CVE - 2018 [INFO] Download Complete for NVD CVE - 2017 (4628 ms) [INFO] Download Started for NVD CVE - 2019 [INFO] Download Complete for NVD CVE - 2018 (6150 ms) [INFO] Download Complete for NVD CVE - 2019 (2855 ms) [INFO] Processing Complete for NVD CVE - 2005 (28925 ms) [INFO] Processing Started for NVD CVE - 2012 [INFO] Processing Complete for NVD CVE - 2002 (31827 ms) [INFO] Processing Started for NVD CVE - 2014 [INFO] Processing Complete for NVD CVE - 2009 (64650 ms) [INFO] Processing Started for NVD CVE - 2013 [INFO] Processing Complete for NVD CVE - 2007 (73684 ms) [INFO] Processing Started for NVD CVE - 2015 [INFO] Processing Complete for NVD CVE - 2010 (70105 ms) [INFO] Processing Started for NVD CVE - 2016 [INFO] Processing Complete for NVD CVE - 2006 (75705 ms) [INFO] Processing Started for NVD CVE - 2017 [INFO] Processing Complete for NVD CVE - 2011 (72071 ms) [INFO] Processing Started for NVD CVE - 2018 [INFO] Processing Complete for NVD CVE - 2008 (82790 ms) [INFO] Processing Started for NVD CVE - 2019 [INFO] Processing Complete for NVD CVE - 2012 (71014 ms) [INFO] Processing Complete for NVD CVE - 2013 (43451 ms) [INFO] Processing Complete for NVD CVE - 2014 (83339 ms) [INFO] Processing Complete for NVD CVE - 2019 (26732 ms) [INFO] Processing Complete for NVD CVE - 2015 (40873 ms) [INFO] Processing Complete for NVD CVE - 2016 (41670 ms) [INFO] Processing Complete for NVD CVE - 2017 (44982 ms) [INFO] Processing Complete for NVD CVE - 2018 (41352 ms) [INFO] Download Started for NVD CVE - Modified [INFO] Download Complete for NVD CVE - Modified (2673 ms) [INFO] Processing Started for NVD CVE - Modified [INFO] Processing Complete for NVD CVE - Modified (454 ms) [INFO] Begin database maintenance [INFO] End database maintenance (27730 ms) [INFO] Begin database defrag [INFO] End database defrag (37985 ms) [INFO] Check for updates complete (211543 ms) [INFO] Analysis Started [INFO] Finished Archive Analyzer (0 seconds) [INFO] Finished File Name Analyzer (0 seconds) [INFO] Finished Jar Analyzer (0 seconds) [INFO] Finished Dependency Merging Analyzer (0 seconds) [INFO] Finished Version Filter Analyzer (0 seconds) [INFO] Finished Hint Analyzer (0 seconds) [INFO] Created CPE Index (2 seconds) [INFO] Finished CPE Analyzer (2 seconds) [INFO] Finished False Positive Analyzer (0 seconds) [INFO] Finished NVD CVE Analyzer (0 seconds) [INFO] Finished RetireJS Analyzer (0 seconds) [INFO] Finished Sonatype OSS Index Analyzer (1 seconds) [INFO] Finished Vulnerability Suppression Analyzer (0 seconds) [INFO] Finished Dependency Bundling Analyzer (0 seconds) [INFO] Analysis Complete (6 seconds) [WARNING] One or more dependencies were identified with known vulnerabilities in owasp-dependency-check-example: struts2-core-2.3.34.jar (pkg:maven/org.apache.struts/struts2-core@2.3.34, cpe:2.3:a:apache:struts:2.3.34:*:*:*:*:*:*:*) : CVE-2018-11776, CVE-2018-1327 commons-fileupload-1.3.2.jar (pkg:maven/commons-fileupload/commons-fileupload@1.3.2, cpe:2.3:a:apache:commons_fileupload:1.3.2:*:*:*:*:*:*:*) : CVE-2016-1000031 See the dependency-check report for more details. [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 03:54 min [INFO] Finished at: 2019-06-29T19:12:58+09:00 [INFO] ------------------------------------------------------------------------
2回目。
[INFO] --- dependency-check-maven:5.0.0:check (default-cli) @ owasp-dependency-check-example --- [INFO] Central analyzer disabled [INFO] Checking for updates [INFO] Skipping NVD check since last check was within 4 hours. [INFO] Skipping RetireJS update since last update was within 24 hours. [INFO] Check for updates complete (8 ms) [INFO] Analysis Started [INFO] Finished Archive Analyzer (0 seconds) [INFO] Finished File Name Analyzer (0 seconds) [INFO] Finished Jar Analyzer (0 seconds) [INFO] Finished Dependency Merging Analyzer (0 seconds) [INFO] Finished Version Filter Analyzer (0 seconds) [INFO] Finished Hint Analyzer (0 seconds) [INFO] Created CPE Index (1 seconds) [INFO] Finished CPE Analyzer (2 seconds) [INFO] Finished False Positive Analyzer (0 seconds) [INFO] Finished NVD CVE Analyzer (0 seconds) [INFO] Finished RetireJS Analyzer (0 seconds) [INFO] Finished Sonatype OSS Index Analyzer (0 seconds) [INFO] Finished Vulnerability Suppression Analyzer (0 seconds) [INFO] Finished Dependency Bundling Analyzer (0 seconds) [INFO] Analysis Complete (3 seconds) [WARNING] One or more dependencies were identified with known vulnerabilities in owasp-dependency-check-example: struts2-core-2.3.34.jar (pkg:maven/org.apache.struts/struts2-core@2.3.34, cpe:2.3:a:apache:struts:2.3.34:*:*:*:*:*:*:*) : CVE-2018-11776, CVE-2018-1327 commons-fileupload-1.3.2.jar (pkg:maven/commons-fileupload/commons-fileupload@1.3.2, cpe:2.3:a:apache:commons_fileupload:1.3.2:*:*:*:*:*:*:*) : CVE-2016-1000031 See the dependency-check report for more details. [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 5.076 s [INFO] Finished at: 2019-06-29T21:21:42+09:00 [INFO] ------------------------------------------------------------------------