Snyk と脆弱性だらけのアプリケーションを使ってセキュリティの勉強を始める

## はじめに

普段 Web アプリケーションを開発する上でセキュリティの知識は必須ですが、（個人的に）とっつきづらい領域です。
かと言って「とりあえず動くと思うからリリースしようぜ」とはいきません。

そこで脆弱性だらけのアプリケーションを診断して、出てきた問題を解決していけばゲーム感覚で力がつくのではと思いやってみました。

脆弱性診断には [Snyk](https://snyk.io/jp/) を、脆弱性だらけのアプリケーションには [ockeghem/badtodo](https://github.com/ockeghem/badtodo) を使用します。

## Snyk とは

Snyk とは Google、Salesforce、Atlassian など多くの企業で採用されている脆弱性管理ツールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245792/90301c2b-72ad-c9d0-60e5-1a908472ca0a.png)

私の推しポイントは以下4つです。

### ポイント1：脆弱性に優先順位を付けてくれる

限られたリソースの中で、セキュリティリスクの高い脆弱性を優先的に修正するためにもこの機能は非常にありがたいです。

![スクリーンショット 2023-12-14 15.26.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245792/22334cb6-1cab-d961-a6ee-3f243337b752.png)

### ポイント2：コードの脆弱性も指摘してくれる

使用しているライブラリの脆弱性を見つけてくれるサービスはいくつか知っていましたが、コードの脆弱性まで対応しているサービスを知ったのは Snyk が初めてでした。

![スクリーンショット 2023-12-14 15.27.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245792/a44f5065-b9ec-ac33-539f-829447b77d05.png)

また修正方法も教えてくれます。
イメージやライブラリのバージョンアップの場合は PR の自動作成も行えます。

![スクリーンショット 2023-12-14 15.28.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245792/80360955-3b70-95a8-0b1c-3f46074fa12a.png)

### ポイント3：リアルタイムに脆弱性を指摘してくれる

VS CODE と JetBrains のプラグインが提供されており、CI/CD 上だけではなくコードを書きながらリアルタイムで脆弱性をしてくれます。

開発者体験最高です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245792/3aef4c95-ac6d-5799-9437-8404fb7a1cc3.png)

### ポイント4：IaC のチェックもしてくれる

![blog-iac-terraform-remediation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245792/25fd93cc-de70-1ed9-8e7e-caf4b08b2879.png)

試してみると S3 のバケットの未暗号化も検出できていました。

> [Medium] Non-encrypted S3 Bucket

## 脆弱性だらけのアプリケーション

あとは脆弱性だらけのアプリケーションがあればいけるぞと思いきや、そもそもセキュリティの知識がないと脆弱性だらけのアプリケーションは作れないことに気づきました。

いろいろと探してみると、EGセキュアソリューションズ株式会社がセキュリティを学びたい人向けに脆弱性だらけのアプリケーションを公開してくれていました。

[【EGセキュアソリューションズ株式会社】Webセキュリティを学びたい人向けにCTO徳丸浩制作、脆弱性診断実習用Webアプリケーション「BadTodo」を無償公開](https://prtimes.jp/main/html/rd/p/000000269.000018759.html)

今回はこちらを使用します。

[ockeghem/badtodo](https://github.com/ockeghem/badtodo)

badtodo では IPA が公開している[安全なウェブサイトの作り方第7版](https://www.ipa.go.jp/security/vuln/websecurity/about.html)の脆弱性をすべて網羅しています。

参照：[ockeghem/badtodo: 対応している脆弱性](https://github.com/ockeghem/badtodo/blob/main/docs/vulnerabilities.md)

まさに今回の記事のためにあるようなアプリケーションです。

## 試してみる

期待通りとんでもない数の脆弱性が見つかりました。

![スクリーンショット 2023-12-14 15.25.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245792/0c50d7ed-84ef-b262-16f8-4a57ec2a786d.png)

学習手順は以下の繰り返しです。

1. 脆弱性を修正
1. 動作確認
1. PR をマージ

動作確認部分は e2e テストを書いて自動化したいところですが。

いくつか検出された脆弱性を紹介します。

### ベースイメージの変更

ベースイメージを変えるだけでだいぶ減らせますね。

![スクリーンショット 2024-01-04 0.40.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245792/96c36291-4e2e-9027-c153-78b9c69ba20b.png)

「Open a fix PR」を押すと自動で PR を作成できます。

![スクリーンショット 2024-01-04 4.28.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245792/808150ff-3db5-16e8-97fd-d7da2407f13d.png)

### SQL インジェクション

これは定番ですね。

![スクリーンショット 2024-01-04 4.43.49 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245792/dfa0eaff-51be-1309-11cc-029c3dca4178.png)

他にも XSS やコマンドインジェクションが検出されていました。

## おわりに

検出された脆弱性と badtodo が対応している脆弱性を照らし合わせたところ、すべては検出できてなさそうです。

検出された脆弱性をすべてゼロにするところまで行きたかったのですが間に合いませんでした。
badtodo を goodtodo にするべく、年末年始は家に篭ろうと思います。