Сканирование уязвимостей в зависимостях
Проверяет до 50 open-source зависимостей в OSV.dev за один вызов. Возвращает псевдонимы CVE, рассчитанную базовую оценку CVSS, идентификаторы CWE и точные версии, в которых устранён каждый бюллетень.
Нет API-ключа?
Войдите в аккаунт, чтобы создавать и управлять API-ключами.
Руководство по интеграции
Скопируйте сниппет, подставьте свой 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. Числовая оценка превращает политику в однострочное сравнение чисел вместо сопоставления строк.
Агенты-программисты
Пусть агент проверит версию, прежде чем записать её в манифест, и в том же ответе предложит исправленную.
Аудит lock-файлов
Пропустите весь манифест партиями по 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
}Источник данных и лицензия
Бюллетени поступают из OSV.dev — открытой базы уязвимостей Google, публикуемой под CC-BY-4.0. OSV сводит в единую схему GitHub Advisory Database, базу уязвимостей Go, RustSec, PyPA и трекеры безопасности основных дистрибутивов. Мы добавляем расчёт базовой оценки CVSS и сводку по каждому пакету.
Часто задаваемые вопросы
В: Откуда берутся данные об уязвимостях?
О: Из OSV.dev — открытой базы уязвимостей Google. Она сводит в единую схему GitHub Advisory Database, базу уязвимостей Go, RustSec, PyPA и трекеры безопасности дистрибутивов и публикует их под CC-BY-4.0. Новые бюллетени обычно доступны в течение нескольких часов после публикации.
В: Как рассчитывается оценка CVSS?
О: Бюллетени OSV содержат строку вектора CVSS, но не само число. Мы вычисляем базовую оценку CVSS v3.1 из этого вектора по официальной формуле, поэтому вы получаете значение, по которому можно сразу задать порог. Если у бюллетеня нет вектора v3 (только v4 либо бюллетень экосистемы без вектора), cvss_score равен null, а severity берётся из собственной оценки издателя.
В: Можно ли просканировать весь lock-файл?
О: Да: разберите его на своей стороне и отправляйте до 50 пакетов за вызов. Вызов стоит 5 кредитов независимо от количества пакетов, поэтому партия из 50 обходится в 0,1 кредита на пакет. Более крупные манифесты разбивайте на партии по 50.
В: Поддерживаются ли диапазоны версий?
О: Нет. Отправляйте точную установленную версию в том виде, в каком она указана в lock-файле (4.17.15, а не ^4.17.0). OSV сопоставляет диапазоны с конкретной версией, чтобы определить, затронута ли она, поэтому у диапазона на входе нет единственного ответа.
В: Что произойдёт, если запрос по одному пакету не удастся?
О: Сканирование всё равно вернётся. У этого пакета появится поле error, и он не попадёт в итоговые счётчики, а по остальным данные придут как обычно. В ответе также будет packages_failed, чтобы вы знали, что сводка неполная.