
OSV 是什么?OSV-Scanner 又解决了什么问题?
1 OSV(Open Source Vulnerabilities)
OSV 是一个以源码版本为核心的漏洞数据库,而不是传统的:
- CVE + 影响范围模糊描述
OSV 的核心优势在于:
| 维度 | 传统 CVE | OSV |
|---|---|---|
| 漏洞定位 | 模糊版本区间 | 精确到 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 提供两种可重用的工作流:


扫描 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

还能许可证是否符合指定 SPDX 许可清单要求
osv-scanner --licenses="MIT,Apache-2.0" path/to/project

这个能力对于有合规要求的企业非常有价
离线扫描支持(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

扫描一个Node/VUE/React项目
对于Node.js项目,它会扫描package-lock.json或yarn.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镜像的能力,它会同时分析操作系统层面的包(如通过dpkg或rpm安装的)和应用层面的依赖。
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-Scanner | Trivy / Grype | Snyk (商业版) |
|---|---|---|---|
| 数据源 | 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.


