こんにちは、プロダクト開発部コアグループの井上です。
コアグループでは、次世代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/◆
最後までお読みいただきましてありがとうございました。ご応募お待ちしております!