用Go编写的漏洞扫描器,使用https://osv.dev 提供的数据

作者:Sec-Labs | 发布时间:

编者记

以下项目是谷歌开源OSV工具,可识别项目依赖中的安全漏洞

项目地址

https://github.com/google/osv-scanner

OSV-Scanner

使用 OSV-Scanner 查找影响项目依赖项的现有漏洞。

OSV-Scanner 为OSV 数据库 提供官方支持的前端 ,将项目的依赖项列表与影响它们的漏洞联系起来。 由于 OSV.dev 数据库是开源和分布式的,与闭源咨询数据库和扫描器相比,它有几个好处:

  • 每个咨询都来自一个开放和权威的来源(例如 RustSec 咨询数据库
  • 任何人都可以建议改进建议,从而产生非常高质量的数据库
  • OSV 格式以机器可读格式明确存储有关受影响版本的信息,该格式精确映射到开发人员的软件包列表

最重要的是导致更少、更可操作的漏洞通知,从而减少解决它们所需的时间。 查看我们的 公告博客文章 了解更多详情!

目录

安装

您可以从我们的 发布页面 下载适用于 Linux、macOS 和 Windows的 SLSA3 兼容二进制文件。

包管理器

如果你是 Windows Scoop 用户,那么你可以从官方 bucket 安装 osv-scanner :

scoop install osv-scanner

如果你是 Homebrew 用户,你可以通过以下方式安装 osv-scanner

$ brew install osv-scanner

从源安装

或者,您可以通过运行以下命令从源安装它:

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

这需要安装 Go 1.18+。

兼容性

同一主要版本上的所有版本都将保证具有向后兼容的 JSON 输出和 CLI 参数。

用法

OSV-Scanner 会收集项目中使用的依赖项和版本列表,然后通过OSV.dev API 将此列表与 OSV 数据库进行匹配 。 要构建依赖项列表,您可以将 OSV-Scanner 指向您的项目目录,或手动将路径传递到各个清单文件。

扫描目录

遍历目录列表以查找:

  • 锁定文件
  • 物料清单
  • 最新提交哈希的 git 目录

用于构建要与 OSV 漏洞匹配的依赖项列表。

--recursive 可以配置为使用/ -r 标志 递归遍历子目录。

搜索 git commit hash 旨在与使用 git 子模块或类似机制的项目一起工作,其中依赖项被检出为真正的 git 存储库。

例子

$ osv-scanner -r /path/to/your/dir

输入 SBOM

支持使用 包 URL的 SPDXCycloneDX SBOM 。 格式是根据输入文件内容自动检测的。

例子

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

输入一个锁文件

使用此 lockfile 包 支持范围广泛的 lockfiles 。 这是当前支持的锁定文件列表:

  • 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

例子

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

扫描基于 Debian 的 docker 镜像包(预览)

该工具将抓取 Debian 映像中已安装软件包的列表并查询它们的漏洞。

目前仅支持基于 Debian 的 docker 镜像扫描。

需要 docker 安装和工具有调用它的权限。

这目前不扫描 Docker 容器的文件系统,并且有各种其他限制。 请关注 此问题 以获取有关容器扫描的更新!

例子

$ osv-scanner --docker image_name:latest

配置 OSV 扫描仪

要配置扫描,请将 osv-scanner.toml 文件放在扫描文件的目录中。 要覆盖此 osv-scanner.toml 文件,请将 --config=/path/to/config.toml 带有路径的标志传递给您要应用的配置。

目前,只有 1 个配置选项:

通过 ID 忽略漏洞

要忽略漏洞,请在 IgnoreVulns 密钥下输入 ID。 (可选)添加到期日期或原因。

例子

[[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,请 --json 在调用 osv-scanner 时传递标志。

当使用 --json 标志时,只有 JSON 输出将被打印到 stdout,所有其他输出都被定向到 stderr。 所以只保存 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"
              ]
            }
          ]
        }
      ]
    }
  ]
}

 

标签:工具分享