Java プロジェクトの依存ライブラリの脆弱性を OWASP Dependency Check でチェックする

用語

準備

説明ページを読むと、ダウンロードして実行するだけ、ということがわかります。

Depencency-check cli

Windows (Git Bash) または Linux の場合は次のように準備するといいでしょう。

curl -fsSL --output "${HOME}/Downloads/dependency-check.zip" "https://bintray.com/jeremy-long/owasp/download_file?file_path=dependency-check-5.3.2-release.zip"
mkdir -p "${HOME}/.local"
unzip -d "${HOME}/.local" "${HOME}/Downloads/dependency-check.zip"

dependency-check cli の使用例

最初に実行したときは脆弱性データベースをダウンロードしたりするので、3分くらい余計に時間がかかります。

最低限必要なオプションはこの辺です。

  • format オプション
    • HTML を指定する: Web ブラウザで閲覧できる単一ファイルの HTML レポートを生成します
      • 初期値は HTML だから指定しなくてもいい
    • JUNIT を指定する: いろんな IDE やレポート出力ツールが解釈できる JUnit XML 形式のレポートを生成します
  • out オプション
  • exclude オプション
    • スキャンから除外するファイルパスを Ant のパスマッチャー形式で指定する
    • 複数指定できる
  • scan オプション
    • スキャンするファイルパスを Ant のパスマッチャー形式で指定する
    • 複数指定できる

次のオプションは CI で実行するときに指定すると便利だと思います。

  • failOnCVSS オプション
    • 1から10までの CVSS スコアを指定する
    • 指定した CVSS スコアより高い(つまり危険度が高い)脆弱性を発見したら失敗する
    • 初期値は 11 (つまり失敗しない)
  • junitFailOnCVSS オプション
    • JUnit レポートを生成するときに失敗とみなす CVSS スコアを 1から10 の範囲で指定する
    • 指定した CVSS スコアより高い(つまり危険度が高い)脆弱性を発見したら失敗する
    • 初期値は 0 (つまりなんでも見つけたら失敗する)
# Windows の Git Bash の場合
JAVACMD="${JAVA_HOME}/bin/java" ./.local/dependency-check/bin/dependency-check.bat \
--format HTML \
--out tmp/owasp-report/tsr-van2 \
--exclude '**/.gradle/**' \
--exclude '**/.mvn/**' \
--project 'tsr-van2' \
--scan 'c:/src/tsr-van2/tsr-van2/**/*.jar' \
--scan 'c:/src/tsr-van2/tsr-van2/**/*.js'
# macOS あるいは Linux の場合
./.local/dependency-check/bin/dependency-check.sh \
--format HTML \
--exclude '**/.gradle/**' \
--exclude '**/.mvn/**' \
--out tmp/owasp-report/tsr-van2 \
--project 'tsr-van2' \
--scan 'src/tsr-van2/tsr-van2/**/*.jar' \
--scan 'src/tsr-van2/tsr-van2/**/*.js'

いけてないところ

スキャン対象が pom.xmlbuild.gradle ではなく jarwar

  • cli ツールを使う場合は依存ライブラリを一度集めてからスキャンすることになります
    • Maven プロジェクトなら dependency:copy-dependencies で集めるとかそういう
    • Gradle プロジェクトは自前でタスクを定義する
  • 面倒なので Maven プラグインや Gradle プラグインを使うほうがいいでしょう

Maven プラグイン の使用例

dependency-check-maven

OWASP/ Dependency-Check/ documentation/ dependency-check/ Usage

pom.xmlbuild 要素に次のような記述を追加します。

configuration 要素はリファレンスを見ながらいろいろ設定することになるでしょう。

goal 要素には Maven のゴールを指定します。

                <plugin>
                    <groupId>org.owasp</groupId>
                    <artifactId>dependency-check-maven</artifactId>
                    <version>5.3.2</version>
                    <configuration>
                        <failOnError>false</failOnError>
                        <autoUpdate>true</autoUpdate>
                        <cveValidForHours>24</cveValidForHours>
                        <format>HTML</format>
                        <outputDirectory>${project.build.directory}/owasp-reports</outputDirectory>
                        <scanSet>
                            <fileSet>
                                <directory>${project.basedir}</directory>
                                <includes>
                                    <include>src/main/resources</include>
                                    <include>src/main/webapp</include>
                                </includes>
                            </fileSet>
                        </scanSet>
                        <skipProvidedScope>false</skipProvidedScope>
                        <skipRuntimeScope>false</skipRuntimeScope>
                        <skipDependencyManagement>false</skipDependencyManagement>
                        <assemblyAnalyzerEnabled>false</assemblyAnalyzerEnabled>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>check</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>

次のようなプラグインゴールが利用できるようになります。

  • dependency-check:check
    • プロジェクト単位でレポートを生成します
  • dependency-check:aggregate
    • 全てのプロジェクトをスキャンした単一のレポートを生成します

実行例。

mvn clean dependency-check:check
mvn clean dependency-check:aggregate

Gradle プラグイン の使用例

github.com/jeremylong/dependency-check-gradle

OWASP/ Dependency-Check/ documentation/ Usage

build.gradle に次のような記述を追加します。

plugins {
    id 'org.owasp.dependencycheck' version '5.3.2'
}

dependencyCheck {
    autoUpdate = true
    analyzedTypes = ['jar', 'war', 'js']
    cveValidForHours = 24
    format = 'HTML'
    outputDirectory = "$buildDir/owasp-reports"
    scanProjects = []
    skipProjects = []
    scanSet = [
        'src/main/resources',
        'src/main/webapps',
    ]
}

次のタスクが利用できるようになります。

check タスクや build タスクの依存タスクに追加すれば、特に意識しないで実行できるようになります。

  • dependencyCheckAnalyze
    • プロジェクト単位でレポートを生成します
  • dependencyCheckAggregate
    • 複数のプロジェクトのレポートを集約します
  • dependencyCheckUpdate
    • ローカルディスクにダウンロードした脆弱性データベースを更新します
  • dependencyCheckPurge
    • ローカルディスクにダウンロードした脆弱性データベースを消去します

実行例。

./gradlew dependencyCheckAnalyze