Go脆弱性管理
概要
Goは、開発者が攻撃者によって悪用されるリスクのあるエラーや脆弱性を検出し、評価し、解決するのに役立ちます。舞台裏では、Goチームは脆弱性に関するレポートをキュレーションするためのパイプラインを実行しており、それらのレポートはGo脆弱性データベースに保存されます。さまざまなライブラリとツールは、それらのレポートを読み取って分析することにより、特定のユーザープロジェクトがどのように影響を受ける可能性があるかを理解できます。この機能はGoパッケージディスカバリサイトと新しいCLIツールであるgovulncheckに統合されています。
このプロジェクトは進行中の作業であり、活発に開発中です。改善のためのごフィードバックをお待ちしております!
注記:Goプロジェクトの脆弱性を報告するには、Goセキュリティポリシーを参照してください。
アーキテクチャ

Goの脆弱性管理は、次のハイレベルな構成要素で構成されています。
- データパイプラインは、国立脆弱性データベース(NVD)、GitHubアドバイザリデータベース、およびGoパッケージメンテナからの直接報告など、さまざまなソースから脆弱性情報を収集します。
- 脆弱性データベースは、データパイプラインからの情報を使用してレポートで移入されます。データベース内のすべてのレポートは、Goセキュリティチームによってレビューおよびキュレーションされます。レポートはオープンソース脆弱性(OSV)フォーマットでフォーマットされ、APIを通じてアクセスできます。
- 開発者がプロジェクトの脆弱性を見つけることができるように、pkg.go.devおよびgovulncheckとの統合。 govulncheckコマンドはコードベースを分析し、コード内のどの関数が脆弱な関数を推移的に呼び出しているかに基づいて、実際に影響を与える脆弱性のみを表面化します。Govulncheckは、プロジェクトで既知の脆弱性を見つけるための、ノイズが少なく信頼性の高い方法を提供します。
リソース
Go脆弱性データベース
Go脆弱性データベースには、Goパッケージメンテナからの直接的なレポートに加えて、多くの既存のソースからの情報が含まれています。データベース内の各エントリは、脆弱性の説明、パッケージとシンボル情報、およびバージョン詳細の正確性を確認するためにレビューされています。
Go脆弱性データベースの詳細についてはgo.dev/security/vuln/databaseを参照し、データベース内の脆弱性をブラウザで表示するにはpkg.go.dev/vulnを参照してください。
パッケージメンテナは、独自のプロジェクトの公開されている脆弱性に関する情報を提供し、摩擦を減らす方法に関する提案を送信することをお勧めします。
Goの脆弱性検出
Goの脆弱性検出は、Goユーザーがプロジェクトに影響を与える可能性のある既知の脆弱性について学ぶための、ノイズが少なく信頼性の高い方法を提供することを目的としています。脆弱性チェックは、新しいコマンドラインツールgovulncheck、Goパッケージディスカバリサイト、Go拡張機能を含むVS Codeなどの主要なエディタを含む、Goのツールとサービスに統合されています。
govulncheckの使用を開始するには、プロジェクトから次のコマンドを実行します。
$ go install golang.org/x/vuln/cmd/govulncheck@latest
$ govulncheck ./...
エディタで脆弱性検出を有効にするには、エディタの統合ページの手順を参照してください。
Go CNA
GoセキュリティチームはCVEナンバリングオーソリティです。go.dev/security/vuln/cnaで詳細情報をご覧ください。
フィードバック
皆様からの貢献と改善へのご協力をお願いいたします。
- 新しい情報を提供し、管理するGoパッケージの公開されている脆弱性に関する既存の情報を更新してください。
- govulncheckの使用経験を共有するためにこのアンケートにご回答ください。
- 問題点と機能要求に関するフィードバックをお寄せください。
よくある質問
Goプロジェクトの脆弱性を報告するにはどうすればよいですか?
Goプロジェクトのすべてのセキュリティバグは、security@golang.orgまでメールで報告してください。Goのセキュリティポリシーで、当社のプロセスについて詳細をご覧ください。
Go脆弱性データベースに公開されている脆弱性を追加するにはどうすればよいですか?
Go脆弱性データベースに公開されている脆弱性の追加を依頼するには、このフォームに記入してください。
脆弱性は、既に公開されているか、またはあなたが管理するパッケージに存在する場合(そしてあなたがそれを公開する準備ができている場合)に公開されていると見なされます。このフォームは、Goチームによって管理されていないインポート可能なGoパッケージ(Go標準ライブラリ、Goツールチェーン、golang.orgモジュール以外のもの)にある公開されている脆弱性に対してのみ使用できます。
このフォームは、新しいCVE IDを要求するためにも使用できます。Go CVEナンバリングオーソリティの詳細はこちら。
脆弱性の編集を提案するにはどうすればよいですか?
Go脆弱性データベースの既存のレポートへの編集を提案するには、こちらのフォームに記入してください。
govulncheckに関する問題またはフィードバックを報告するにはどうすればよいですか?
Goの問題トラッカーで問題またはフィードバックを送信してください。
別のデータベースでこの脆弱性を見つけました。なぜGo脆弱性データベースにないのですか?
関連する脆弱性がGoパッケージに存在しない、脆弱性がインポート可能なパッケージではなくインストール可能なコマンドにある、または脆弱性がデータベースに既に存在する別の脆弱性によって包含されているなど、さまざまな理由で、レポートがGo脆弱性データベースから除外される場合があります。Goセキュリティチームのレポート除外の理由の詳細はこちらをご覧ください。レポートがvuln.go.devから誤って除外されたと思われる場合は、お知らせください。
Go脆弱性データベースが深刻度ラベルを使用しないのはなぜですか?
ほとんどの脆弱性報告フォーマットは、「LOW」、「MEDIUM」、「CRITICAL」などの深刻度ラベルを使用して、さまざまな脆弱性の影響を示し、開発者がセキュリティの問題の優先順位を付けるのに役立てています。しかし、いくつかの理由から、Goはそうしたラベルの使用を避けています。
脆弱性の影響はほとんどの場合普遍的ではなく、そのため、深刻度インジケーターはしばしば誤解を招く可能性があります。たとえば、パーサーのクラッシュは、ユーザー提供の入力を解析するために使用され、DoS攻撃で悪用される可能性がある場合は、重大な深刻度の問題となる可能性がありますが、パーサーがローカル構成ファイルを解析するために使用される場合は、深刻度を「低」と呼ぶことさえ誇張かもしれません。
深刻度のラベル付けは、本質的に主観的なものです。これは、脆弱性の攻撃ベクトル、複雑さ、悪用可能性など、関連する側面を分類するための式を提示しているCVEプログラムについても当てはまります。しかし、これらはすべて主観的な評価が必要です。
私たちは、深刻度インジケーターよりも、脆弱性の優れた説明の方が役立つと考えています。優れた説明では、問題の内容、トリガー方法、および消費者が独自のソフトウェアへの影響を判断する際に考慮すべき点を説明できます。
このトピックに関するご意見を共有したい場合は、お気軽に問題を報告してください。