Go 脆弱性データベース
概要
Go 脆弱性データベース (https://vuln.go.dev) は、Open Source Vulnerability (OSV) スキーマで Go 脆弱性情報を提供します。
pkg.go.dev/vulnでデータベースの脆弱性を閲覧することもできます。
x/vulndb Git リポジトリの内容に依存しないでください。このリポジトリの YAML ファイルは、警告なしに変更される可能性のある内部形式を使用して保守されています。
貢献
すべての Go パッケージメンテナが、自身のプロジェクトの公開脆弱性に関する情報を提供し、Go パッケージの既存の脆弱性に関する情報を更新することを望んでいます。
報告プロセスをスムーズにすることを目指していますので、お気軽にご意見をお聞かせください。
Go 標準ライブラリまたはサブリポジトリの脆弱性を報告するために上記のフォームを使用しないでください。代わりに、Go プロジェクトに関する脆弱性については、go.dev/security/policyのプロセスに従ってください。
API
Go 脆弱性データベースの正規版であるhttps://vuln.go.devは、以下に指定されたエンドポイントへの GET リクエストに応答できる HTTP サーバーです。
エンドポイントにはクエリパラメータがなく、特定のヘッダーも必要ありません。このため、固定ファイルシステム (file:// URL を含む) から提供されるサイトでもこの API を実装できます。
各エンドポイントは、JSON 形式でエンコードされた応答を、非圧縮 (.jsonとして要求された場合) または gzip 圧縮形式 (.json.gzとして要求された場合) で返します。
エンドポイントは次のとおりです。
-
/index/db.json[.gz]データベースに関するメタデータを返します
{ // The latest time the database should be considered // to have been modified, as an RFC3339-formatted UTC // timestamp ending in "Z". "modified": string }データベースの変更がライブになるまでに遅延が生じる可能性があるため、変更時間を壁時計時間と比較してはいけません (例: キャッシュの無効化目的の場合)。
ライブの例については、/index/db.jsonを参照してください。
-
/index/modules.json[.gz]データベース内の各モジュールに関するメタデータを含むリストを返します
[ { // The module path. "path": string, // The vulnerabilities that affect this module. "vulns": [ { // The vulnerability ID. "id": string, // The latest time the vulnerability should be considered // to have been modified, as an RFC3339-formatted UTC // timestamp ending in "Z". "modified": string, // (Optional) The module version (in SemVer 2.0.0 format) // that contains the latest fix for the vulnerability. // If unknown or unavailable, this should be omitted. "fixed": string, } ] } ]ライブの例については、/index/modules.jsonを参照してください。
-
/index/vulns.json[.gz]データベース内の各脆弱性に関するメタデータを含むリストを返します
[ { // The vulnerability ID. "id": string, // The latest time the vulnerability should be considered // to have been modified, as an RFC3339-formatted UTC // timestamp ending in "Z". "modified": string, // A list of IDs of the same vulnerability in other databases. "aliases": [ string ] } ]ライブの例については、/index/vulns.jsonを参照してください。
-
/ID/$id.json[.gz]ID
$idを持つ脆弱性に関する個別のレポートを、OSV 形式 (下記のSchemaで説明) で返します。ライブの例については、/ID/GO-2022-0191.jsonを参照してください。
一括ダウンロード
Go 脆弱性データベース全体を簡単にダウンロードできるように、すべてのインデックスファイルと OSV ファイルを含む zip ファイルがvuln.go.dev/vulndb.zipで利用可能です。
govulncheckでの使用
デフォルトでは、govulncheckはvuln.go.devの正規の Go 脆弱性データベースを使用します。
このコマンドは、-dbフラグを使用して別の脆弱性データベースに接続するように構成できます。このフラグは、プロトコルhttp://、https://、またはfile://を持つ脆弱性データベースの URL を受け入れます。
govulncheckで正しく機能するためには、指定された脆弱性データベースが上記の API を実装している必要があります。govulncheckコマンドは、http(s) ソースから読み込む場合は圧縮された「.json.gz」エンドポイントを使用し、ファイルソースから読み込む場合は「.json」エンドポイントを使用します。
レガシー API
正規のデータベースには、レガシー API の一部である追加のエンドポイントが含まれています。これらのエンドポイントのサポートは間もなく削除される予定です。レガシー API に依存しており、移行に追加の時間が必要な場合は、お知らせください。
スキーマ
レポートはOpen Source Vulnerability (OSV) スキーマを使用します。Go 脆弱性データベースは、フィールドに以下の意味を割り当てます。
id
id フィールドは、脆弱性エントリの一意の識別子です。GO-
affected
affected フィールドは、脆弱性を含むモジュールバージョンを記述するオブジェクトを含む JSON 配列です。
affected[].package
affected[].package フィールドは、影響を受けるモジュールを識別する JSON オブジェクトです。このオブジェクトには2つの必須フィールドがあります。
- ecosystem: これは常に「Go」となります
- name: これは Go モジュールパスです
- 標準ライブラリ内のインポート可能なパッケージは、名前がstdlibとなります。
- go コマンドは、名前がtoolchainとなります。
affected[].ecosystem_specific
affected[].ecosystem_specificフィールドは、Go の脆弱性検出ツールで使用される、脆弱性に関する追加情報を含む JSON オブジェクトです。
今のところ、エコシステム固有のフィールドは常に、importsという単一のフィールドを持つオブジェクトになります。
affected[].ecosystem_specific.imports
affected[].ecosystem_specific.imports フィールドは、脆弱性の影響を受けるパッケージとシンボルを含む JSON 配列です。配列内の各オブジェクトには、次の2つのフィールドがあります。
- path: 脆弱性を含むパッケージのインポートパスを示す文字列
- symbols: 脆弱性を含むシンボル (関数またはメソッド) の名前を示す文字列配列
- goos: シンボルが出現する実行オペレーティングシステムを示す文字列配列 (既知の場合)
- goarch: シンボルが出現するアーキテクチャを示す文字列配列 (既知の場合)
database_specific
database_specific フィールドには、Go 脆弱性データベースに固有のカスタムフィールドが含まれています。
database_specific.url
database_specific.url フィールドは、Go 脆弱性レポートの完全修飾 URL を表す文字列です。例: "https://pkg.go.dev/vuln/GO-2023-1621"。
database_specific.review_status
database_specific.review_statusフィールドは、脆弱性レポートのレビュー状況を表す文字列です。存在しない場合、レポートはREVIEWEDと見なされます。取りうる値は以下のとおりです。
UNREVIEWED: このレポートは、CVE や GHSA などの別のソースに基づいて自動的に生成されました。そのデータは限定的である可能性があり、Go チームによって検証されていません。REVIEWED: レポートは Go チームによって作成されたか、外部ソースに基づいて生成されました。Go チームのメンバーがレポートをレビューし、必要に応じて追加データを追加しました。
スキーマの他のフィールドについては、OSV 仕様を参照してください。
バージョンに関する注意
当社のツールは、標準的なGo モジュールバージョン番号に従って、ソースアドバイザリのモジュールとバージョンを正規の Go モジュールとバージョンに自動的にマッピングしようとします。govulncheckのようなツールは、これらの標準バージョンに依存して、Go プロジェクトが依存関係の脆弱性の影響を受けるかどうかを判断するように設計されています。
Go プロジェクトが独自のバージョン管理スキームを使用している場合など、標準的な Go バージョンへのマッピングが失敗することがあります。この場合、Go 脆弱性データベースのレポートは、すべての Go バージョンが影響を受けると保守的にリストする場合があります。これにより、govulncheckなどのツールが、認識されないバージョン範囲による脆弱性の報告を怠る (誤検知) ことがなくなります。ただし、すべてのバージョンが影響を受けると保守的にリストすると、ツールがモジュールの修正済みバージョンに脆弱性が含まれていると誤って報告する (誤検出) 可能性があります。
govulncheckが脆弱性を誤って報告している (または報告に失敗している) と思われる場合は、脆弱性レポートの編集を提案してください。弊社が確認します。
例
Go 脆弱性データベース内のすべての脆弱性は、上記の OSV スキーマを使用しています。
Go のさまざまな脆弱性の例については、以下のリンクを参照してください。
- Go 標準ライブラリの脆弱性 (GO-2022-0191): JSON、HTML
- Go ツールチェーンの脆弱性 (GO-2022-0189): JSON、HTML
- Go モジュール内の脆弱性 (GO-2020-0015): JSON、HTML
除外されたレポート
Go 脆弱性データベースのレポートは、さまざまなソースから収集され、Go セキュリティチームによってキュレーションされています。脆弱性アドバイザリ (たとえば CVE や GHSA) に遭遇し、さまざまな理由で除外することを選択する場合があります。これらの場合、最小限のレポートが x/vulndb リポジトリのx/vulndb/data/excludedに作成されます。
レポートは以下の理由で除外される場合があります。
NOT_GO_CODE: 脆弱性は Go パッケージにはありませんが、別のソースによって Go エコシステムのセキュリティアドバイザリとしてマークされていました。この脆弱性は Go パッケージに影響を与えることはありません。(たとえば、C++ ライブラリの脆弱性)。NOT_IMPORTABLE: 脆弱性は、`main` パッケージ、`main` パッケージのみがインポートする `internal/` パッケージ、または他のモジュールがインポートできない他の場所に発生します。EFFECTIVELY_PRIVATE: 脆弱性は、他のモジュールがインポートできる Go パッケージで発生しますが、そのパッケージは外部使用を意図しておらず、それが定義されているモジュールの外部でインポートされる可能性はほとんどありません。DEPENDENT_VULNERABILITY: この脆弱性は、データベース内の別の脆弱性のサブセットです。たとえば、パッケージ A に脆弱性があり、パッケージ B がパッケージ A に依存しており、パッケージ A と B に別々の CVE ID がある場合、B のレポートを、A のレポートによって完全に置き換えられる依存脆弱性としてマークする場合があります。NOT_A_VULNERABILITY: CVE ID または GHSA が割り当てられていますが、関連する既知の脆弱性はありません。WITHDRAWN: 脆弱性はその情報源によって取り下げられました。
現在、除外されたレポートはvuln.go.dev API 経由では提供されていません。ただし、特定のユースケースがあり、API 経由でこの情報にアクセスできると役立つ場合は、お知らせください。