OWASP  Dependency-Checkを使いLog4Shell(CVE-2021-44228)を検知する

OWASP Dependency-Checkとは、SCA(Software Composition Analysis)[^1] を行うツールの一つで、プロジェクトが依存するライブラリに含まれる脆弱性を検出します。

https://owasp.org/www-project-dependency-check/

CLI / Ant / Maven / Gradle / Homebrew / Jenkins / SonarQube / Circle CI などで使用できる豊富なプラグインが用意されています。

今回は、 Gradle Plugin で、Apache Log4jの任意コード実行の脆弱性(CVE-2021-44228: Log4Shell)[^2] が検知できるを確認してみます。

[^1]: https://owasp.org/www-community/Component_Analysis
[^2]: https://www.jpcert.or.jp/at/2021/at210050.html

# 実行環境

- Gradle: 7.3.3

# 準備

Gradleのプロジェクトを用意します。

```console
$ gradle init

Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 2

Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 3

Split functionality across multiple subprojects?:
  1: no - only one application project
  2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 1

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1

Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]
Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4] 3

Project name (default: example-dependency-check-gradle):
Source package (default: example.dependency.check.gradle):

> Task :init
Get more help with your project: https://docs.gradle.org/7.3.3/samples/sample_building_java_applications.html

BUILD SUCCESSFUL in 28s
2 actionable tasks: 2 executed
```

# Dependency-Checkを有効化する

`app/build.gralde`に以下のプラグイン設定を追加するだけで、動作させることができます。

```groovy
plugins {
  id "org.owasp.dependencycheck" version "6.5.3"
}
```

https://plugins.gradle.org/plugin/org.owasp.dependencycheck

# プラグインが追加されたことを確認する

`./gradlew tasks`を実行し、`OWASP dependency-check tasks`が出力されればプラグインが追加されたことを確認できます。

```console
$ ./gradlew tasks

> Task :tasks

<snip>

OWASP dependency-check tasks
----------------------------
dependencyCheckAggregate - Identifies and reports known vulnerabilities (CVEs) in multi-project dependencies.
dependencyCheckAnalyze - Identifies and reports known vulnerabilities (CVEs) in project dependencies.
dependencyCheckPurge - Purges the local cache of the NVD.
dependencyCheckUpdate - Downloads and stores updates from the NVD CVE data feeds.
```

# 脆弱性データベースを更新する

Dependency-Checkは脆弱性のデータをローカルに保持するようになっています。そのため、データが古いと脆弱性を検知できない場合があるので更新をします。

```console
$ ./gradlew dependencyCheckUpdate
```

# 脆弱性をチェックする

脆弱性をチェックします。

```console
$ ./gradlew dependencyCheckAnalyze

> Task :app:dependencyCheckAnalyze
Verifying dependencies for project app
Checking for updates and analyzing dependencies for vulnerabilities
Generating report for project app
Found 0 vulnerabilities in project app

BUILD SUCCESSFUL in 4s
1 actionable task: 1 executed
```

プロジェクトを作成したばかりなので、何も検知されません。

# Log4Shell(CVE-2021-44228)を検知する

`app/build.gradle`に脆弱性のあるlog4jの利用設定を追加します。

```groovy
dependencies {
    // https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core
    implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.14.1'
}
```

準備ができたので、脆弱性のチェックを行うと、CVE-2021-44228を含む複数の脆弱性を検知することができました。

```console
$ ./gradlew dependencyCheckAnalyze

> Task :app:dependencyCheckAnalyze
Verifying dependencies for project app
Checking for updates and analyzing dependencies for vulnerabilities
Generating report for project app
Found 5 vulnerabilities in project app


One or more dependencies were identified with known vulnerabilities in app:

log4j-core-2.14.1.jar (pkg:maven/org.apache.logging.log4j/log4j-core@2.14.1, cpe:2.3:a:apache:log4j:2.14.1:*:*:*:*:*:*:*) : CVE-2021-44228, CVE-2021-44832, CVE-2021-45046, CVE-2021-45105, CWE-502: Deserialization of Untrusted Data


See the dependency-check report for more details.



BUILD SUCCESSFUL in 4s
1 actionable task: 1 executed
```

# レポートをチェックする

脆弱性をのチェックを実施すると、`app/build/reports/dependency-check-report.html`にHTML形式のレポートが出力されます。サマリや脆弱性の詳細がレポート中に記載されますので、マネジメント層への報告稼働の削減にもなると思います。

## サマリ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/3f46bdc9-d323-ab09-3270-5b9192dbc376.png)

## CVE-2021-44228の詳細

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/40a548fb-9e49-c258-2a95-80f2ae08111e.png)

# さいごに

Gradle Plugin で、Apache Log4jの任意コード実行の脆弱性(CVE-2021-44228: Log4Shell) が検知できるを確認してみましたが、1行追記するだけでライブラリの脆弱性チェックを簡単に実施することができました。

また、レポート出力機能を備えてり、マネジメント層への報告にも活用ができますし、さまざまなプラグインが提供されていますので、CIに組み込むことも容易そうです。

2021/12に発生した、Apache Log4jの任意コード実行の脆弱性(CVE-2021-44228: Log4Shell)の影響でマネジメント層の脆弱性管理への関心も高いと思いますので、導入検討時の参考になれば幸いです。