[ безопасность · цепочка поставок ]● 5 кред. · 20 запр./мин

Сканирование уязвимостей в зависимостях

Проверяет до 50 open-source зависимостей в OSV.dev за один вызов. Возвращает псевдонимы CVE, рассчитанную базовую оценку CVSS, идентификаторы CWE и точные версии, в которых устранён каждый бюллетень.

Бюллетени OSV.devОценка по CVSS v3.113 экосистем
auth · x-api-key

Нет API-ключа?

Войдите в аккаунт, чтобы создавать и управлять API-ключами.

[ 02 · integrate ]

Руководство по интеграции

Скопируйте сниппет, подставьте свой API-ключ, запустите. Работает в любом HTTP-клиенте — примеры ниже на cURL, JavaScript и Python.

spec
POST/api/scan-dependencies
base
https://www.apipick.com

Check 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"
    }
  ]
}'
● 200 · ответ
{
  "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_packagesintegerСколько из отправленных пакетов имеют хотя бы один бюллетень
summary.by_severityobjectКоличество бюллетеней по critical / high / medium / low / none / unknown
summary.highest_cvss_scorenumber | nullНаивысшая базовая оценка CVSS по всему сканированию
results[].vulnerablebooleanЕсть ли у этой версии пакета неотозванный бюллетень
results[].vulnerabilities[].idstringИдентификатор бюллетеня OSV, например GHSA-35jh-r3h4-6jhm
results[].vulnerabilities[].cvestring | nullПсевдоним CVE, если он есть
results[].vulnerabilities[].severitystringCRITICAL, HIGH, MEDIUM, LOW, NONE или UNKNOWN
results[].vulnerabilities[].cvss_scorenumber | nullБазовая оценка CVSS v3.1, рассчитанная из вектора бюллетеня
results[].vulnerabilities[].cwe_idsstring[]Классификация слабостей CWE для бюллетеня
results[].vulnerabilities[].fixed_versionsstring[]Версии этого пакета, устраняющие бюллетень
results[].errorstring | nullЗаполняется, если именно этот пакет не удалось проверить; остальные всё равно возвращаются
credits_usedintegerКредитов списано за этот запрос
remaining_creditsintegerКредитов осталось на вашем аккаунте
[ 03 · limits ]

Лимиты запросов

Ограничение действует на API-ключ, скользящее окно 60 секунд. При превышении вы получаете чистый 429 с заголовком Retry-After.

частота запросов

20req/min

На API-ключ, на эндпоинт. Скользящее окно 60 секунд.

параллелизм

3concurrent

Максимум одновременных активных запросов на API-ключ.

заголовки ответа
X-RateLimit-LimitМаксимум запросов в минуту
X-RateLimit-RemainingОсталось запросов в текущем окне
X-RateLimit-ResetСекунд до сброса текущего окна
Retry-AfterСколько секунд ждать перед повтором (только при 429)
● 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, чтобы вы знали, что сводка неполная.