適用對象:想檢查自己的應用程式或服務的相依套件裡有沒有混入已知漏洞(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 這類語言專屬工具最大的區別。
原理很簡單。把鎖定檔裡寫明的「實際解析出的版本」列出來,再用每個套件+版本去比對 OSV 的資料,回傳對應的 CVE 與修復版本。它看的是鎖定檔,而不是清單(package.json 裡 ^ 寫法=下限),這一點很重要,也與 以實際執行版本來判定的原則 一致。
2. 安裝
可以按作業系統或喜好挑選安裝方式。下面這些都是官方提供的。
Homebrew(macOS / Linux)
brew install osv-scannerScoop(Windows)
scoop install osv-scannerGo
go install github.com/google/osv-scanner/v2/cmd/osv-scanner@latest執行檔 / Docker
從 releases 直接下載,或 ghcr.io/google/osv-scanner如果不想常駐任何東西、只想在 CI 裡用,也可以不安裝、直接用 Docker 映像檔執行。
# 確認裝好沒
osv-scanner --version3. 執行
基本就兩種:「把整個目錄遞迴掃描」或「點名某個鎖定檔」。
# 遞迴掃描整個專案(自動偵測鎖定檔)
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 的步驟裡,就能在危險相依套件混入時讓建置中止。
作為 CI 的一個步驟放入
osv-scanner scan -r ./。非 0 結束會讓流水線失敗=危險相依套件在合併前就被攔下。用 GitHub 的話也可用官方 Action
google/osv-scanner-action。不過不依賴 GitHub 的單體執行才是 osv-scanner 的強項。不用 GitHub 就用 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 都滿足。這是把 文章裡寫的標準 套用到自己身上的結果,也成了產品的說服力。另外,如果只是想不安裝、馬上在本機試一次,本站也準備了在瀏覽器內即可完成的 相依套件漏洞掃描器(只需貼上鎖定檔、不上傳)。
接著讀
- 按技術:Next.js 的 CVE 因應(以實際執行版本判定、機器監控)
- 術語:CVE / CVSS
- 事故:Codecov — 供應鏈汙染
- 工具:相依套件漏洞掃描器(瀏覽器內完成) / CVE/KEV 查詢
FAQ
Qosv-scanner 是做什麼的工具?
它是一款免費的命令列工具,會讀取你專案的鎖定檔(package-lock.json / pnpm-lock.yaml 等),把所用相依套件的版本拿去和 Google 的 OSV.dev 資料庫比對,查有沒有已知漏洞(CVE)。它不是用於攻擊的工具,而是用來檢查自己腳下的防禦工具。
Q它和 Dependabot 有什麼區別?
Dependabot 是以放置儲存庫為前提的 GitHub 專屬功能,會針對相關 CVE 自動發 PR 通知。osv-scanner 是不依賴 GitHub 的單體執行檔,可以從本機或任意 CI、cron 執行。不使用 GitHub 的架構,或者混有 npm 以外語言的架構,更適合用 osv-scanner。
Q有 npm audit / pnpm audit 還不夠嗎?
如果是單一的 npm/pnpm 專案,內建的 audit 往往就夠了。osv-scanner 派上用場的場景是:npm、PyPI、Go、Rust 等混用時,或者你想要一個不裝額外工具、也不依賴 GitHub 的單體掃描時。它的資料來源(OSV.dev)也是免費的。