govulncheck
完全ガイド|セキュリティアラートでサプライチェーンを守るLog4Shellの脆弱性が世界を震撼させたように、現代のソフトウェアは自らが書いたコードよりも、依存するオープンソースライブラリの脆弱性によって危険に晒されています。あなたのプロジェクトは、この「サプライチェーンリスク」に備えられていますか?
この課題に対し、Goチームが公式に提供する強力なソリューションが、脆弱性データベースとgovulncheck
ツールです。この記事では、これらの仕組みを実践的に解説します!
vuln.go.dev
)Goのセキュリティチームによって維持される、Goの公開モジュールに関する脆弱性情報が集約された、信頼できる唯一の情報源です。
govulncheck
コマンド上記データベースと連携し、あなたのプロジェクトを解析する公式ツールです。最大の特徴は、静的解析によりあなたのコードが脆弱性のある関数を「実際に呼び出しているか?」までを分析してくれることです。これにより無関係な脆弱性アラートに悩まされることがなく、本当に対応が必要な問題だけに集中できます。
govulncheck
でプロジェクトをスキャンするまず、govulncheck
をインストールします。Go 1.18以降が必要です。
bash1go install golang.org/x/vuln/cmd/govulncheck@latest
プロジェクトのルートディレクトリで、以下のコマンドを実行するだけです。
bash1govulncheck ./...
このコマンドは、現在のディレクトリとそのサブディレクトリ内のすべてのGoパッケージを再帰的にスキャンします。
No vulnerabilities found.
この安心できるメッセージが表示されます。
出力は以下のような形式で表示されます:
Vulnerability #1: GO-2023-1234
A vulnerability in example.com/vulnerable-package
More info: https://pkg.go.dev/vuln/GO-2023-1234
Module: example.com/vulnerable-package
Found in: example.com/[email protected]
Fixed in: example.com/[email protected]
Platforms: linux/amd64, darwin/amd64
Call stacks in your code:
main.go:15:20: main.main calls vulnerable-package.VulnerableFunction
重要な判定基準:
Call stacks in your code
が表示される場合: あなたのコードが脆弱性のある関数を直接的または間接的に呼び出していることを示します。最優先で対応が必要です。
Call stacks
が表示されない場合: 依存関係には含まれているが、あなたのコードは脆弱性のある関数を呼び出していないことを示します。緊急度は低いですが、go get -u
でのアップデートを検討しましょう。
この精密な分析により、本当に対応が必要な脆弱性と、影響のない脆弱性を明確に区別できます。
脆弱性チェックを、個人の手作業からチームの「仕組み」へと昇華させましょう。
プルリクエストがマージされる前に、脆弱性を自動でチェックする仕組みを構築します。
yaml1# .github/workflows/security.yml 2name: Security Check 3on: [push, pull_request] 4 5jobs: 6 govuln: 7 runs-on: ubuntu-latest 8 permissions: 9 security-events: write 10 steps: 11 - uses: actions/checkout@v4 12 - uses: actions/setup-go@v5 13 with: { go-version: '1.22' } 14 15 - name: Run govulncheck (JSON) 16 run: | 17 govulncheck -json ./... > govuln.json 18 # govulncheck がエラー終了しても後続ステップを実行 19 - name: Convert JSON → SARIF 20 if: always() 21 run: | 22 go install github.com/jmatsu/govulncheck-sarif/cmd/govulncheck-sarif@latest 23 govulncheck-sarif -in govuln.json -out govuln.sarif 24 - name: Upload SARIF 25 if: always() 26 uses: github/codeql-action/upload-sarif@v3 27 with: { sarif_file: govuln.sarif }
GitHubリポジトリでDependabot security updatesを有効にすることが、最も手軽で効果的な「アラート購読」です。Dependabotがgo.mod
を監視し、依存関係に脆弱性が見つかった場合、自動でセキュリティアップデートのプルリクエストを作成してくれます。
公開モジュールであれば、pkg.go.dev
のページ上で、既知の脆弱性の有無がバッジとして表示されます。依存関係を追加する前に、このページで脆弱性の状況を確認する習慣をつけることも重要です。
月次や四半期ごとに、以下のコマンドで依存関係全体をチェックする運用も効果的です:
bash1# 依存関係の更新確認 2go list -u -m all 3 4# 脆弱性チェック 5govulncheck ./... 6 7# 依存関係の更新(必要に応じて) 8go get -u ./...
大規模モノレポでは API 呼び出し数やネットワーク待ち時間がボトルネックになります。
Go チームの公開リポジトリを clone してローカル DB として利用できます。
bash1# 方法1: Git clone(従来の方法) 2git clone https://go.googlesource.com/vulndb 3govulncheck -db=file://$(pwd)/vulndb ./... 4 5# 方法2: Go 1.22以降の公式コマンド 6go vuln db -o ./vulndb 7govulncheck -db=file://$(pwd)/vulndb ./...
Go 1.22以降では、go vuln db
コマンドを使用してより簡単にローカル脆弱性データベースを取得できます。
CI 内でキャッシュディレクトリを保存しておくことで、後続ジョブも同じ DB を利用でき、ジョブ時間を 30〜40% 削減できます。
定期的にローカル脆弱性データベースを更新し、キャッシュを活用することで、CI/CDの実行時間をさらに短縮できます。
yaml1# .github/workflows/refresh-vulndb.yml 2name: Refresh Go Vulnerability DB 3on: 4 schedule: 5 - cron: '0 3 * * 1' # 毎週月曜 03:00 6jobs: 7 update-db: 8 runs-on: ubuntu-latest 9 steps: 10 - name: Cache vulndb 11 uses: actions/cache@v4 12 with: 13 path: ./vulndb 14 key: ${{ runner.os }}-vulndb-${{ github.run_id }} 15 restore-keys: | 16 ${{ runner.os }}-vulndb- 17 - name: Download latest DB 18 run: | 19 go install golang.org/x/vuln/cmd/govulncheck@latest 20 go vuln db -o ./vulndb
このワークフローにより脆弱性データベースが定期的に更新され、他のワークフローでキャッシュされたデータベースを利用できるようになります。
bash1# JSON形式で詳細な結果を取得 2govulncheck -json ./... > vulnerability-report.json 3 4# 特定の脆弱性IDのみをフィルタリング 5govulncheck -json ./... | jq '.[] | select(.vulnerability.id == "GO-2023-1234")'
Fixed in
バージョンが利用可能かチェックgovulncheck
を定期的に実行し、CI/CDに組み込み、Dependabotを有効にすること。この3つがGoプロジェクトをサプライチェーンリスクから守るための、現代的なベストプラクティスです。
特に重要なのは、これらのツールを「仕組み」として組み込むことです。個人の記憶や習慣に依存するのではなく、自動化された継続的なセキュリティチェックにより、チーム全体でセキュリティ品質を担保できます。
自身のコードだけでなく、その土台となる依存関係のセキュリティにまで責任を持つことこそ、クライアントから信頼されるプロフェッショナルなエンジニアの姿勢です。
このようなセキュリティ意識の高いエンジニアは、FinTechや大規模Webサービスなど、セキュリティが最重要視される高単価プロジェクトで特に重宝されます。私たちGoForceでも、Goのコーディングスキルに加えて、モダンなセキュリティツールを使いこなす能力を持つエンジニアを高く評価しています。もしこうした「守る力」を活かせるプロジェクトにご興味がございましたら、お気軽にご相談ください。
A: 以下の頻度を推奨します:
A: 完全に無視するのではなく、以下の対応を推奨します:
A: govulncheckは公開されている脆弱性データベースを参照するため、プライベートモジュール固有の脆弱性は検出できません。プライベートモジュールについては:
A: 以下の手順で対処してください:
最適なGo案件を今すぐチェック!