OSV 是什么?OSV-Scanner 又解决了什么问题?

1 OSV(Open Source Vulnerabilities)

OSV 是一个以源码版本为核心的漏洞数据库,而不是传统的:

  • CVE + 影响范围模糊描述

OSV 的核心优势在于:

维度传统 CVEOSV
漏洞定位模糊版本区间精确到 Git Commit
生态支持不统一Go / Maven / PyPI / npm
数据来源人工维护自动 + 官方同步
误报率极低

OSV 已被以下项目深度集成:

  • Go 官方工具链
  • GitHub Dependabot
  • Google Cloud
  • Bazel
  • OSS-Fuzz

2 OSV-Scanner 是什么?

OSV-Scanner 是 Google 官方发布的开源漏洞扫描器,用于查找影响项目依赖项的已知安全漏洞。它是基于 Go 语言构建的 CLI 工具,利用开源的 OSV.dev 漏洞数据库进行比对分析,支持 11+ 语言生态、19+ 锁文件格式,以及容器镜像和操作系统级别的软件包扫描。同时它不仅支持离线扫描,还支持许可证审核和 guided remediation 功能。官方同时提供了可直接下载的跨平台可执行二进制和 GitHub Action 形式的集成。

osv-scanner 是一个 本地运行的漏洞扫描 CLI 工具,核心能力包括:

  • 扫描 lock 文件 / manifest
  • 扫描 SBOM
  • 扫描 本地源码依赖
  • 精确匹配受影响版本
  • 零配置、无账号、可离线缓存

一句话总结:

它是工程师可以直接使用的“漏洞检查编译器”


OSV-Scanner 支持哪些语言和生态?

截至目前,OSV-Scanner 官方支持:

1 语言 / 包管理器支持

  • 前端/Node.js: package-lock.json, yarn.lock, pnpm-lock.yaml
  • Go: go.mod
  • Python: requirements.txt, Pipfile.lock, poetry.lock
  • Java: pom.xml, gradle.lockfile
  • Rust: Cargo.lock
  • Ruby: Gemfile.lock
  • PHP: composer.lock
  • C/C++: 通过 conan.lock 或二进制 Hash 识别
  • .NET: packages.lock.json
  • Dart: pubspec.lock
  • OS 库 / 系统包: 能检测 Linux 系统包(如 Debian / Alpine 等)
  • 容器镜像扫描: 支持对镜像内 OS 和语言依赖进行扫描

2 支持 SBOM 扫描(重点)

OSV-Scanner 原生支持:

  • SPDX
  • CycloneDX

这意味着:

你可以在“不暴露源码”的前提下做漏洞扫描


安装 OSV-Scanner(多平台)

1 Windows / Linux / macOS

到 github 的release 页下载对应架构的二进制文件:

github.com/google/osv-scanner/releases

下载列表

curl -L https://github.com/google/osv-scanner/releases/latest/download/osv-scanner_linux_amd64 \
  -o /usr/local/bin/osv-scanner

chmod +x /usr/local/bin/osv-scanner

验证:

osv-scanner --version

有类似如下输出:

osv-scanner version: 2.3.1
osv-scalibr version: 0.4.0
commit: d03774202cbaf17a260c2f4a073585baee524b45
built at: 2025-12-11T05:34:53Z

2 Docker 方式(CI 推荐)

docker run -v "${PWD}:/root/.cache/osv-scanner" -v "$(pwd):/src" ghcr.io/google/osv-scanner:latest scan /src

3 GitHub Action(官方)

GitHub 提供两种可重用的工作流:

  1. 一种在每次 拉取请求 时触发扫描,仅报告通过拉取请求引入的新漏洞。
  2. 一种执行完整漏洞扫描,可配置为在推送或 定期计划 时运行。完整漏洞扫描还可配置为 在发布时运行,以防止依赖项中存在已知漏洞的发布。

创建osv扫描事件

修改扫描配置


扫描 Java 项目

简单示例

1 示例项目结构

spring-demo
├── pom.xml
├── src/

执行扫描:

osv-scanner scan pom.xml

2 示例输出解析(插图建议)

重点解释:

  • 不只是告诉你“有漏洞”

  • 而是明确告诉你:

    • 当前版本
    • 修复版本
    • 精确受影响范围

许可证扫描(License Scanning)

不仅报告漏洞,还能检查依赖许可证,例如:

# osv-scanner scan path/to/project --licenses
# 扫描当前路径
osv-scanner scan . --licenses

展示漏洞信息、licenses统计

还能许可证是否符合指定 SPDX 许可清单要求

osv-scanner --licenses="MIT,Apache-2.0" path/to/project

展示漏洞信息、licenses统计、不符合要求和未知的依赖

这个能力对于有合规要求的企业非常有价

离线扫描支持(Offline Scanning)

官方支持 本地离线数据库扫描

  • 首次可以下载整个 OSV 数据库到本地
  • 离线模式不依赖互联网环境
  • 对于内网 CI / 高安全环境非常重要

例如:

osv-scanner --offline --download-offline-databases -L pom.xml

离线库扫描

多种导出格式

可通过 format参数指定多种导出格式 :

  • table(默认为该模式)
  • html
  • vertical
  • json
  • markdown
  • sarif
  • gh-annotations
  • cyclonedx-1-4、 cyclonedx-1-5
  • spdx-2-3

如:

 osv-scanner --offline --download-offline-databases -L pom.xml --format=html > osv.html

美美的漏洞列表页面

可以比较有效的看到哪个包有漏洞、修复版本要升级到哪个版本,以及点击“open in tab” 可以看到漏洞详情


引导式修复建议(Guided Remediation)

官方还支持一种新的特性:

在发现漏洞后,根据依赖深度、最小严重程度、修复策略、升级回报等条件,自动建议和执行修复方案(experimental)

直接替换示例(npm):

osv-scanner fix \
  --max-depth=3 \
  --min-severity=5 \
  --ignore-dev \
  --strategy=in-place \
  -L path/to/package-lock.json

交互模式

osv-scanner fix \
    -M path/to/package.json \
    -L path/to/package-lock.json

交互过程

这意味着 不仅告诉你有漏洞,还能辅助修复它(CLI 层面)。

忽略特定漏洞

在某些情况下,你可能需要暂时忽略某个漏洞(例如,修复版本尚未发布,或需要协调多方升级)。OSV-Scanner允许你通过一个配置文件来管理忽略规则。

在项目根目录创建一个.osv-scanner.toml文件:

[[IgnoredVulns]]
id = "GHSA-xxxx-xxxx-xxxx" # 要忽略的漏洞ID
reason = "Fix is not yet available, vendor is working on a patch."
ignoreUntil = 2026-12-31 # 设置一个过期日期,到期后会重新告警

[[IgnoredVulns]]
id = "CVE-2022-xyz"
reason = "我们使用了自定义的 WAF 规则过滤了该路径,目前风险可控."

这样,在下次扫描时,这些被配置的漏洞将不会出现在告警报告中,同时记录了忽略的原因和时限,便于审计和管理。

更多忽略配置详见官方文档:

google.github.io/osv-scanner/configuration/#ignore-vulnerabilities-by-id


扫描 Python 项目

假设我们有一个简单的Python项目,其依赖关系定义在requirements.txt文件中。为了演示,我们故意引入一个已知存在漏洞的旧版本库。

创建requirements.txt文件:

# 这是一个有漏洞的版本
requests==2.25.0
# 另一个安全的库
tnumpy==1.24.3

requests库的2.25.0版本存在多个已知的漏洞,例如GHSA-j8r2-6x86-q33q

osv-scanner scan requirements.txt

requirements 漏洞扫描结果


扫描一个Node/VUE/React项目

对于Node.js项目,它会扫描package-lock.jsonyarn.lock

 osv-scanner scan package-lock.json  --download-offline-databases --offline --format=html > osv.html
 # 也可以利用 output 参数指定输出文件名
 # osv-scanner scan package-lock.json  --download-offline-databases --offline --format=html --output=osv.html

漏洞扫描结果


扫描整个源码目录(多语言混合项目)

osv-scanner scan source -r .

它会自动识别:

  • pom.xml
  • go.mod
  • requirements.txt
  • package-lock.json

非常适合:

  • Monorepo
  • 微服务代码仓库

扫描Docker镜像

现代应用大多容器化部署。OSV-Scanner也提供了直接扫描Docker镜像的能力,它会同时分析操作系统层面的包(如通过dpkgrpm安装的)和应用层面的依赖。

osv-scanner scan image halohub/halo:2.19.3

这个命令会下载halohub/halo:2.19.3镜像(如果本地已存在则不会再去下载),在内部进行分析,并报告出该基础镜像中所有已知漏洞的系统包,比如openssl, curl, bash等。

这对于DevOps和云原生安全团队来说,是一个巨大的福音。它将安全左移,允许在CI/CD流水线的早期阶段就发现并修复镜像中的漏洞,而不是等到部署到生产环境后才被动响应。


OSV-Scanner + SBOM:企业级最佳实践

1 生成 SBOM(示例)

syft dir:. -o cyclonedx-json > sbom.json

2 扫描 SBOM

osv-scanner scan sbom.json

价值:

  • 扫描速度极快
  • 不暴露源码
  • 合规友好

OSV-Scanner vs. 其他工具:为何选择它?

市面上不乏优秀的开源扫描工具,如Trivy、Grype等。OSV-Scanner的优势何在?

特性OSV-ScannerTrivy / GrypeSnyk (商业版)
数据源OSV.dev (主),辅以其他来源多种源(如NVD, GitHub Advisories)自有漏洞数据库
数据格式优势极高 (基于结构化OSV格式,版本匹配精准)较高 (依赖多种数据源的解析)高 (商业维护,质量好)
Git历史扫描原生支持,核心功能不支持不支持
生态系统支持广泛,持续增长非常广泛非常广泛
许可证开源 (Apache-2.0)开源 (Apache-2.0)商业软件
核心优势精确性、Git历史洞察、与OSV生态深度绑定速度快、功能全面(镜像、文件系统等)易用性、UI集成、自动修复PR

结语

Google 的 osv-scanner 不仅仅是一款工具,它背后代表的是一种全新的、基于标准化的开源安全协作模式。在供应链攻击日益猖獗的今天,掌握并应用好这款利器,是每一位技术管理者和架构师的必修课。如果你只能选择一个依赖漏洞扫描工具

  • 免费
  • 官方
  • 离线支持
  • 低误报
  • 可集成

那一定是:

OSV-Scanner

Q.E.D.


寻门而入,破门而出