osv-scanner - https://osv.dev が提供するデータを使用するGoで記述された脆弱性スキャナー

(Vulnerability scanner written in Go which uses the data provided by https://osv.dev)

Created at: 2022-11-14 09:05:20
Language: Go
License: Apache-2.0

OpenSSFスコアカード

OSVスキャナー

OSV-Scannerを使用して、プロジェクトの依存関係に影響を与える既存の脆弱性を見つけます。

OSV-Scannerは、プロジェクトの依存関係のリストとそれらに影響を与える脆弱性を結び付けるOSVデータベースへの公式にサポートされているフロントエンドを提供します。OSV.dev データベースはオープンソースで分散されているため、クローズドソースのアドバイザリデータベースやスキャナーと比較していくつかの利点があります。

  • 各アドバイザリは、オープンで信頼できるソース(RustSecアドバイザリーデータベースなど)からのものです。)
  • 誰でもアドバイザリの改善を提案でき、非常に高品質のデータベースになります
  • OSV形式は、影響を受けるバージョンに関する情報を、開発者のパッケージリストに正確にマップされる機械可読形式で明確に格納します。

とりわけ、脆弱性通知が少なく、より実用的なものになり、解決に必要な時間が短縮されます。

目次

装着

インストールプロセス

Linux、macOS、およびWindows用のSLSA3準拠バイナリは、リリースページからダウンロードできます。

ソースからインストール

または、次のコマンドを実行してソースからインストールすることもできます。

$ go install github.com/google/osv-scanner/cmd/osv-scanner@v1

これには、Go 1.18+がインストールされている必要があります。

センバーアドヒアランス

同じメジャーバージョンのすべてのリリースには、下位互換性のあるJSON出力とCLI引数があることが保証されます。

使い

OSV-Scanner は、OSV.dev API を介してこのリストを OSV データベースと照合する前に、プロジェクトで使用されている依存関係とバージョンのリストを収集します。依存関係のリストを作成するには、プロジェクト ディレクトリで OSV-Scanner を指定するか、個々のマニフェスト ファイルへのパスを手動で渡します。

ディレクトリをスキャンする

ディレクトリのリストを調べて、以下を見つけます。

  • ロックファイル
  • SBOM
  • 最新のコミットハッシュのgitディレクトリ

これは、OSVの脆弱性と照合する依存関係のリストを作成するために使用されます。

/ フラグを使用してサブディレクトリを再帰的にウォークスルーするように構成できます。

--recursive
-r

gitコミットハッシュの検索は、使用するプロジェクトで動作することを目的としています Git サブモジュールまたは依存関係がチェックアウトされる同様のメカニズム 実際のGitリポジトリとして。

$ go run ./cmd/osv-scanner -r /path/to/your/dir

SBOM を入力する

パッケージ URL を使用する SPDX および CycloneDX SBOM がサポートされています。形式は 入力ファイルの内容に基づいて自動検出されます。

$ go run ./cmd/osv-scanner --sbom=/path/to/your/sbom.json

ロックファイルを入力する

このロックファイルパッケージを利用することで、幅広いロックファイルがサポートされています。サポートされているロックファイルの現在のリストは次のとおりです。

  • Cargo.lock
  • package-lock.json
  • yarn.lock
  • pnpm-lock.yaml
  • composer.lock
  • Gemfile.lock
  • go.mod
  • mix.lock
  • poetry.lock
  • pubspec.lock
  • pom.xml
    *
  • requirements.txt
    *
  • gradle.lockfile
  • buildscript-gradle.lockfile

$ go run ./cmd/osv-scanner --lockfile=/path/to/your/package-lock.json -L /path/to/another/Cargo.lock

Debian ベースの Docker イメージ パッケージのスキャン (プレビュー)

このツールは、Debian イメージにインストールされているパッケージのリストをスクレイピングし、それらに対する脆弱性を照会します。

現在、Debian ベースの Docker イメージスキャンのみがサポートされています。

インストールする必要があり、ツールにそれを呼び出すアクセス許可が必要です。

docker

これは現在、Dockerコンテナのファイルシステムをスキャンしておらず、他にもさまざまな制限があります。コンテナスキャンのアップデートについては、この問題に従ってください!

$ go run ./cmd/osv-scanner --docker image_name:latest

OSVスキャナの設定

スキャンを構成するには、スキャンしたファイルのディレクトリに osv-scanner.toml ファイルを配置します。この osv-scanner.toml ファイルをオーバーライドするには、代わりに適用する構成へのパスを含むフラグを渡します。

--config=/path/to/config.toml

現在、構成するオプションは 1 つだけです。

ID による脆弱性の無視

脆弱性を無視するには、キーの下に ID を入力します。必要に応じて、有効期限または理由を追加します。

IgnoreVulns

[[IgnoredVulns]]
id = "GO-2022-0968"
# ignoreUntil = 2022-11-09 # Optional exception expiry date
reason = "No ssh servers are connected to or hosted in Go lang"

id = "GO-2022-1059"
# ignoreUntil = 2022-11-09 # Optional exception expiry date
reason = "No external http servers are written in Go lang."

JSON 出力

デフォルトでは、osv-scannerは人間が読めるテーブルを出力します。代わりに osv-scanner に JSON を出力させるには、osv-scanner を呼び出すときにフラグを渡します。

--json

--json フラグを使用すると、JSON 出力のみが標準出力に出力され、他のすべての出力は標準エラーに送られます。したがって、json出力のみをファイルに保存するには、出力を次のようにリダイレクトできます。

osv-scanner --json ... > /path/to/file.json

出力フォーマット

{
  "results": [
    {
      "packageSource": {
        "path": "/absolute/path/to/go.mod",
        // One of: lockfile, sbom, git, docker
        "type": "lockfile"
      },
      "packages": [
        {
          "Package": {
            "name": "github.com/gogo/protobuf",
            "version": "1.3.1",
            "ecosystem": "Go"
          },
          "vulnerabilities": [
            {
              "id": "GHSA-c3h9-896r-86jm",
              "aliases": [
                "CVE-2021-3121"
              ],
              // ... Full OSV
            },
            {
              "id": "GO-2021-0053",
              "aliases": [
                "CVE-2021-3121",
                "GHSA-c3h9-896r-86jm"
              ],
              // ... Full OSV
            }
          ],
          // Grouping based on aliases, if two vulnerability share the same alias, or alias each other,
          // they are considered the same vulnerability, and is grouped here under the id field.
          "groups": [
            {
              "ids": [
                "GHSA-c3h9-896r-86jm",
                "GO-2021-0053"
              ]
            }
          ]
        }
      ]
    },
    {
      "packageSource": {
        "path": "/absolute/path/to/Cargo.lock",
        "type": "lockfile"
      },
      "packages": [
        {
          "Package": {
            "name": "regex",
            "version": "1.5.1",
            "ecosystem": "crates.io"
          },
          "vulnerabilities": [
            {
              "id": "GHSA-m5pq-gvj9-9vr8",
              "aliases": [
                "CVE-2022-24713"
              ],
              // ... Full OSV
            },
            {
              "id": "RUSTSEC-2022-0013",
              "aliases": [
                "CVE-2022-24713"
              ],
              // ... Full OSV
            }
          ],
          "groups": [
            {
              "ids": [
                "GHSA-m5pq-gvj9-9vr8",
                "RUSTSEC-2022-0013"
              ]
            }
          ]
        }
      ]
    }
  ]
}