Go 脆弱性データベース
概要
Go 脆弱性データベース(https://vuln.go.dev)は、オープンソース脆弱性(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` としてリクエストされた場合)または gzip 圧縮(`.json.gz` としてリクエストされた場合)のいずれかの形式で、JSON エンコードされたレスポンスを返します。
エンドポイントは次のとおりです。
-
/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 形式(以下のスキーマで説明)で返します。
実際の例については、/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 に依存していて、移行にさらに時間が必要な場合は、お知らせください。
スキーマ
レポートは、オープンソース脆弱性(OSV)スキーマを使用します。Go 脆弱性データベースは、フィールドに次の意味を割り当てます。
id
id フィールドは、脆弱性エントリの一意の識別子です。GO-<YEAR>-<ENTRYID> 形式の文字列です。
affected
affected フィールドは、脆弱性を含むモジュールバージョンを記述するオブジェクトを含む JSON 配列です。
affected[].package
affected[].package フィールドは、影響を受ける *モジュール* を識別する JSON オブジェクトです。オブジェクトには、2 つの必須フィールドがあります。
- **ecosystem**: これは常に「Go」になります
- **name**: これは Go モジュールパスです
- 標準ライブラリでインポート可能なパッケージの名前は *stdlib* になります。
- go コマンドの名前は *toolchain* になります。
affected[].ecosystem_specific
affected[].ecosystem_specific フィールドは、Go の脆弱性検出ツールで使用される、脆弱性に関する追加情報を含む JSON オブジェクトです。
現時点では、ecosystem_specific は常に単一のフィールド `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 モジュールバージョン番号に従って、ソースアドバイザリのモジュールとバージョンを正規の 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が割り当てられていますが、それに関連付けられた既知の脆弱性は存在しません。
現時点では、除外されたレポートはvuln.go.dev APIを介して提供されていません。ただし、特定のユースケースがあり、APIを通じてこの情報にアクセスできると役立つ場合は、お知らせください。