はじめに
ライブラリの依存関係やソースコードの脆弱性を診断するSCA$^{※1}$/SAST$^{※2}$ツールとして Snyk Open Source/Snyk Code を試してみたので、その備忘録
- 必要プログラム(Snyk以外)の確認とSnykのインストール
- Snyk-labで提供されている被検知用プログラム(Node.js)のフォーク
- CLIでのテスト実行
- Webでのテスト実行
- Workflowでのテスト実行
※1 SCA(Software Composition Analysis) とは、アプリケーションが利用しているライブラリや依存関係の脆弱性を検査する手法
※2 SAST(Static Application Security Testing) とは、プログラムを実行せずに、ソースコードを解析して脆弱性を見つける手法
※今回使用したサンプルは、意図的に脆弱な依存関係を含んでいる為、多数の脆弱性が検出される
※本記事では脆弱性の検出と基本的な対応手順の確認が目的
対象読者
- Snyk の初学者(自分も含めて)
使用環境、アプリケーション、サービス
- Windows 11 (25H2)
- Powershell 7
- git
- github
- snyk$^{※1}$
- node/npm$^{※2}$
※1 事前のアカウント作成が必要(Freeプランあり、今回Freeプラン利用)
※2 被検知環境の構築で必要
手順
1. Powershell のバージョン確認
$PSVersionTable.PSVersion
バージョン5 でも後続の操作は可能と思われるが、今回は最新のPowershellを利用する。
バージョン7 は以下の備忘を参照。
2. 必要プログラムの確認(Snyk以外)
Powershell上で以下コマンドにて必要なプログラムがインストールされているかを確認して、最新のバージョンをインストールしておく
※インストールされていない場合はコマンドエラーとなる
git --version #git のバージョン確認
node --version #node.js のバージョン確認
npm --version #npm のバージョン確認
git1
node および npm2 ←被検知プログラムにて必要
3. Snykのインストール
npmコマンドにてSnykのインストールを実行
npm install -g snyk
実行すると以下のような出力となる。
warnは今回のとは関係がないので無視

Synkインストールバージョンの確認
今回のは1.1301.2
snyk --version
4. Snyk-labで提供している被検知プログラム(Node.js)のフォーク
i. ブラウザで以下URLを開き、Forkをクリック(githubログイン済であれば iii.へ)
https://github.com/snyk-labs/nodejs-goof
5. リポジトリのクローンと依存関係インストール
Snyk用のフォルダを作成し、forkしたリポジトリのcloneを作成し、必要なライブラリを取得する
xxxxx は自分のgithubアカウント
mkdir c:\snyk
cd c:\snyk
git clone https://github.com/xxxxx/nodejs-goof.git
cd nodejs-goof
npm install
6. Snyk CLIの実行
Snykへの認証を行い、脆弱性テストを実行する
snyk auth #認証
snyk test #SCA
snyk code test #SAST
snyk auth コマンド実行後にgithubとのOAuth連携が始まる
GitHubアカウントの権限をSnykに許可するための認可処理(OAuth)が実行される

snyk auth コマンド実行後のPowershell画面

snyk test コマンド実行後のPowershell画面
多数のパッケージに脆弱性が検知された結果が出力されている。


snyk code test コマンド実行後のPowershell画面
コードの脆弱性が22件(High:3/Medium:12/Low:7)指摘されている


7. 脆弱性の対応(ライブラリ更新)
snyk auth の脆弱性結果の先頭にあった adm-zip@0.5.2 について対応してみる

cd C:\snyk\nodejs-goof
cat package.json
snyk auth で脆弱性の検知されたライブラリ adm-zip@0.4.7 が指定されている

依存関係の確認とライブラリの更新
npm ls adm-zip
npm install adm-zip@0.5.2
実行結果
ライブラリ更新の確認と snyk test コマンドの再実行
npm ls adm-zip
snyk test
実行結果
ライブラリは adm-zip@0.5.2 が出力されて正常に更新されている
テスト結果はadm-zip が消えて、2番目に表示されていた body-parser が先頭の脆弱性になっている

今回はnpm installで直接更新したが、実際はpackage.jsonを直接編集し、
変更内容を明示した上でnpm installする方が望ましい
8. Snyk Webでの実行
Snyk ログイン後、5 にて フォークしたgithub リポジトリをプロジェクトへインポートする

プロジェクトにリポジトリ追加した場合はsnyk test/snyk code test以外の Dockerfile のチェックも行われていた

package.jsonのリンクをクリックすると CLIと同様に adm-zip@0.4.7 が指摘されている

Code analysisのリンクをクリックすると CLIと同様に 22件の脆弱性 がコード付きで指摘されている

9. Personal Access Token の発行
githubのworkflowと連携させるためのtokenを作成する
左下のアカウントをクリックし、Account settings をクリックする

Personal Access Token ボタンをクリック

token名と期限を入力し、Generate new token ボタンををクリック

tokenは後から見ることができないので注意
10.github workflow の設定
nodejs-goof リポジトリの workflow には以下の4本のyamlが入っていた
- codeql-analysis.yml GitHub公式の静的解析(CodeQL)
- snyk-code-manual.yml Snyk Code による手動ソースコードスキャン
- snyk-code.yml Snyk Code による自動ソースコードスキャン
- snyk-test-sarif.yml Snyk test による依存関係の脆弱性チェック
※2 ~ 4の Snyk の workflow を動かすには環境変数(SNYK_TOKEN)の登録が必要となり、Setting で設定を進めていく

Secrets and variables → Actions → New repository secret をクリック

Name:SNYK_TOKEN
Secret:9で取得したtoken情報を入力する

Actions をクリックし、workflow を有効化する

今回は snyk test のみ試すので、それ以外は Disable にする

package.json を1行だけ書き換えて commit、push

▼test snyk をクリックするとsnyk test結果が出力され、146件の脆弱性が検知されている。
※error と warning については調べてから更新

Secutity → Code scanning で146件の脆弱性の詳細が確認できる

6 ~ 8 でも取り上げたadm-zipについて確認すると、Web画面で表示されていたScoreがなかったが同様の内容が出力されていた。

今後のステップ
- IDEとの連携(VSCode等)
- CI/CDへの組み込み(snyk monitor)
















