1
/
5

【エンジニアブログ】govulncheckを利用したGitHub Actionsでの脆弱性チェック

こんにちは、プロダクト開発部コアグループの井上です。
コアグループでは、次世代ECの開発を行っています。

今回はgovulncheckとGitHub ActionsをつかってGoの脆弱性チェックを自動化した取り組みについて紹介します。

govulncheck

govulncheckは、Goプロジェクトの依存関係とソースコードを分析し、既知の脆弱性を検出するツールです。コマンドラインから簡単に実行することができます。

今回はCVE-2024-24789を含むこちらのサンプルを想定して書いていきます。

実行方法

-jsonオプションを利用することで、結果をjson形式で得ることができます。

osv

OSV (Open Software Vulnerabilities) は、Googleが管理しているオープンソースソフトウェアの脆弱性を追跡するためのデータベースで、 出力結果として得られるosvそのフォーマット(OSV Schema)に沿ったGoの脆弱性情報です。 govulncheckの実装 を見ると、スキャン対象のモジュールに影響がありそうなものがosvとして出力されているようでした。
※記事に乗せるには量が多すぎるため、上記のサンプルでは削っています。

affected.rangesを見ることで修正バージョンが分かります。

finding

スキャンの結果見つかった脆弱性findingとして出力されます。 symbolレベルでスキャンを実行した場合(デフォルト)、trace内に影響を受けるコードの情報が入ってきます。
今回はutil.goの10行目でzip.NewReaderを使用しているためGO-2024-2888の影響があるということが分かります。

今回作ったもの

GitHub Actionsであればアクションが公開されているため、簡単にCIに組み込むことができますが、 今回はISSUEの作成まで自動で行いたかったので、govulncheck ./... -jsonの結果を自前でパースすることにしました。

jsonのパース

govulncheck ./... -jsonの結果はjson.Unmarshalではパースすることはできません。
当初はbufio.Scanner.Scan()を使って力業でパースしましたが、json.Decoderを使用することで簡単にパースすることができます。

ISSUEの作成

パース結果をもとに、リポジトリのコードに影響があるtrace.positionが存在する脆弱性を集計し、ISSUE用のmarkdownに成形して、actions/github-scriptでISSUEを作成しています。

GitHub Actionsで作成された脆弱性対応ISSUE

余談ですがaliasに入ってくるCVEは、CVE-2024-24786などをそのままISSUE張り付けただけでリンクになって便利でした。

おわりに

今回は脆弱性があっても、対象の関数などを使用していないなどで影響がない場合はISSUEを作成しないようにしましたが、結局別チームが別途拾って対応することになってしまいました。
修正版リリースから最速で対応できるよう、findingがある場合は無条件にISSUEが作成されるように変更予定です。

また、現在は一度出た脆弱性を保存する仕組みを用意していない為、重複したISSUEが作られてしまわないようにスキャン頻度を週一回にしています。 毎日実行しても問題ないようこの点も改善していく予定です。

皆さんも手軽に脆弱性チェックができるgovulncheckを活用してみてください。

◆ 他のBlogはこちらから⇒ https://tech.makeshop.co.jp/

最後までお読みいただきましてありがとうございました。ご応募お待ちしております!



GMOメイクショップ株式会社では一緒に働く仲間を募集しています

同じタグの記事

今週のランキング