Java プロジェクトの依存ライブラリの脆弱性を OWASP Dependency Check でチェックする
用語
- OWASP
- The Open Waeb Application Security Project、という非営利団体
- Web アプリケーションの安全性を高めるため、脆弱性を調査、公開してる
- dependency-check cli
- OWASP の公開している脆弱性情報を元に、
build.gradle
とかpackage.json
とか
- OWASP の公開している脆弱性情報を元に、
準備
説明ページを読むと、ダウンロードして実行するだけ、ということがわかります。
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
オプションout
オプションexclude
オプション- スキャンから除外するファイルパスを Ant のパスマッチャー形式で指定する
- 複数指定できる
scan
オプション- スキャンするファイルパスを Ant のパスマッチャー形式で指定する
- 複数指定できる
次のオプションは CI で実行するときに指定すると便利だと思います。
failOnCVSS
オプション- 1から10までの CVSS スコアを指定する
- 指定した CVSS スコアより高い(つまり危険度が高い)脆弱性を発見したら失敗する
- 初期値は 11 (つまり失敗しない)
junitFailOnCVSS
オプション
# 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.xml
や build.gradle
ではなく jar
や war
- cli ツールを使う場合は依存ライブラリを一度集めてからスキャンすることになります
- Maven プロジェクトなら
dependency:copy-dependencies
で集めるとかそういう - Gradle プロジェクトは自前でタスクを定義する
- Maven プロジェクトなら
- 面倒なので Maven プラグインや Gradle プラグインを使うほうがいいでしょう
Maven プラグイン
の使用例
OWASP/ Dependency-Check/ documentation/ dependency-check/ Usage
pom.xml
の build
要素に次のような記述を追加します。
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