Goの脆弱性管理

Goセキュリティに戻る

概要

Goは、開発者が攻撃者によって悪用されるリスクのあるエラーや弱点を検出、評価、解決するのに役立ちます。舞台裏では、Goチームが脆弱性に関するレポートを整理するパイプラインを実行しており、それらはGo脆弱性データベースに保存されます。さまざまなライブラリやツールがこれらのレポートを読み込み、分析して、特定のユーザープロジェクトがどのように影響を受けるかを理解できます。この機能は、Goパッケージ探索サイトと新しいCLIツールであるgovulncheckに統合されています。

このプロジェクトは進行中であり、活発に開発されています。改善のため、皆様からのフィードバックを歓迎します!

: Goプロジェクトの脆弱性を報告する場合は、Goセキュリティポリシーを参照してください。

アーキテクチャ

Go Vulnerability Management Architecture

Goの脆弱性管理は、以下の主要な要素で構成されています。

  1. データパイプラインは、National Vulnerability Database (NVD)GitHub Advisory Database、そしてGoパッケージメンテナーからの直接の報告など、さまざまなソースから脆弱性情報を収集します。
  2. 脆弱性データベースには、データパイプラインからの情報を使用してレポートが入力されます。データベース内のすべてのレポートは、Goセキュリティチームによってレビューされ、キュレーションされます。レポートはOpen Source Vulnerability (OSV) フォーマットでフォーマットされ、APIを通じてアクセスできます。
  3. pkg.go.devとgovulncheckとの統合により、開発者はプロジェクト内の脆弱性を発見できます。govulncheckコマンドは、コードベースを分析し、コード内の関数が脆弱な関数を推移的に呼び出しているかどうかに基づいて、実際に影響を与える脆弱性のみを表面化させます。Govulncheckは、プロジェクト内の既知の脆弱性を発見するための、ノイズが少なく信頼性の高い方法を提供します。

リソース

Go脆弱性データベース

Go脆弱性データベースには、GoパッケージメンテナーからGoセキュリティチームへの直接の報告に加えて、多くの既存のソースからの情報が含まれています。データベース内の各エントリは、脆弱性の説明、パッケージとシンボルの情報、バージョン詳細が正確であることを確認するためにレビューされます。

Go脆弱性データベースの詳細については、go.dev/security/vuln/databaseを、データベース内の脆弱性をブラウザで表示するには、pkg.go.dev/vulnを参照してください。

パッケージメンテナーには、自身のプロジェクトにおける公開された脆弱性に関する情報を提供し、摩擦を減らす方法について提案を送ることを推奨します。

Goの脆弱性検出

Goの脆弱性検出は、Goユーザーが自身のプロジェクトに影響を与える可能性のある既知の脆弱性について、ノイズが少なく信頼性の高い方法で知ることができるようにすることを目指しています。脆弱性チェックは、新しいコマンドラインツールであるgovulncheckGoパッケージ探索サイト、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プロジェクトの脆弱性を報告するにはどうすればよいですか?

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プログラムにも当てはまります。しかし、これらはすべて主観的な評価を必要とします。

私たちは、脆弱性の良い説明が深刻度指標よりも有用であると信じています。良い説明は、問題が何であるか、どのようにトリガーされるか、そして消費者が自身のソフトウェアへの影響を判断する際に何を考慮すべきかを分解することができます。

このトピックについてご意見を共有したい場合は、お気軽に課題を提出してください。