相依性 漏洞掃描 API
一次呼叫即可對最多 50 個開源相依套件執行 OSV.dev 檢查,回傳 CVE 編號、計算得出的 CVSS 基礎分數、CWE 分類,以及修補每則公告的確切版本。
整合指南
複製程式碼片段,替換你的 API 金鑰,執行即可。適用於任何 HTTP 用戶端——下方提供 cURL、JavaScript 與 Python 範例。
/api/scan-dependencieshttps://www.apipick.comCheck open-source packages against the OSV.dev vulnerability database
packagesarray必填Up to 50 objects, each with ecosystem, name, and an exact installed version. [{"ecosystem":"npm","name":"lodash","version":"4.17.15"}]
curl -X POST "https://www.apipick.com/api/scan-dependencies" \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"packages": [
{
"ecosystem": "npm",
"name": "lodash",
"version": "4.17.15"
},
{
"ecosystem": "PyPI",
"name": "requests",
"version": "2.19.0"
}
]
}'{
"summary": {
"packages_scanned": 2,
"vulnerable_packages": 2,
"total_vulnerabilities": 8,
"by_severity": {
"critical": 1,
"high": 3,
"medium": 4,
"low": 0,
"none": 0,
"unknown": 0
},
"highest_cvss_score": 9.8
},
"results": [
{
"ecosystem": "npm",
"name": "lodash",
"version": "4.17.15",
"vulnerable": true,
"highest_severity": "HIGH",
"highest_cvss_score": 7.4,
"vulnerability_count": 6,
"vulnerabilities": [
{
"id": "GHSA-35jh-r3h4-6jhm",
"aliases": [
"CVE-2021-23337"
],
"cve": "CVE-2021-23337",
"summary": "Command Injection in lodash",
"severity": "HIGH",
"cvss_score": 7.2,
"cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H",
"cwe_ids": [
"CWE-77"
],
"published": "2021-02-15T00:00:00Z",
"fixed_versions": [
"4.17.21"
],
"advisory_url": "https://osv.dev/vulnerability/GHSA-35jh-r3h4-6jhm"
}
],
"error": null
}
],
"source": "OSV.dev (Google Open Source Vulnerabilities, CC-BY-4.0)",
"credits_used": 5,
"remaining_credits": 95
}為實際使用情境打造
發布關卡
當任一相依套件超過設定的 CVSS 門檻時中斷建置。有了數值分數,政策就是一行數值比較,不必再去比對字串。
程式開發代理
讓代理在把某個版本寫進相依清單前先行查核,並在同一輪回應中建議應升級到的修補版本。
Lockfile 稽核
把整份相依清單以 50 個為一批送出,為每個服務取得一份依嚴重程度彙總的報告,不必在 CI 中另外執行掃描器。
供應商盡職調查
簽約前以可引用的公開漏洞資料,為第三方申報的相依清單進行風險評分。
回應欄位
| 欄位 | 類型 | 說明 |
|---|---|---|
| summary.vulnerable_packages | integer | 所送出的套件中,至少命中一則漏洞公告的數量 |
| summary.by_severity | object | 依 critical / high / medium / low / none / unknown 分級的公告數量 |
| summary.highest_cvss_score | number | null | 本次掃描中出現的最高 CVSS 基礎分數 |
| results[].vulnerable | boolean | 此版本是否存在尚未撤回的漏洞公告 |
| results[].vulnerabilities[].id | string | OSV 公告編號,例如 GHSA-35jh-r3h4-6jhm |
| results[].vulnerabilities[].cve | string | null | 對應的 CVE 編號(若有) |
| results[].vulnerabilities[].severity | string | CRITICAL、HIGH、MEDIUM、LOW、NONE 或 UNKNOWN |
| results[].vulnerabilities[].cvss_score | number | null | 依公告中的向量字串計算出的 CVSS v3.1 基礎分數 |
| results[].vulnerabilities[].cwe_ids | string[] | 該公告對應的 CWE 弱點分類 |
| results[].vulnerabilities[].fixed_versions | string[] | 可修補該公告的本套件版本 |
| results[].error | string | null | 此套件單獨查詢失敗時出現;其餘套件仍會正常回傳 |
| credits_used | integer | 本次請求扣除的點數 |
| remaining_credits | integer | 您帳戶中剩餘的點數 |
速率限制
限流以 API 金鑰計,採用 60 秒滑動視窗。觸發限制時會回傳乾淨的 429,並帶 Retry-After 回應標頭。
20req/min
以 API 金鑰、以端點計。60 秒滑動視窗。
3concurrent
每個 API 金鑰同時進行中的最大請求數。
X-RateLimit-Limit每分鐘允許的最大請求數X-RateLimit-Remaining目前視窗內剩餘的請求數X-RateLimit-Reset目前視窗重設前的秒數Retry-After重試前需等待的秒數(僅在 429 時)HTTP/1.1 429 Too Many Requests
Retry-After: 12
X-RateLimit-Limit: 20
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 12
{
"error": "rate_limit_exceeded",
"message": "Rate limit exceeded: 20 requests/minute per API key. Retry after 12s.",
"retry_after": 12
}資料來源與授權
漏洞公告來自 Google 的開源漏洞資料庫 OSV.dev,以 CC-BY-4.0 授權發布。OSV 將 GitHub Advisory Database、Go 漏洞資料庫、RustSec、PyPA 以及各主要發行版的安全追蹤資料庫整合為同一套 schema。我們在此之上加上 CVSS 基礎分數計算與逐套件彙總。
常見問題
問: 漏洞資料從何而來?
答: 來自 Google 的開源漏洞資料庫 OSV.dev。它將 GitHub Advisory Database、Go 漏洞資料庫、RustSec、PyPA 以及各發行版的安全追蹤資料庫彙整為同一套 schema,並以 CC-BY-4.0 授權發布。新公告通常在發布後數小時內即可查得。
問: CVSS 分數是怎麼算出來的?
答: OSV 公告只帶 CVSS 向量字串,不帶數值。我們依官方公式從該向量計算 CVSS v3.1 基礎分數,因此你拿到的是可直接用來設門檻的數字。若某則公告沒有 v3 向量(僅有 v4,或某些生態系公告本身未提供),cvss_score 為 null,severity 則回退至發布方自己給的評級。
問: 可以掃描整份 lockfile 嗎?
答: 可以 —— 在你這端解析後,每次最多送出 50 個套件。無論一次帶多少個,單次呼叫都是 5 點數,因此 50 個一批相當於每個套件 0.1 點數。相依更多時以 50 個為一批拆分即可。
問: 支援版本範圍嗎?
答: 不支援。請依 lockfile 中的寫法送出確切的已安裝版本(4.17.15,而非 ^4.17.0)。OSV 是拿具體版本去比對受影響範圍來判定的,因此傳入範圍本身並沒有唯一答案。
問: 如果其中一個套件查詢失敗會怎樣?
答: 掃描仍會回傳結果。該套件會帶上 error 欄位並自彙總計數中排除,其餘套件一切照常。回應另會帶上 packages_failed,讓你知道這份彙總並不完整。