🔎

OSSの脆弱性をチェックしよう!Snyk Open Sourceのハンズオンをやってみた

2022/12/19に公開

こんにちは、べこみんです。
この記事は Snyk Advent Calendar 2022 19日目の記事です。

先日Snyk社が開催するハンズオンワークショップに参加しました。
そこで実施したハンズオン資料が下記なのですが

https://github.com/snyk-japan/snyk-sca-sast-workshop

最後の方に何やら続きが…

ということで、さらにSnyk Open Sourceを試してきました。

そもそもSnykとは

皆さんSnykをご存知でしょうか。
Snykは開発者ファーストなセキュリティプラットフォームで、コードやOSS、コンテナやIaCにおける脆弱性のチェック&修正を行うことが出来ます。
また、GitやIDE、CI/CDパイプラインに組み込むことも出来ます。
つまり最近よく聞くシフトレフトを後押ししてくれるセキュリティ製品ですね。

実はSnykには以下4つのセキュリティ製品が含まれています。

  • Snyk Open Source
    • OSSに依存する既知の脆弱性やライセンス問題を自動的に発見&優先順位をつけて修正してくれる
  • Snyk Container
    • コンテナやKubernetesアプリケーションの問題を素早く見つけて、修正するための情報を提供してくれる
  • Snyk IaC
    • IaCのコード内に設定上のセキュリティ問題が含まれていないかチェック&修正するための情報を提供してくれる
    • 本記事執筆時点(2022/12/19)ではTerraform、CloudFormation、Kubernetesに対応
  • Snyk Code
    • 開発中のアプリケーションコードに存在する脆弱性をリアルタイムで発見&修正してくれる

ちなみにこのSnyk、月毎にテスト回数の制限はあるもののすべての製品を無料で利用することが出来ます。興味のある方は是非触ってみてはいかがでしょうか。

Snykの公式サイト(日本語ページ)はこちら↓
https://go.snyk.io/jp.html

Snyk Open Sourceのハンズオンやってみた

それではSnyk Open Sourceのハンズオンをやってみましょう。

https://github.com/papicella/snyk-open-source-workshop

本ハンズオンの内容は英語ですが、ステップが分割されていて操作画面のスクリーンショットも十分なので非常に分かりやすいですね。

手順は下記の通り

  1. 非常に脆弱なアプリケーション「goof」をフォークする
  2. GitHub統合を設定する
  3. 脆弱性を見つける
  4. プルリクエストを使用して修正する
  5. CLIを使用してテストする
  6. exit codeを使っての失敗
  7. Reportsダッシュボードの表示
  8. VS CodeでのIDE統合

手順5までは私が先日ワークショップでやったハンズオンと同じ内容ですね。今回は最初から全てやってみます。

1. 非常に脆弱なアプリケーション「goof」をフォークする

goof、これですね。

https://github.com/snyk-labs/nodejs-goof

これを自分のパブリックなGitHubアカウントにフォークするだけです。

2. GitHub統合を設定する

続いてSnykでGitHubアカウントを連携します。

https://app.snyk.io/

私は既に連携済みなのでここはスキップします。ちなみに、下図のようになっていれば連携完了です。

3. 脆弱性を見つける

Snykの「Add project」ボタンからGitHubを選択します。

すると自分のGitHubリポジトリが並んでいる画面が表示されます。nodes-goofにチェックボックスを入れ、画面右上の「Add Selected repositories」を選択しましょう。

インポートには1分ほど時間がかかるとのことでしたが、私は30秒で完了しました。
インポートログが表示されるのは親切で良いですね。

4. プルリクエストを使用して修正する

Projectsからgoofを選択すると、含まれているファイルが一覧表示されます。
今回はpackage.jsonの脆弱性を見ていきます。

様々な脆弱性が表示されていますが、今回はTypeORMが持つ脆弱性(Prototype Pollution)をGUIから修正してみます。

ちなみに上図のようにこの脆弱性に関する情報が記載されていますが、下図の赤枠部「SNYK-JS=TYPEORM-590152」のリンク先に飛ぶと、snyk Vulnerability DB呼ばれるSnykが持つ脆弱性がまとめられたデータベースで脆弱性の概要や攻撃の種類、防ぎ方などの詳細情報を確認することが出来ます。

Prototype Pollution in typeorm | CVE-2020-8158 | Snyk

また、下図の赤枠部「Learn about this type of vulnerability」というリンク先に呼ぶと、その脆弱性を深く学ぶためのワークショップが用意されています。これ最高のコンテンツですね。

What is prototype pollution? | Tutorial & examples | Snyk Learn

それでは脆弱性一覧のtypeormの右下にあった「Fix this vulnerability」を押してみます。

すると脆弱性を選択し、選択したプルリクを作成するための画面が表示されます。
「Prototype Pollution in typeorm」を選択し、画面下部にある「Open a Fix PR」を選択し、プルリクを作成しましょう。

GitHubを確認すると、確かにプルリクが出来ています。

マージしてみました。

すると、当たり前ですがSnykのコンソール上でpackage.jsonに含まれる「typeorm」の脆弱性を検索してもヒットしませんでした。
ちゃんと修正されていますし、それがSnyk上にも反映されていることが分かりますね。

5. CLIを使用してテストする

ちなみにSnyk Open SourceはCLIでも利用可能です。

Install or update the Snyk CLI - Snyk User Docs

早速インストールしてみましょう。
Snyk CLIはnpmでもyarnでもインストール出来るようです。

$ npm install snyk -g
added 1 package in 1s

$ snyk --version
1.1071.0

次にSnykアカウントでSnyk CLIを承認します。
snyk authを叩くと、下記が表示され、下図のwebページに遷移しました。

$ snyk auth

Now redirecting you to our auth page, go ahead and log in,
and once the auth is complete, return to this prompt and you'll
be ready to start using snyk.

If you can't wait use this url:
https://app.snyk.io/login?token=edfeceaa-fd00-48fa-8d0b-ca7627b114b6&utm_medium=cli&utm_source=cli&utm_campaign=cli&os=darwin&docker=false

Your account has been authenticated. Snyk is now ready to be used.

Authenticateをクリックします。これで利用可能になったようです。

それではSnyk CLIを使ってスキャンしてみます。
スキャンにはsnyk testコマンドを使うようです。オプションの--severity-thresholdを使用すると特定の脅威レベル以上のもののみ検出することが出来ます。

$ snyk test --severity-threshold=critical

Testing /Users/becominn/Documents/goof...
Tested 564 dependencies for known issues, found 2 issues, 3 vulnerable paths.

Issues to fix by upgrading:
  Upgrade adm-zip@0.4.7 to adm-zip@0.4.11 to fix
  ✗ Arbitrary File Write via Archive Extraction (Zip Slip) [Critical Severity][https://security.snyk.io/vuln/npm:adm-zip:20180415] in adm-zip@0.4.7
    introduced by adm-zip@0.4.7

  Upgrade hbs@4.0.4 to hbs@4.1.0 to fix
  ✗ Prototype Pollution [Critical Severity][https://security.snyk.io/vuln/SNYK-JS-HANDLEBARS-534988] in handlebars@4.0.14
    introduced by hbs@4.0.4 > handlebars@4.0.14 and 1 other path(s)

Organization:      *****
Package manager:   npm
Target file:       package-lock.json
Project name:      goof
Open source:       no
Project path:      /Users/becominn/Documents/goof
Licenses:          enabled

確かにGUI上でも表示されていたCriticalの2件が表示されています。
めっちゃ簡単。

ちなみに、snyk monitorコマンドを使うことで、GUIコンソールのように継続的にアプリケーションの脆弱性を監視することも出来るようです。

6. exit codeを使っての失敗

Snykはプロセスの終了時にexit codeというものを出力しているため、そこから実行結果がどうなったのかを知ることが出来ます。
それぞれのexit codeは下記の意味を持ちます。

  • exit codeが"0": Snykがコードに脆弱性を発見せず、ジョブを失敗させずにプロセスを終了したことを意味する。
  • exit codeが"1": Snykがコードに脆弱性を発見し、ビルドに失敗したことを意味する。
  • exit codeが"2": Snykがエラーで終了したことを意味する。詳細情報を表示するには、-dを指定して再実行する。
  • exit codeが"3": Snykがスキャンするサポート対象のプロジェクト/マニフェストを検出できなかったことを意味する。コマンドを再確認するか、コマンドを別のディレクトリで実行する必要がある。

それではハンズオン手順に従って、goofアプリのあるディレクトリの一つ上のディレクトリに下記のようなスクリプトを作成します。

#!/bin/bash

snyk test ./goof --severity-threshold=critical

exit_code=$?

echo ""
echo "snyk cli test exit code equals = $exit_code "
echo ""

if [ $exit_code -eq 1 ]
then
  echo "*****"
  echo "Build step has to fail we found at least 1 CRITICAL issue with the goof application .. "
  echo "****"
fi

権限を変更し、実行します。
実行結果は下記です。

$ sh goof-break-build-for-CRITICAL.sh

Testing ./goof...
Tested 564 dependencies for known issues, found 2 issues, 3 vulnerable paths.

Issues to fix by upgrading:
  Upgrade adm-zip@0.4.7 to adm-zip@0.4.11 to fix
  ✗ Arbitrary File Write via Archive Extraction (Zip Slip) [Critical Severity][https://security.snyk.io/vuln/npm:adm-zip:20180415] in adm-zip@0.4.7
    introduced by adm-zip@0.4.7

  Upgrade hbs@4.0.4 to hbs@4.1.0 to fix
  ✗ Prototype Pollution [Critical Severity][https://security.snyk.io/vuln/SNYK-JS-HANDLEBARS-534988] in handlebars@4.0.14
    introduced by hbs@4.0.4 > handlebars@4.0.14 and 1 other path(s)

Organization:      ******
Package manager:   npm
Target file:       package-lock.json
Project name:      goof
Open source:       no
Project path:      ./goof
Licenses:          enabled

snyk cli test exit code equals = 1 

*****
Build step has to fail we found at least 1 CRITICAL issue with the goof application .. 
****

その他エラー時の詳細は下記ドキュメントを参照してください。
Failing with exit code : Generic Error – Support Portal | Snyk

7. Reportsダッシュボードの表示

手順7のReports機能ですが、どうやらBusinessプラン、Enterpriseプランでのみ利用可能なようです。(※今回私はFreeプランで検証しています。)
今回私はFreeプランで検証しているため、ここはスキップします。

ただ、この画像だけでも良さげな機能だということが伝わりますね。
組織全体で検出されているセキュリティの問題、ライセンスの問題を一つのダッシュボードで確認可能のようで、プロジェクト単位などのフィルターで絞り込むことも出来そうです。


引用: https://github.com/papicella/snyk-open-source-workshop

幸いにもSnyk Advent Calendar 2022 13日目の記事でcramotyさんがこのReports機能を紹介してくださっていたので、そちらの記事を載せておきます。

[Snyk]Reportsを活用してセキュリティチームもアプリ開発セキュリティに貢献しよう - Qiita

8. VS CodeでのIDE統合

最後にVS CodeとSnykを統合しましょう。
ハンズオン手順内で紹介されているVS Codeプラグインはどうやら古いようで、最新版は下記のようです。

Snyk Security - Code, Open Source Dependencies, IaC Configurations - Visual Studio Marketplace

最後に

セキュリティは全員がすべきもの、全員に責任があるものです。
また、開発が終わってからセキュリティテストを行うのではなく、開発前や開発途中にセキュリティテストを行いたいですね。Let's レフトシフト。

本記事ではSnyk Open SourceとSnyk CLIしか触っていませんが、上記にSnykがかなり貢献出来ることが分かりました。
皆さんも是非触ってみてください。

ps うちの猫しか勝たん!ということで応募は「猫しか勝たん賞」でお願いします。

Discussion