跳到正文
>_ITDITDWeb 安全平台

安全指南

osv-scanner 的安装与使用:用机器找出依赖包里的 CVE

osv-scanner 是一款免费工具,能从锁文件出发,机器化地检查你项目的依赖包里有没有已知漏洞(CVE)。本站从运维视角讲解它在 Go/Homebrew/Scoop/Docker 上的安装、对锁文件与容器的扫描、集成到 CI,以及它与 npm/pnpm audit、Dependabot 的取舍。

发布于 2026-06-11 更新于 2026-06-11 3 分钟阅读

适用对象:想检查自己的应用或服务的依赖包里有没有混入已知漏洞(CVE)的人。尤其适合「靠 AI 帮忙做出来了,但依赖的安全性全凭摸索」的人。这里完全不涉及攻击手法。只讲检查自己脚下(自己的锁文件)的防御

本站的观点:选工具的正确答案由『你的架构』决定

老实说,本站自己用的不是 osv-scanner,而是 pnpm audit(本站采用不在 GitHub 放仓库的架构,且只有 npm 单一语言,所以自带的 audit 就够用)。osv-scanner 成为正确答案的情形是 ①多语言混用(npm+PyPI+Go 等)②想要一个不依赖 GitHub 的单体扫描③想连容器镜像一起检查 ——符合其中任意一条时。别因为「热门就装」,而要看是否契合自己的架构再选。

1. osv-scanner 是什么

它是 Google 用 Go 语言开发的开源漏洞扫描器。漏洞数据用的是跨语言的开放漏洞数据库 OSV.dev。它不只能读 npm,还能横跨 PyPI(Python)、Go、Rust、Maven(Java)等众多生态的锁文件——这正是它与 npm audit 这类语言专属工具最大的区别。

免费
许可证 / 数据源
多语言
npm/PyPI/Go/Rust 等
OSV.dev
漏洞数据的出处
几分钟
安装所需时间

原理很简单。把锁文件里写明的「实际解析出的版本」列出来,再用每个包+版本去比对 OSV 的数据,返回对应的 CVE 与修复版本。它看的是锁文件,而不是清单(package.json^ 写法=下限),这一点很重要,也与 以实际运行版本来判定的原则 一致。

2. 安装

可以按操作系统或喜好挑选安装方式。下面这些都是官方提供的。

Homebrew(macOS / Linux)

brew install osv-scanner

Scoop(Windows)

scoop install osv-scanner

Go

go install github.com/google/osv-scanner/v2/cmd/osv-scanner@latest

二进制 / Docker

从 releases 直接下载,或 ghcr.io/google/osv-scanner
安装就一行。挑一个适合你环境的即可。go install 需要 Go 1.26 以上。

如果不想常驻任何东西、只想在 CI 里用,也可以不安装、直接用 Docker 镜像运行。

# 确认装好没
osv-scanner --version

3. 运行

基本就两种:「把整个目录递归扫描」或「点名某个锁文件」。

# 递归扫描整个项目(自动检测锁文件)
osv-scanner scan -r ./
 
# 点名锁文件(npm / pnpm / yarn 等)
osv-scanner scan -L pnpm-lock.yaml
 
# 以 JSON 输出结果(交给 CI 或别的工具时)
osv-scanner scan -L package-lock.json --format json
 
# 连容器镜像一起检查
osv-scanner scan image my-app:latest

用 Docker 镜像(无需安装)运行的例子:

docker run --rm -v "$(pwd):/src" ghcr.io/google/osv-scanner:latest scan -r /src

怎么读输出

如果命中,会以表格列出包名、当前版本、CVE/Advisory ID、修复版本。要做的只有一件事——升到修复版本以上、更新锁文件、再跑一次确认它已经消失。如果想细看某个 CVE 编号的内容(严重度或被利用情况),把编号粘到 CVE/KEV 查询,一屏就能确认 CVSS 以及是否处于被利用状态(KEV)。

不必现在就全部修好

就算检出一大堆,也不用慌着全部升级。优先级按「是否真的正在被利用(KEV)」×「CVSS 的高低」来定。没用到的路径上的高分,不如正在被利用的中分该先处理。更详细的修复思路整理在 Next.js 的 CVE 应对 里。

4. 让它持续运行(集成进 CI / cron)

手动跑一次就完事,是没有意义的。只有在每次构建前、或每天的 cron 里自动执行,才真正起作用。osv-scanner 找到漏洞时会返回非 0 的退出码,所以把它直接放进 CI 的步骤里,就能在危险依赖混入时让构建中止。

1

作为 CI 的一个步骤放入

在测试前后加一步 osv-scanner scan -r ./。非 0 退出会让流水线失败=危险依赖在合并前就被拦下。
2

用 GitHub 的话也可用官方 Action

如果仓库在 GitHub,也可以用 google/osv-scanner-action。不过不依赖 GitHub 的单体运行才是 osv-scanner 的强项。
3

不用 GitHub 就用 cron

在部署服务器或本机的 cron 上按日执行,把检出结果发到日志或邮件。本站把依赖审计放在每次部署前+每日 cron 上跑(后述)。

5. 与其他工具的取舍

别「先上 osv-scanner 再说」,而要在自己的架构里挑最顺手的那个才对。

适合用 osv-scanner

  • 混有 npm 以外的语言(PyPI / Go / Rust / Java 等多语言)
  • 想要不依赖 GitHub的单体扫描(cron、任意 CI)
  • 想连容器镜像一起检查
  • 想不加额外 SaaS、不付费,用免费数据源(OSV.dev)搞定

不必勉强使用

  • 单一的 npm/pnpm 项目 → 自带的 npm audit / pnpm audit 往往就够
  • 以 GitHub 为中心的开发 → Dependabot 连自动 PR 都帮你做好,省事
  • 仅仅因为「热门」→ 那不能成为选型理由

总之,osv-scanner、pnpm audit、Dependabot 不是竞争关系,而是分工不同。需要跨多语言且不依赖 GitHub 就用 osv-scanner,单一 npm 用自带 audit,以 GitHub 为中心就用 Dependabot——叠着用也无妨。重要的是「一定要有某一个在自动持续运行」。面对经由供应链的混入(像 Codecov 事件xz-utils 后门 那样),对依赖的持续检查就是第一道防线。

本站自己是怎么做的

本站对依赖的自我审计,是pnpm audit 放在每次部署前必跑+每日 cron(一旦出现 high/critical 就中止构建并发邮件通知)。没选 osv-scanner,是因为本站采用不在 GitHub 放仓库的架构、依赖也是 npm 单一——「免费、无需额外二进制、不依赖 GitHub」这些条件,pnpm audit 都满足。这是把 文章里写的标准 套用到自己身上的结果,也成了产品的说服力。另外,如果只是想不安装、马上在本机试一次,本站也准备了在浏览器内即可完成的 依赖包漏洞扫描器(只需粘贴锁文件、不上传)。

接着读

FAQ

Qosv-scanner 是做什么的工具?
A

它是一款免费的命令行工具,会读取你项目的锁文件(package-lock.json / pnpm-lock.yaml 等),把所用依赖包的版本拿去和 Google 的 OSV.dev 数据库比对,查有没有已知漏洞(CVE)。它不是用于攻击的工具,而是用来检查自己脚下的防御工具。

Q它和 Dependabot 有什么区别?
A

Dependabot 是以放置仓库为前提的 GitHub 专属功能,会针对相关 CVE 自动发 PR 通知。osv-scanner 是不依赖 GitHub 的单体二进制,可以从本地或任意 CI、cron 运行。不使用 GitHub 的架构,或者混有 npm 以外语言的架构,更适合用 osv-scanner。

Q有 npm audit / pnpm audit 还不够吗?
A

如果是单一的 npm/pnpm 项目,自带的 audit 往往就够了。osv-scanner 派上用场的场景是:npm、PyPI、Go、Rust 等混用时,或者你想要一个不装额外工具、也不依赖 GitHub 的单体扫描时。它的数据源(OSV.dev)也是免费的。