SnykOSSではじめるコンポーネントの脆弱性管理

#はじめに
この記事は[Snykを使ってセキュリティにまつわる記事を投稿しよう！【PR】Snyk Advent Calendar 2021](https://qiita.com/advent-calendar/2021/snyk)の17日目として投稿しています。

[OWASP Top10の2021年版](https://owasp.org/Top10/)が2021年9月24日に公開されました。[日本語訳もOWASP Japanの有志メンバーにより公開](https://owasp.org/Top10/ja/)されています。OWASP（Open Web Application Security Project）は世界中のWebアプリケーションセキュリティに関するエキスパートが参加する非営利のオープンソースコミュニティです。OWSP Top10はWebアプリケーションの脆弱性に関するカタログで、現時点で最も注意すべき脆弱性をランキング形式で発表しています。

この記事でご紹介するのは、OWASP Top10 2021年版で第6位にランクインしている[「脆弱で古くなったコンポーネント」](https://owasp.org/Top10/ja/A06_2021-Vulnerable_and_Outdated_Components/)の問題とSnyk OSSによる対応です。この脆弱性は2013年・2017年のOWASP Top10では9位でしたが、今回のアップデートでは6位に上昇しています。

#脆弱で古くなったコンポーネントの脅威とは
Webアプリケーションでは多数のコンポーネント（やライブラリ）を利用しています。こうしたコンポーネントの中には、アプリケーションから直接呼び出すものだけでなく、依存関係により自動的にインストールされるものもあります。特に運用フェーズにおいて新たに発見されたコンポーネントの脆弱性を放置しておくのは危険です。

つい最近もJavaで使われるログ出力ライブラリ「Apache Log4j」に悪意のある文字列を記録させることで、任意のリモートコードを実行できるようになる [RCE (Remote Code Execution) の脆弱性](https://logging.apache.org/log4j/2.x/security.html)が見つかっています。log4jは、Javaを使用しているシステムではよく使われるライブラリのため、影響が広範囲に及ぶことが懸念されます。

しかし利用している多数のコンポーネントを把握して、脆弱性情報を収集し、適切なタイミングでパッチを適用したりバージョンアップを行っていくのは大変です。

#Snyk OSSによるコンポーネントのセキュリティ管理
[Snyk Open Source](https://snyk.io/product/open-source-security-management/)（以下、Snyk OSS）はSnyk社が開発している、オープンソースのコンポーネントのセキュリティ管理を自動化するツールです。SnykOSSを使うと、以下のことができるようになります。

- アプリケーションが利用しているコンポーネントとバージョンの把握
- コンポーネントの脆弱性情報を把握し、対応の優先順位を付ける
- コンポーネントのアップデートのプルリクエストを作成することで対応を効率化
- これらのコンポーネントの運用管理（モニタリング）を自動化

SnykにはSnyk OSSの他にも、開発中のコードの脆弱性を指摘してくれる[「Snyk Code」](https://snyk.io/product/snyk-code/)、コンテナイメージの脆弱性管理の[「Snyk Container」](https://snyk.io/product/container-vulnerability-management/)、TerraformなどのInfrastructure as Codeの設定ファイルの問題点を指摘してくれる[「Snyk IaC」](https://snyk.io/product/infrastructure-as-code-security/)などがあります。これらのWebアプリケーション開発・運用局面で気を付けておきたいセキュリティ問題にオールインワンで対応できるのもSnykの魅力の一つかと思います。またVisualStudioCodeやGitHubなど開発者に馴染みのあるツールとの連携もスムーズで、とても開発者フレンドリーなプロダクトだと感じています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291308/43ce0e04-dac8-72ee-3a94-bfddf2c765dc.png">

#Snyk OSSを実際に使ってみる
前置きが長くなりましたが、Snyk OSSを実際に使ってみましょう。今回はOWASPが提供しているWebアプリケーションセキュリティ用の学習用システム[「OWASP Juice Shop」](https://owasp.org/www-project-juice-shop/)を利用してみます。OWASP Juice ShopではSQLインジェクションやクロスサイトスクリプティングなどのWebアプリケーションの脆弱性について学習することができます。なお、OWASP Juice Shopは脆弱性てんこ盛りのWebアプリケーションですので、くれぐれもインターネットなどの公開された環境にデプロイしないでください。

##対象のWebアプリケーションを準備する
[OWASP Juice Shopのレポジトリ](https://github.com/juice-shop/juice-shop)はGitHubで公開されています。Snyk OSSはGitHub以外のレポジトリとも連携できますが、今回はGitHub上に作成したレポジトリとSnyk OSSを連携します。まずはご自身のアカウントでGitHubにログインし、OWASP Juice Shopのレポジトリをforkしておきます。

##Snyk OSSにOWASP Juice Shopプロジェクトを登録する
ここから先はSnyk OSSでの操作になります。Snykのアカウントでログインし、「Add Project」プルダウンをクリックします。表示されたメニューから「GitHub」を選択します。
![img-002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291308/5687cef3-a483-2722-c0e4-1ca47e12d6df.png)

GitHubとの連携が終わると、GitHubのレポジトリ一覧が表示されます。ここからSnykに登録するレポジトリを選択します。今回は先ほどforkした「OWASP Juice Shop」を選択します。レポジトリを選択したら「Add selected repositories」をクリックします。

![img-003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291308/c35a43b3-b7f9-c744-7f60-f3aef08a382e.png)

無事に登録されると、早速、Snykによる脆弱性スキャンが行われ、結果がダッシュボードに表示されます。C、H、M、LとあるのはそれぞれCritical、High､Medium､Lowのことで、検出された脆弱性の重要度がランク分けされて表示されています。

![img-004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291308/f8b5e9fa-1ff6-dbf7-8d8e-7bc8639bfbfd.png)

##SnykOSSによって検出されたコンポーネントの脆弱性をみていく
今回実施したSnyk OSSによるスキャンでは、最も高い重要度（危険度）であるCriticalに分類された脆弱性が4つありました。そのうちの１つを詳しくみていきましょう。検出されたのは「lodash」というコンポーネントです。lodashはJavaScriptのコンポーネントで、値操作の便利な関数群を利用することができます。
![img-005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291308/c3e4a9f4-cf7b-3592-0eec-cd3678307db1.png)

Snyk OSSによると、forkしたOWASP Juice Shopに含まれているlodashのバージョンは2.4.2で、sanitaize-htmlというライブラリとの依存関係で使われていることがわかります。そしてlodashバージョン2.4.2にはプロトタイプ汚染（Prototype Pollution）の脆弱性があると指摘されています。

この脆弱性に関する情報として関連するCWEへのリンク、CVSSスコアが記載されています。ちなみにCWEとは共通脆弱性タイプ一覧（Common Weakness Enumeration）のことで、脆弱性の種類を識別するための共通基準です。CVSSとは共通脆弱性評価システム（Common Vulnerability Scoring System）のことで、脆弱性の深刻度を定量的に比較するためのものです。攻撃実証コード（Exploit Code）が公開されている場合には、Exploit maturityの欄に「PROOF OF CONCEPT」と表示されます。脆弱性対応の緊急度は、こうした情報を元にして判断していきます。

![img-006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291308/113dc525-74d7-307a-f919-cf996dff5e34.png)

##脆弱性のあるコンポーネントを修正する
それでは実際に、lodashライブラリの脆弱性対応を行っていきましょう。Snyk OSSによって提示されたlodashライブラリの脆弱性対応は、依存関係にあるsanitaize-htmlのバージョンを1.7.1にアップデートするというものです。この対応方針で問題なければ、「Fix this vulnerability」をクリックします。すると、この問題を解決するためのプルリクエストがGitHubに送られます。

![img-007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291308/7bfdb52f-be01-da24-3cca-17b142ccd231.png)

Snykによるプルリクエストを確認すると、package.jsonファイルでsanitaize-htmlコンポーネントのバージョンを1.4.2から1.7.1に変更する修正が加えられているのが確認できます。

![img-008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291308/3a4fee5e-53eb-88cd-78b8-235e7658ea9c.png)

変更内容を確認し、GitHubで「Merge pull request」をクリックしてSnykによる修正をマージします。再びSnykのダッシュボードに戻るとOWASP Juice Shopのリポジトリが再スキャンされ、lodashに関する問題は解決していることがわかります。

##Snyk OSSによる脆弱性管理を自動化する
Snyk OSSによるコンポーネントの脆弱性チェックは、日次・週次でスケジュールすることができます。今回は手動でプルリクエストを発行しましたが、新たな脆弱性が発見された場合には自動でプルリクエストを発行するように設定することができます。Snyk OSSには複数のプロジェクトを登録しておくことができますが、チェックの間隔やプルリクエストを自動発行するかどうかは、プロジェクト毎に設定しておくこともできるようです。

![img-009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291308/a71f7ea4-f342-c379-9020-796d599012e2.png)

Snykからのレポートは登録してあるメールアドレスに定期的に届きますが、Slackに通知を出すこともできます。Slackとのインテグレーションは、上部メニューの「Integrations」を選択し、左側の「Notifications」を選択して表示されるメニューから「Slack」を選択します。

![img-010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291308/94d2e2ab-a745-1838-f2e9-824536c7b8ce.png)

Slackの方で通知を投稿するチャネルを選択してWebHook URLを取得したら、SnykのWebhook URLに登録します。

![img-011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291308/bad4e8da-4ff1-73e1-1864-6658593527a4.png)

Snykによる[Slackへの通知](https://docs.snyk.io/features/integrations/notifications-ticketing-system-integrations/slack-integration)は「新しい脆弱性情報が公開された場合」「新しいパッチが提供された場合」になるようです。

![img-012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291308/3098a2c0-afc6-3988-ae87-034cc4b07e36.png)


#さいごに
この記事では、OWASP Top10 2021年版で第6位にランクインしている「脆弱で古くなったコンポーネント」の対応策としてSnyk OSSを活用する方法をご紹介しました。面倒で大変なコンポーネントの脆弱性管理ですが、Snyk OSSを使うことで大分省力化することができそうです。また、Snykを使った脆弱性管理は、イマドキのWebアプリケーションの開発・運用環境との連携がとてもスムーズに行うことができます。Snyk OSSを使ってWebアプリケーションの開発・運用をセキュアにしていき、DevSecOpsを実現していきましょう。