はじめに
脆弱性検出ツール「Snyk Vulnerability Scanner」は、脆弱性だらけのWebアプリケーション「EasyBuggy」の脆弱性をどの程度検出できるでしょうか?
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社については以下の記事を参照して下さい。
Snyk Vulnerability Scannerは、短時間に様々な種類の問題を検出して、カテゴリーに分類します。そして、それだけでなく、実用的な修正のアドバイスも提供します。Snyk Vulnerability Scannerは、大きく分けて以下の4つの問題を検知します。
- Open Source Security:使用するオープンソースのライブラリーに含まれる既知の脆弱性を検出する。依存関係が定義されたファイル(
pom.xml
など)を検証して、間接的(推移的)な依存関係にあるライブラリーも検証の対象とする - Code Security:ソースコードに含まれる脆弱性の可能性を指摘する
- Code Quality:ソースコードの品質向上の可能性がある箇所を指摘する
- Open Source Advisor:使用するオープンソースのライブラリーの健全性(GitHubでのStar数やコントリビューター数、issueの対策状況など)をチェックする
Open Source Advisorは以下の画面に示すような情報を提供してくれるようですが、IntelliJ版のSnyk Vulnerability Scannerでは現時点ではEarly Previewとなっており、機能していないように見えました。
EasyBuggyとは
EasyBuggyは、脆弱性やリソースリークなどを含む、バグだらけのWebアプリケーションです。現時点では、20種類の脆弱性を実装しています。詳しくはこのページを参照下さい。
事前準備
EasyBuggyの開発環境の構築
GitHubからソースコードを取得して、
$ git clone https://github.com/k-tamura/easybuggy.git
IntelliJでそのディレクトリを開いて下さい。このプロジェクトのソースコードをSnyk Vulnerability Scannerで解析します。
なお、EasyBuggyがどのようなアプリケーションであるか軽く確認してみたい方は、次のコマンドを実行してアプリケーションを触ってみて下さい。
$ cd easybuggy
$ mvn clean install
以下のログが出力されたら起動完了です。
情報: Starting ProtocolHandler ["http-bio-8080"]
http://localhost:8080 にアクセスして下さい。以下のような画面が表示されます。
このアプリケーションには多数の脆弱性が実装されており、画面の指示に従って操作すると簡単にそれらの脆弱性を攻撃できます。以下の画面はコードインジェクションの脆弱性を攻撃できるページですが、画面下部の青色の部分にその攻撃方法が書いてあります(CPUやメモリーを大量に消費するような機能もありますので、使用する場合は注意して下さい)。
Snyk Vulnerability Scannerのインストール
では、IntellijniSnyk Vulnerability Scannerをインストールしてみましょう。インストール手順はとても簡単です。
- まずはIntelliJの上部メニューの中から「File」 > 「Settings」と選択し、 Settings画面を表示します。左メニューの「Pligins」を選択し、検索ボックスに「snyk」と入力します。
- 「Install」ボタンをクリックすると、インストールされます。完了したら「Restart IDE」ボタンが表示されるので、クリックしてIntelliJを再起動して下さい。
- IntelliJが再起動すると、画面下部に「Welcome to Snyk!・・・」のメッセージとともに、「Configure Snyk・・・」のリンクが表示されるので、これをクリックします。
- 画面下部に「Snyk」のタブが表示されるので、これをクリックすると、以下のような画面が表示されるので、「Connect your IDE to Snyk」ボタンをクリックして下さい。
- Snyk Vulnerability Scannerを使用するためには、Snykのサイトへの認証が必要になることを示すダイアログが表示されます。そして、ブラウザーにSnykのサイトが表示されます。
- GitHubなどのSNSアカウントを使ってログインします。
- ここからよくあるOAuthのフローに沿ってログインと認可を行います。まずはユーザー名とパスワードを入力して、SNSへサインインします。
- 次はSynkがGitHubアカウントのメールアドレスにアクセスすることへの同意を求める画面が表示されるので、同意します。
- Snykのサイトへのログインが完了すると、以下のような画面が表示されます。
- 「Authenticate」ボタンをクリックすると、Snyk Vulnerability Scannerが使用できるようになります。
- IntelliJの画面にはSynkが使用できるようになったことを示すメッセージとチェックボックスが表示されます。チェックを入れて「Analyze now!」ボタンをクリックすると、脆弱性のスキャンが開始されます。
なお、このチェックボックスが選択できないようになっている場合は、Snykの設定を確認して下さい。IntelliJの上部メニューの中から「File」 > 「Settings」と選択し、 Settings画面を表示します。左メニューの「Tools」の中にある「Snyk」をクリックすると以下の設定画面が表示されます。
「Product selection」のセクションのチェックボックスにすべてチェックを入れて下さい。
以上で、インストールは完了です。
Snyk Vulnerability Scannerによる脆弱性診断
では、Snyk Vulnerability ScannerでEasyBuggyに意図的に作り込まれた脆弱性をいくつ検出できるか試してみましょう。前述の「Analyze now!」ボタンをクリックします。
規模の大きなプロジェクトであれば、少し時間がかかりますが、EasyBuggyのソースコードはそれほど行数が多くないので、数秒から数十秒程度で完了すると思います。完了すると、以下のように検出した脆弱性の可能性のある箇所が表示されます。
下の画面キャプチャーを見てわかるようにSQLインジェクションやコードインジェクション、XSSなどを検出しています。この画面の右下を見ると、XSSの脆弱性への対応を他のOSSではどのようにしているか複数の例を挙げて示してくれています。
ただし、脆弱性の可能性があることを指摘している箇所に脆弱性が無いことも多々あります。例えば、上の画面キャプチャーを見ると、SQLInjectionServlet
にSQLインジェクションの可能性があることを検知できているのはいいのですが、実際には存在しないXSSの可能性についても指摘しています。
このサーブレットは、画面で入力されたユーザー名とパスワードをSQL(SELECT文)の検索条件に文字列として連結しているので(プレペアドステートメントを使っていないので)、SQLインジェクションの攻撃を受けます。しかし、このサーブレットがレスポンスに返すデータはDBから取得した値を除くと固定値になるので、ユーザーの入力だけでXSSを起こさせることはできません。
とは言え、ユーザーがXSSを起こす文字列をあらかじめDBに登録する機能があれば、XSSを起こせないわけではないので、全く見当違いの指摘というわけでもありません。この手のツールは、あくまでも脆弱性の可能性を指摘するだけであって、指摘があれば全て対応が必要というわけではないことを理解しておく必要があります。
最も多くの指摘があったのはpom.xml
です。EasyBuggyでは古いライブラリーがたくさん使われているためです。それらのライブラリーだけでなく推移的に依存しているライブラリーで見つかった脆弱性が確認できるのは、Snyk Vulnerability Scannerのとても便利な特徴と言えます。
脆弱性だけでなく、リソースリークなどの問題も検出できます。EasyBuggyは脆弱性だけでなく、メモリーリークやデッドロックなどの多数の問題を簡単に発生させることができます。
結果
ということで、結果は以下のようになりました。なお、参考までに、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にも以下のようにいろいろなバージョンがあります。
- 次のコマンドで、warファイルをダウンロードして起動できます。
$ wget https://github.com/k-tamura/easybuggy4sb/releases/download/1.0.9/ROOT.war
$ java -jar ROOT.war
- 次のコマンドで、warファイルをダウンロードして起動できます。
$ wget https://github.com/k-tamura/easybuggy4kt/releases/download/1.0.5/ROOT.war
$ java -jar ROOT.war
- 以下のコマンドで起動できます。
$ git clone https://github.com/k-tamura/easybuggy4django.git
$ cd easybuggy4django/
$ pip install -r requirements.txt
$ python manage.py runserver
開発してからかなり時間が経っているため、新しい環境では少し手を入れないと動作しないかもしれませんが、これらのアプリケーションに対して、Snyk Vulnerability Scannerを実行してみるのも楽しいかもしれません。
参考資料
追記(2021/12/13)
2021年12月10日に公開されたApache Log4jの深刻な脆弱性「CVE-2021-44228」が12/13のスキャンで早くも検出できていました。Snykの脆弱性DBをリアルタイムに参照するから最新の脆弱性も素早く指摘してくれるってことですかね。