用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的 SPDX 和 CycloneDX SBOM 。 格式是根据输入文件内容自动检测的。
例子
$ osv-scanner --sbom=/path/to/your/sbom.json
输入一个锁文件
使用此 lockfile 包 支持范围广泛的 lockfiles 。 这是当前支持的锁定文件列表:
Cargo.lockpackage-lock.jsonyarn.lockpnpm-lock.yamlcomposer.lockGemfile.lockgo.modmix.lockpoetry.lockpubspec.lockpom.xml*requirements.txt*gradle.lockfilebuildscript-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"
]
}
]
}
]
}
]
}