脆弱性検出ツール「Snyk Vulnerability Scanner」 vs. 脆弱性だらけのWebアプリケーション「EasyBuggy」

# はじめに

脆弱性検出ツール[「Snyk Vulnerability Scanner」](https://plugins.jetbrains.com/plugin/10972-snyk-vulnerability-scanner)は、脆弱性だらけのWebアプリケーション[「EasyBuggy」](https://github.com/k-tamura/easybuggy/blob/master/README.jp.md)の脆弱性をどの程度検出できるでしょうか？

![vs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/52332422-03da-5339-606b-6ca9bd3dd568.png)

Snyk Vulnerability Scannerには、以下のIDEのプラグインがありますが、今回はIntelliJのプラグインで検証してみました。

 - Eclipse
 - JetBrainsのIDE（GoLand、IntelliJ、PhpStorm、PyCharm等）
 - Visual Studio
 - Visual Studio Code

なお、検証で行った作業内容もこのページ載せていますので、Snyk Vulnerability Scannerを試してみたい方は参考にしてみて下さい。

## Snyk Vulnerability Scannerとは

Snyk Vulnerability Scannerは、Snyk社が開発している、ソースコードの脆弱性や問題を見つけて修正するIDEのプラグインです。Snyk社については以下の記事を参照して下さい。

https://jp.techcrunch.com/tag/snyk/

Snyk Vulnerability Scannerは、短時間に様々な種類の問題を検出して、カテゴリーに分類します。そして、それだけでなく、実用的な修正のアドバイスも提供します。Snyk Vulnerability Scannerは、大きく分けて以下の4つの問題を検知します。

 - Open Source Security：使用するオープンソースのライブラリーに含まれる既知の脆弱性を検出する。依存関係が定義されたファイル（`pom.xml`など）を検証して、間接的（推移的）な依存関係にあるライブラリーも検証の対象とする
 - Code Security：ソースコードに含まれる脆弱性の可能性を指摘する
 - Code Quality：ソースコードの品質向上の可能性がある箇所を指摘する
 - Open Source Advisor：使用するオープンソースのライブラリーの健全性（GitHubでのStar数やコントリビューター数、issueの対策状況など）をチェックする

:::note warn
Open Source Advisorは以下の画面に示すような情報を提供してくれるようですが、IntelliJ版のSnyk Vulnerability Scannerでは現時点ではEarly Previewとなっており、機能していないように見えました。
:::
![スクリーンショット 2021-12-07 11.06.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/8663c3e5-5ab7-0e7f-8051-8131b3a72eed.png)

## EasyBuggyとは

EasyBuggyは、脆弱性やリソースリークなどを含む、バグだらけのWebアプリケーションです。現時点では、20種類の脆弱性を実装しています。詳しくは[このページ](https://t246osslab.wordpress.com/2017/03/14/easybuggy-%e3%81%ae%e3%83%88%e3%83%aa%e3%82%bb%e3%83%84/)を参照下さい。
![mov_eb.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/49190f35-3ff9-6fbd-0b58-ffe562548d3e.gif)

# 事前準備

## EasyBuggyの開発環境の構築

GitHubからソースコードを取得して、

```bash
$ git clone https://github.com/k-tamura/easybuggy.git
```

IntelliJでそのディレクトリを開いて下さい。このプロジェクトのソースコードをSnyk Vulnerability Scannerで解析します。

![Screenshot from 2021-12-02 17-10-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/2c937cd1-0dcb-39b9-fd18-358ef6157149.png)

なお、EasyBuggyがどのようなアプリケーションであるか軽く確認してみたい方は、次のコマンドを実行してアプリケーションを触ってみて下さい。

```bash
$ cd easybuggy
$ mvn clean install
```

以下のログが出力されたら起動完了です。

```bash
情報: Starting ProtocolHandler ["http-bio-8080"]
```

http://localhost:8080 にアクセスして下さい。以下のような画面が表示されます。

![Screenshot from 2021-12-02 10-05-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/9f9fd2bb-6727-919e-5f67-f311213b205d.png)

このアプリケーションには多数の脆弱性が実装されており、画面の指示に従って操作すると簡単にそれらの脆弱性を攻撃できます。以下の画面はコードインジェクションの脆弱性を攻撃できるページですが、画面下部の青色の部分にその攻撃方法が書いてあります（CPUやメモリーを大量に消費するような機能もありますので、使用する場合は注意して下さい）。

![code_injection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/f5078e4a-8145-18dc-de8b-57a57a561a94.png)

## Snyk Vulnerability Scannerのインストール

では、IntellijniSnyk Vulnerability Scannerをインストールしてみましょう。インストール手順はとても簡単です。

1. まずはIntelliJの上部メニューの中から「File」 > 「Settings」と選択し、 Settings画面を表示します。左メニューの「Pligins」を選択し、検索ボックスに「snyk」と入力します。
![Screenshot from 2021-12-02 00-05-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/621099f0-2b6e-8b67-8935-fb716224a1d7.png)
1. 「Install」ボタンをクリックすると、インストールされます。完了したら「Restart IDE」ボタンが表示されるので、クリックしてIntelliJを再起動して下さい。
![Screenshot from 2021-12-02 00-07-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/43efa750-9872-dc21-0999-ef03fcb1adad.png)
1. IntelliJが再起動すると、画面下部に「Welcome to Snyk!・・・」のメッセージとともに、「Configure Snyk･･･」のリンクが表示されるので、これをクリックします。
![Screenshot from 2021-12-02 00-15-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/ac5b3d2e-fe62-4830-713a-8626fd61626c.png)
1. 画面下部に「Snyk」のタブが表示されるので、これをクリックすると、以下のような画面が表示されるので、「Connect your IDE to Snyk」ボタンをクリックして下さい。
![Screenshot from 2021-12-02 00-15-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/5f35d886-7911-e62f-5313-09973bfa05e0.png)
1. Snyk Vulnerability Scannerを使用するためには、Snykのサイトへの認証が必要になることを示すダイアログが表示されます。そして、ブラウザーにSnykのサイトが表示されます。<br>
![Screenshot from 2021-11-29 21-36-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/9a96fc28-2c2b-aa68-0ed4-4fbbe3260443.png)
1. GitHubなどのSNSアカウントを使ってログインします。
![Screenshot from 2021-12-02 00-19-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/b2227800-28aa-e32a-8303-d31b11347555.png)
1. ここからよくあるOAuthのフローに沿ってログインと認可を行います。まずはユーザー名とパスワードを入力して、SNSへサインインします。
![Screenshot from 2021-12-02 00-20-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/d617043e-2766-5b51-f2c4-73674c2887a7.png)
1. 次はSynkがGitHubアカウントのメールアドレスにアクセスすることへの同意を求める画面が表示されるので、同意します。
![Screenshot from 2021-11-29 21-37-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/8f2f87d7-c55d-dada-7182-3061a5a1f171.png)
1. Snykのサイトへのログインが完了すると、以下のような画面が表示されます。
![Screenshot from 2021-12-02 00-20-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/591b918b-fd07-8d49-c674-3d81d767fb3c.png)
1. 「Authenticate」ボタンをクリックすると、Snyk Vulnerability Scannerが使用できるようになります。
![Screenshot from 2021-12-02 00-20-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/7496d920-5cbc-279a-63c0-ce39047e4072.png)
1. IntelliJの画面にはSynkが使用できるようになったことを示すメッセージとチェックボックスが表示されます。チェックを入れて「Analyze now!」ボタンをクリックすると、脆弱性のスキャンが開始されます。
![Screenshot from 2021-12-02 00-21-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/26d978fd-4899-10d2-a86b-355bdb2e3c08.png)
なお、このチェックボックスが選択できないようになっている場合は、Snykの設定を確認して下さい。IntelliJの上部メニューの中から「File」 > 「Settings」と選択し、 Settings画面を表示します。左メニューの「Tools」の中にある「Snyk」をクリックすると以下の設定画面が表示されます。
![Screenshot from 2021-12-02 00-30-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/f6bfb716-91e1-d959-c937-4aa17beb316a.png)
「Product selection」のセクションのチェックボックスにすべてチェックを入れて下さい。

以上で、インストールは完了です。

# Snyk Vulnerability Scannerによる脆弱性診断

では、Snyk Vulnerability ScannerでEasyBuggyに意図的に作り込まれた脆弱性をいくつ検出できるか試してみましょう。前述の「Analyze now!」ボタンをクリックします。
![Screenshot from 2021-12-02 00-22-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/92fce00a-1b5d-e28f-ae70-dff2f7befb49.png)
規模の大きなプロジェクトであれば、少し時間がかかりますが、EasyBuggyのソースコードはそれほど行数が多くないので、数秒から数十秒程度で完了すると思います。完了すると、以下のように検出した脆弱性の可能性のある箇所が表示されます。
![Screenshot from 2021-12-02 00-24-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/47b51b1a-5094-0f6a-1099-2eb80bdfacaa.png)
下の画面キャプチャーを見てわかるようにSQLインジェクションやコードインジェクション、XSSなどを検出しています。この画面の右下を見ると、XSSの脆弱性への対応を他のOSSではどのようにしているか複数の例を挙げて示してくれています。
![Screenshot from 2021-12-02 00-28-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/234de510-fc00-9efa-2f69-619bb50848e0.png)
ただし、脆弱性の可能性があることを指摘している箇所に脆弱性が無いことも多々あります。例えば、上の画面キャプチャーを見ると、`SQLInjectionServlet`にSQLインジェクションの可能性があることを検知できているのはいいのですが、実際には存在しないXSSの可能性についても指摘しています。

このサーブレットは、画面で入力されたユーザー名とパスワードをSQL（SELECT文）の検索条件に文字列として連結しているので（プレペアドステートメントを使っていないので）、SQLインジェクションの攻撃を受けます。しかし、このサーブレットがレスポンスに返すデータはDBから取得した値を除くと固定値になるので、ユーザーの入力だけでXSSを起こさせることはできません。

とは言え、ユーザーがXSSを起こす文字列をあらかじめDBに登録する機能があれば、XSSを起こせないわけではないので、全く見当違いの指摘というわけでもありません。この手のツールは、あくまでも脆弱性の可能性を指摘するだけであって、指摘があれば全て対応が必要というわけではないことを理解しておく必要があります。

最も多くの指摘があったのは`pom.xml`です。EasyBuggyでは古いライブラリーがたくさん使われているためです。それらのライブラリーだけでなく推移的に依存しているライブラリーで見つかった脆弱性が確認できるのは、Snyk Vulnerability Scannerのとても便利な特徴と言えます。
![Screenshot from 2021-12-02 00-28-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/0744f96f-06d5-80ca-85c0-ff1003cbe8e5.png)
脆弱性だけでなく、リソースリークなどの問題も検出できます。EasyBuggyは脆弱性だけでなく、メモリーリークやデッドロックなどの多数の問題を簡単に発生させることができます。
![Screenshot from 2021-12-02 00-32-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/87877cac-d10d-9721-38b2-2c135aa6a9fc.png)

# 結果

ということで、結果は以下のようになりました。なお、参考までに、2017年の9月に検証したOWASP ZAPの動的解析をした結果も記載しておきます（古い情報なので、今はもっと検知能力が上がっているとは思いますが...）。

|脆弱性|Snyk Vulnerability Scanner|OWASP ZAP|
--------|--------|--------|
|XSS (クロスサイトスクリプティング)|○|○|
|SQLインジェクション|○|○|
|LDAPインジェクション|×|×|
|コードインジェクション|○|×|
|OSコマンドインジェクション|×|×|
|メールヘッダーインジェクション|×|×|
|Nullバイトインジェクション|×|×|
|サイズ制限の無いファイルアップロード|×|×|
|拡張子制限の無いファイルアップロード|×|×|
|オープンリダイレクト可能なログイン画面|○|×|
|ブルートフォース攻撃可能なログイン画面|×|×|
|セッション固定攻撃可能なログイン画面|×|×|
|親切過ぎる認証エラーメッセージ|×|×|
|危険なファイルインクルード|×|○|
|パストラバーサル|×|○|
|意図しないファイル公開|×|×|
|CSRF (クロスサイトリクエストフォージェリ)|×|×|
|クリックジャッキング|×|○|
|XEE (XMLエンティティ拡張)|×|×|
|XXE (XML外部エンティティ)|×|×|

意図的に作り込まれた脆弱性20件のうち、検出できたのは4件でした。OWASP ZAPは悪意のあるリクエストを大量に送信して、Webアプリケーションの脆弱性を見つけるため、Snyk Vulnerability Scannerとはアプローチが違います。一方が検出できないものを、もう一方が検出できているので、両方実施しておく価値は十分にあると考えます。

なお、`pom.xml`に対してパストラバーサルやXXEの脆弱性を検知していましたが、これは意図的に作り込んだ脆弱性ではなく、実際に攻撃できるかどうかも不明なため、結果の〇×の対象外としています。依存ライブラリーの脆弱性を対策する方法は、依存ライブラリーを対策済みのバージョンにアップグレードすることです。

# 最後に

脆弱性を検出した件数は多いとは言えませんが、ソースコードの静的解析でこれだけできれば十分に有益です。非常に簡単な手順で導入と実行ができるので、このプラグインを使わない手はないと思います。また、個人的にはまだEasyBuggyに実装していなかった脆弱性をつくるヒントをもらうのにも有益なツールだと思いました。

なお、今回は、IntelliJ版のSnyk Vulnerability Scannerを使用した検証を行いましたが、前述したようにSnyk Vulnerability ScannerにはEclipse版やPhpStorm版、PyCharm版などがあるので、使い慣れたIDEで実行してみるのもいいでしょう。EasyBuggyにも以下のようにいろいろなバージョンがあります。

- [Spring Bootクローン](https://github.com/k-tamura/easybuggy4sb/blob/master/README.jp.md)
 * 次のコマンドで、[warファイル](https://github.com/k-tamura/easybuggy4sb/releases/download/1.0.9/ROOT.war)をダウンロードして起動できます。

```bash
$ wget https://github.com/k-tamura/easybuggy4sb/releases/download/1.0.9/ROOT.war
$ java -jar ROOT.war
```

- [Kotlin実装Spring Bootクローン](https://github.com/k-tamura/easybuggy4kt/blob/master/README.jp.md)
 * 次のコマンドで、[warファイル](https://github.com/k-tamura/easybuggy4kt/releases/download/1.0.5/ROOT.war)をダウンロードして起動できます。

```bash
$ wget https://github.com/k-tamura/easybuggy4kt/releases/download/1.0.5/ROOT.war
$ java -jar ROOT.war
```

- [Python実装Djangoクローン](https://github.com/k-tamura/easybuggy4django/blob/master/README.jp.rst)
 * 以下のコマンドで起動できます。

```bash
$ git clone https://github.com/k-tamura/easybuggy4django.git
$ cd easybuggy4django/
$ pip install -r requirements.txt
$ python manage.py runserver
```

開発してからかなり時間が経っているため、新しい環境では少し手を入れないと動作しないかもしれませんが、これらのアプリケーションに対して、Snyk Vulnerability Scannerを実行してみるのも楽しいかもしれません。

# 参考資料

 - [Snyk](https://snyk.io/)
 - [Snyk Vulnerability Scanner IntelliJ版](https://plugins.jetbrains.com/plugin/10972-snyk-vulnerability-scanner)
 - [Snyk User Documentation](https://docs.snyk.io/)

# 追記（2021/12/13）

2021年12月10日に公開されたApache Log4jの深刻な脆弱性「CVE-2021-44228」が12/13のスキャンで早くも検出できていました。Snykの脆弱性DBをリアルタイムに参照するから最新の脆弱性も素早く指摘してくれるってことですかね。

![Screenshot from 2021-12-13 11-44-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43869/8dbc1de0-c405-d104-700a-7201c2178831.png)