Go 言語(以下 golang)公式の脆弱性チェッカー「govulncheck
」が 2022/09/06 に発表されました。
「govulncheck
」は、go get
した golang のモジュールのうち、パッケージの脆弱性をローカルでチェックできる公式ツールです。
いままでも Snyk などの CI で似たようなチェックはできました。目的が若干違うものの、golang 公式のツールであり、golang に特化したグループが脆弱性情報をメンテしていること、なにより golangci-lint run
と同じ感覚で、ローカルで手軽にチェックできるのが良いですね。
まだ experimental
(golang.org/x/
下の準標準パッケージ)ですが、将来的に go test
の -cover
-fuzz
-bench
と似た使い勝手で統合されることに期待です。
以下は基本的な使い方で、リリース情報の翻訳は TS; DR をご覧ください。
TL; DR (今北産業、基本的な使い方)
-
インストールとアップグレード:
ツールのインストール&アップグレード(要Go1.18以降)$ go install golang.org/x/vuln/cmd/govulncheck@latest
go install
した golang アプリのアップデートには gup がオススメです。 -
脆弱性のテスト実行:
ツールの実行$ govulncheck ./... govulncheck is an experimental tool. Share feedback at https://go.dev/s/govulncheck-feedback. Scanning for dependencies with known vulnerabilities... No vulnerabilities found. $ echo $? 0 $ govulncheck -json ./... { "Vulns": null }
-
使い方:
$ govulncheck -h usage: govulncheck [flags] package... govulncheck [flags] binary -json output JSON -tags list comma-separated list of build tags -test analyze test files. Only valid for source code. -v print a full call stack for each vulnerability For details, see https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck.
注意点として、すべての脆弱性を表示するのではなく、危険度によって表示結果が異なります。
危険度の測定には、脆弱性のあるパッケージに、どれだけ自分のアプリが依存しているかなども加味されます。例えば、脆弱性の報告されているパッケージであっても、脆弱性に該当する関数を利用していない場合は報告しない、などです。
つまり「パスした == 脆弱性は発見されなかった」と言うよりは「パスした == クリティカルな脆弱性は発見されなかった」という意味合いが強い気がします。
とは言え、go test
や golangci-lint
などとセットで「最低限のチェック」として使える手軽さがあります。govulncheck
単体で完結させるよりは、CI の愉快な仲間たちに加えて使うのがいいと思いました。
- リリース情報: "Vulnerability Management for Go" | blog @ go.dev
- リポジトリ: https://github.com/golang/vuln @ GitHub
- GoDoc: https://pkg.go.dev/golang.org/x/vuln @ pkg.go.dev
- 報告された脆弱性の例: GO-2022-1059
以下は 2022/09/06 に発表された、"Vulnerability Management for Go" の日本語訳です。ライセンスは原文と同じ CC BY 4.0 です。
【文責】 原文: 2022/09/06, Julie Qiu (Go セキュリティチーム)/翻訳: 2023/01/22, @KEINOS
Go のための脆弱性管理
この度、Go 言語(以下 Go)の脆弱性管理のための新しいサポート・ツールをリリースしました。これは、Go 開発者が影響を受けるであろう「既知の脆弱性を知るための手助け」の最初のステップです。
この記事では、現在利用可能なものの概要と、このプロジェクトの次のステップについて説明します。
概要
Go のツールに、既知の脆弱性についてコードを解析するためのツールが加わりました。これらのツールは、Go セキュリティ・チームによって維持されている Go の脆弱性データベースに依存しています。新しいツールは、コードから実際に呼び出された関数の脆弱性だけを表示することによって、出力結果のノイズを低減しています。
Go 脆弱性データベース
Go 脆弱性データベース (Go Vulnerability Database, https://vuln.go.dev) は、一般にインポート可能な Go モジュールのパッケージにおける既知の脆弱性についての包括的な情報源です。
脆弱性データは、既存のソース(CVE や GHSA など)と、Go パッケージのメンテナから直接受けた報告から得たものです。この情報は、Go セキュリティ・チームによってレビューされ、データベースに追加されます。
Go パッケージのメンテナには、自身のパッケージで公表した新たな脆弱性情報を提供したり、既存の脆弱性情報を更新することを推奨しています。私たちの目標は、報告の過程で摩擦を少なくすることですので、このプロセスに改善点があればぜひ提案を送ってください。
Go の脆弱性データベースは、pkg.go.dev/vuln でブラウザからも利用可能です。データベースの詳細については、go.dev/security/vuln/database を参照してください。
govulncheck による脆弱性の検出
新しい govulncheck
コマンドは、ソースコードを分析し、コード内のどの関数が脆弱な関数を過渡的に呼び出すかに基づいて、本当に影響を与える脆弱性のみを表示します。これにより、自身の Go プロジェクトに影響を与える可能性のある「既知の脆弱性」について、出力ノイズの少ない信頼できる情報を得られます。
govulncheck
は、go install で最新版をインストールすることができます。
$ go install golang.org/x/vuln/cmd/govulncheck@latest
次に、プロジェクトのディレクトリで govulncheck
を実行します。
$ govulncheck ./...
govulncheck
は単体で実行できるツール(スタンドアロンのバイナリ)であるため、ユーザーからのフィードバックを収集している間にも、頻繁な更新やツールのアップデートを可能にします。将来的に govulncheck
ツールはメインの Go ディストリビューションに統合される予定です。
統合
脆弱性については、開発やデプロイメントといったプロセスの、できるだけ早い段階で認識することが最善です。脆弱性チェックを独自のツールやプロセスに統合するには、govulncheck -json が使用できます。
私たちは、この脆弱性検出を、既存の Go ツールやサービス(Go パッケージの検索サイトなど)に統合しました。たとえば、このページでは golang.org/x/text
の各バージョンにある既知の脆弱性を表示しています。また、VSCode の Go 拡張による脆弱性チェック機能も近々利用できるようになる予定です。
次のステップへ
この Go の新しい機能のサポートが脆弱性管理のお役に立てたり、改善にご協力いただけると幸いです。
Go の脆弱性管理のサポートは、現在活発に開発が行われている新機能です。また、いくつかのバグや制限があることをご承知おきください。
皆様には、次のような改善へのご協力をお願いいたします。
- 自身で管理している Go パッケージの、脆弱性に関する新しい公開情報の報告、または既存の情報の更新を行う。
-
アンケートに答えて、
govulncheck
の利用体験を共有する。 - 不具合報告や機能要望など、意見を寄せる。
より良く、より安全な Go のエコシステムを構築するために、皆さんと協力できることを楽しみにしています。
(原文: "Vulnerability Management for Go" | blog @ go.dev)