Сценарий 20 помогает инженеру и специалисту AppSec разобраться в сторонних пакетах проекта: какие зависимости используются, где обнаружены известные уязвимости и какие лицензии указаны для пакетов. Результаты можно собрать в SBOM — перечень компонентов программного обеспечения — и использовать при выборе обновлений.
Начните с состава зависимостей. Например, серверная библиотека входит в приложение, а компилятор TypeScript нужен для разработки: фильтр development-зависимостей позволяет получить оба списка для разных задач. Затем сопоставьте пакеты с источником уязвимостей и правилами лицензирования.
Выберите способ анализа
| Задача | Способ | Результат |
|---|---|---|
| Локальная инвентаризация манифестов | Python: DependencyGraphBuilder.scan_project() |
Список пакетов, версий и признаков прямой и development-зависимости. Полный пример приведён ниже. |
| Проверка уязвимостей | SCA и SBOM | SBOM и отчёт OSV по lock-файлу проекта. |
| Проверка лицензий | python -m src.cli deps licenses |
Сопоставление лицензий с правилами проекта. |
| SCA зарегистрированного проекта | /api/v1/security/sca/projects/{project_name}/... |
Состав, уязвимости и SBOM проекта из серверного реестра. |
| Анализ результатов специалистом AppSec | Типизированный вызов сценария 20 | Ответ по задаче со ссылками на инвентаризацию и отчёты. |
Полный пример инвентаризации
Подготовьте Python-окружение проекта по руководству CLI. В корне репозитория CodeGraph создайте каталог dependency_example и сохраните следующий манифест в dependency_example/package.json:
{
"name": "dependency-example",
"version": "1.0.0",
"dependencies": {
"express": "4.18.2"
},
"devDependencies": {
"typescript": "5.4.5"
}
}
В корне репозитория сохраните программу dependency_inventory.py:
import json
from src.dependencies import DependencyGraphBuilder
builder = DependencyGraphBuilder()
for include_dev in (True, False):
graph = builder.scan_project("dependency_example", include_dev=include_dev, max_depth=10)
packages = sorted(
({"name": dep.name, "version_spec": dep.version_spec,
"is_dev": dep.is_dev, "is_direct": dep.is_direct}
for dep in graph.dependencies.values()),
key=lambda dep: dep["name"],
)
print(json.dumps({"include_dev": include_dev, "files": len(graph.files),
"packages": packages}))
Запустите её в PowerShell:
python dependency_inventory.py
Программа выводит два JSON-объекта. В обоих поле files содержит 1: найден один манифест. При include_dev=true список packages содержит express со спецификацией версии 4.18.2 и typescript с 5.4.5. При include_dev=false остаётся только express. Обе зависимости прямые; у typescript поле is_dev=true.
scan_project находит поддерживаемые манифесты, выбирает парсеры и добавляет разобранные зависимости в список. При добавлении пакетов он применяет фильтр development-зависимостей. Вызов читает манифест и возвращает граф в памяти. Запросы к источникам уязвимостей и оценка лицензий выполняются отдельно. Версии выше служат фиксированными входными данными для примера разбора.
Проверьте уязвимости и лицензии через CLI
Для отчёта об уязвимостях и экспорта состава пакетов используйте руководство SCA и SBOM: оно показывает подготовку lock-файла, создание SBOM и проверку по OSV. Сохраните отчёт вместе с ревизией проекта, параметрами анализа и кодом завершения, чтобы сравнить результаты после обновления пакета.
В текущей версии deps check-vulns прерывается с ValueError, когда OSV возвращает находку с уровнем unknown; JSON-отчёт не создаётся. Эта команда исключена из исполняемых инструкций страницы.
Для проверки лицензий перейдите в корень анализируемого проекта. Подготовьте доступ Python к CodeGraph через установленный пакет или PYTHONPATH и локальный config.yaml, как описано в руководстве CLI. Команда читает манифесты текущего каталога:
python -m src.cli deps licenses --check-compliance --allow MIT Apache-2.0 --deny GPL-3.0
Задайте разрешённые и запрещённые лицензии по правилам вашего проекта. Команда сопоставляет идентификаторы из манифестов и lock-файлов с этими списками. Например, пакет с лицензией ISC при показанном списке MIT Apache-2.0 попадёт в таблицу с причиной not in allowed list; команда вернёт код 1. Для разрешённого пакета MIT такого нарушения не будет.
Проверка обрабатывает пакеты с заполненным полем лицензии. Значение UNKNOWN пропускается при сопоставлении списков. Если лицензия не указана, получите её идентификатор из источника пакета и дополните инвентаризацию перед оценкой.
Команды deps scan, deps list, deps graph, deps health и deps update в текущей версии завершаются с AttributeError. Для получения состава пакетов используйте Python-пример выше; эти пять CLI-команд исключены из исполняемых инструкций этой страницы.
Учитывайте сеть, кеш и актуальность
По умолчанию проверка использует OSV — базу известных уязвимостей. Для запроса нужен исходящий доступ к сети, если подходящей записи нет в локальном кеше. Для аудита зарегистрированного проекта дополнительные источники включаются в конфигурации: GitHub Advisory использует GITHUB_TOKEN, а NVD — NVD_API_KEY.
Сохраняйте вместе с отчётом активные источники, время запроса, время ожидания ответа, путь и TTL кеша — срок хранения записи. Для результата из кеша укажите возраст записи. При ошибке источника сохраните его сообщение и повторите проверку после восстановления доступа; так отчёт сохраняет связь с фактически полученными данными.
Получите результаты через REST API
REST API доступен по адресу /api/v1/security/sca. Подготовьте зарегистрированный проект с указанным source_path и войдите под пользователем с доступом к проекту. Используйте токен доступа из ответа POST /api/v1/auth/token. Для интеграции с выданным API-ключом передавайте X-API-Key вместо заголовка Bearer. Маршруты аутентификации перечислены в справочнике REST API.
Маршруты чтения используют локальные результаты SCA. Если сохранённой сводки нет, CodeGraph читает манифесты из source_path и собирает инвентаризацию. Эти GET-запросы используют сохранённые сведения об уязвимостях и не запускают запросы к внешним источникам.
GET /api/v1/security/sca/projects/{project_name}/summary— сводка и состояние её данных.GET /api/v1/security/sca/projects/{project_name}/dependencies— список пакетов с пагинацией.GET /api/v1/security/sca/projects/{project_name}/vulnerabilities— находки из локальных результатов SCA.GET /api/v1/security/sca/projects/{project_name}/sbom— экспорт SBOM; параметрformatвыбираетspdx(по умолчанию) илиcyclonedx.
В PowerShell задайте адрес сервера без завершающего слеша, имя зарегистрированного проекта и его UUID. Передайте токен доступа в переменную CODEGRAPH_ACCESS_TOKEN через одобренный канал конфигурации. Пример получает сводку и первую страницу пакетов:
$api = '<api-base-url>'
$project = [uri]::EscapeDataString('<project-name>')
if (-not $env:CODEGRAPH_ACCESS_TOKEN) { throw 'Access token is not configured' }
$headers = @{
Authorization = "Bearer $env:CODEGRAPH_ACCESS_TOKEN"
'X-Project-Id' = '<project-uuid>'
}
$summary = Invoke-RestMethod -Uri "$api/api/v1/security/sca/projects/$project/summary" -Headers $headers
$dependencies = Invoke-RestMethod -Uri "$api/api/v1/security/sca/projects/$project/dependencies?limit=20&offset=0" -Headers $headers
$summary.scan_status
$dependencies | Select-Object total, limit, offset, has_next, has_prev
$dependencies.items | Select-Object name, version, resolved_version, is_dev, is_direct, license
Для собранной сводки scan_status равен ready. Поле total содержит общее число пакетов, items — текущую страницу, а has_next показывает наличие следующей. Для следующей страницы увеличьте offset на limit.
При 401 проверьте учётные данные и способ авторизации; 404 означает неизвестный проект. Состояния сводки source-path-missing, source-path-invalid и scan-error указывают соответственно на незаданный путь, недоступный каталог или ошибку разбора. Сохраните ответ вместе с именем проекта и ревизией исходников.
Запустите типизированный сценарий AppSec
Используйте настроенное окружение из программного руководства, принятую задачу AppSec и необходимые сервисы CodeGraph. Сохраните пример в файл Python. Задайте в контексте проект, пространство имён (namespace), задачу и ссылки на отчёты. Настройте LLM для работы сценария. Сохраните инвентаризацию манифестов и предупреждения источников уязвимостей вместе с ответом.
from src.digital_employees.runtime.scenarios import (
RoleBoundScenarioInvocationRequest,
invoke_role_bound_scenario_request,
)
request = RoleBoundScenarioInvocationRequest(
query="Проанализируй риски зависимостей, уязвимостей, лицензий и SBOM для ограниченного проекта.",
employee_id="codegraph_appsec",
scenario_id="scenario_20",
event_type="appsec_start",
context={
"project_key": "codegraph",
"namespace": "default",
"task_id": "<task-id>",
"source_refs": ["<revision-ref>", "<dependency-artifact-ref>"],
},
)
result = invoke_role_bound_scenario_request(request)
if result.get("error"):
raise RuntimeError(result["error"])
if not result.get("scenario_id") or not result.get("answer"):
raise RuntimeError("Scenario returned no scenario identity or answer")
print(result["answer"])
В ответе сценария найдите пакеты, связанные с рисками, основания выводов и предложенные действия. Сопоставьте выводы с приложенными отчётами. После обновления пакетов повторите инвентаризацию и проверку уязвимостей, чтобы увидеть изменение состава и находок.