5分で始めるSnykによるSASTとSCA、Log4Shellの検知をためしてみた

先日、はじめてSnykを使ったのですが、SAST[^1]とSCA[^2]が、簡単に始められましたので、記録として残しておきます。

[^1]: Static Application Security Testingの略で、ソースコードを対象にしたセキュリティテストです。
[^2]: Software Composition Analysisの略で、使用してるライブラリの脆弱性を検査します。

## ユーザ登録をする

ユーザ登録をします。

Free利用は、クレジットカードの登録が不要であり、GitHubアカウントでサインアップ可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/5f45c806-6c38-9ca5-7323-2e20095f5057.png)

## GitHubリポジトリを登録する

GitHubリポジトリを登録します。

Integrationsから、対象を選択します。今回は、GitHubにあるリポジトリに対してSASTとSCAを実施するため`GitHub`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/bab64043-0eaa-8bb3-35ea-46c753b66105.png)

対象のリポジトリを選択します。事前に[OWASP Juice shop](https://github.com/juice-shop/juice-shop)[^3]をクローンしていますので、こちらを選択します。

[^3]: OWASP Juice ShopはOWASPが提供する脆弱性てんこ盛りのやられWebアプリケーションで、Express・Typescriptで実装されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/0011d012-3f93-a8b5-f444-a4121e9e37b7.png)

`Import and scan`をクリックするとインポートとスキャンが始まりますので、スキャンが終わるまでしばらく待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/57ccc2ee-7d7e-2313-ad9a-63859587dbe2.png)

## 結果を確認する

結果を確認します。`Projects`から結果をインポートしたプロジェクトのスキャン結果を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/0ec5ab75-4106-f7f1-00d9-a4d39d0cc6dc.png)

この一覧画面でも、スキャン件数の概要を知ることができますので、複数のプロジェクトに携わっている場合に、スキャン結果を確認する優先度付に一役買いそうです。

### SASTの結果を確認する

SASTの結果は`Code analysis`をクリックすると見ることができます。脆弱性の名称や脆弱性があるコードのが表示されているため、ひと目で脆弱性を認識することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/af56e217-ce94-9eb5-77db-b15b359217d3.png)

脆弱性の詳細を確認するには、`Full details`をクリックします。入出力が追えるようになっているため、脆弱性の影響を把握しやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/0b48ed59-634c-4be4-fc0e-f34ae77fe8ec.png)

`Fix analysis`をクリックすると、脆弱性の詳細情報が表示されます。また、一般的な修正方法を記載されますので、脆弱性の修正に迷うことも少なくなると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/77af1a01-837f-fff3-20e8-b46a5e576e92.png)

### SCAの結果を確認する

SCAの結果は`package.json`をクリックすると見ることができます。

- パッケージ名
- CWE(共通脆弱性タイプ)
- CVSSのスコア
- 問題のあるバージョン番号
- Fixされたバージョン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/52a85da9-ebff-62cb-42b8-9da78c96cc7b.png)

SCAの場合、SASTと異なり半自動で修正することができます。`Fix these vulnerabilities`をクリックするとPRを作成することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/a97ecc06-be06-cc7f-452e-1c129d5ee901.png)

このように、SnykがPRを発行してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/c0f7e507-52b8-7f0a-7b6e-69f304b8e91b.png)

修正内容を確認すると、バージョンが更新されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/15352e33-fbb3-4335-2536-c9db318572df.png)

ここまで自動で対応してくれるので、エンジニアが脆弱性の修正にかけるコストを最小限にでき、本来のタスクに集中しやすくなると思いました。

## Log4Shellが検知できるか試してみる(OWASP ZAP)

Log4Shellが検知できるかを`OWASP ZAP`[^4]試してみました。すでに、`main`リポジトリは2.17.0にバージョンアップ済みでしたが、`master`ブランチが残されていましので、`master`を対象にスキャンします。

[^4]: OWASPが提供するJavaのオープンソースの脆弱性診断ツールです。

https://github.com/zaproxy/zaproxy

実施をしたのですが、スキャン結果に`build.gradle.kts`がありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/5dfb5df5-3b59-4475-b976-b7eb2f41270d.png)

マニュアルを調べてみたのですが、Gitでは`build.gradle.kts`をサポートしていないようです。

> build.gradle.kts files are not currently supported in Git.

https://docs.snyk.io/products/snyk-open-source/language-and-package-manager-support/snyk-for-java-gradle-maven#git-services-for-gradle-projects

ただし、CLIツールでは、サポートされているようなので今後のサポートに期待したいところです。

> Snyk CLI with Gradle: To build the dependency graph, Snyk integrates with Gradle and inspects the dependencies returned by the build. The following manifest files are supported: build.gradle and build.gradle.kts

https://docs.snyk.io/products/snyk-open-source/language-and-package-manager-support/snyk-for-java-gradle-maven#snyk-cli-tool-for-java-projects-ci-cd

## Log4Shellが検知できるか試してみる(Logstash)

OWASP ZAPはうまく検知ができなかったので、今後は`Logstash`[^5]で試してみます。Logstashも最新版はすでに2.17.0バージョンアップ済みでしたが、`7.15`のブランチがありましたので、こちらを対象にスキャンします。

[^5]: Elastic社が提供するログ収集管理ツールでオープンソースで提供されてます。

https://github.com/elastic/logstash

`build.gradle`がしっかり認識されていますが、Critical/Highが0件となっています。(対象: `logstash-core/build.gradle`)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/80e61395-09c0-14f6-92cd-b2de685dadb8.png)

詳細を確認すると、以下の2件しか検出がされていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/33283c0e-7c90-cf77-f88f-7e617f47c71c.png)

`Dependencies`を確認して認識をしている、ライブラリを確認したところ`org.apache.logging.log4j:log4j-core@$`のように、バージョンを認識できていないことがわかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344050/77c445ba-4fbd-42a6-f9e7-f3bf59a55ab2.png)

[ソース](https://github.com/elastic/logstash/blob/7.15/logstash-core/build.gradle#L158)を確認したところ、以下のように変数が使用されおり、どうやら変数の展開がうまくできていないため、`Dependencies`で認識ができていないようです。

```groovy
    implementation "org.apache.logging.log4j:log4j-api:${log4jVersion}"
```

バージョンの変更漏れを防ぐために変数の利用の利用をしている所も多いともいますので、改善されることを期待しています。

## まとめ

特別な知識がなくても簡単に始められ、SCAではPRを自動生成するなど、セキュリテ対策コストを最小限にする仕組みが具備されていると感じました。

ただし、Log4Shellの脆弱性検知を試した限りうまく認識ができない部分があるため、機能改善に期待したいところです。