
Триаж достижимости для сканирования уязвимостей. Передаёт результаты сканера LLM-агенту, который читает ваш исходный код и определяет, какие CVE действительно достижимы.
Одна команда, которая определяет, действительно ли заявленная уязвимость достижима в заданном дереве исходного кода.
Передайте ей описание CVE или целый отчёт сканирования уязвимостей, и она выполнит анализ достижимости на основе LLM по вашему коду, а затем запишет структурированные вердикты, markdown-отчёты и SARIF, который читает сканирование кода GitHub.
Чтобы снизить затраты, агент не загружает ваш репозиторий в контекст модели. Вместо этого он работает через набор инструментов: ast-grep для структурной навигации по коду, запросы к OSV.dev и рендеринг страниц для извлечения рекомендации и коммита с исправлением; а также загрузку зависимостей, чтобы доставить закреплённую вышестоящую версию в песочницу, когда затронутый компонент собирается, а не поставляется в составе репозитория.
Действие работает на GitHub Copilot через встроенный в workflow
GITHUB_TOKEN. Предоставьте copilot-requests: write, и больше ничего не нужно
настраивать. Использование OWASP Xpsd тарифицируется организации вместе с остальными вашими расходами на Copilot.
permissions:
contents: read
security-events: write
copilot-requests: write # the built-in token authenticates Copilot
Если вы предпочитаете использовать собственную модель, provider-type и api-key переключают запуск на Anthropic, OpenAI или Azure без каких-либо других изменений.
name: reachability
on:
workflow_dispatch:
schedule:
- cron: "0 6 * * 1"
permissions:
contents: read
security-events: write
copilot-requests: write
jobs:
reachability:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: anchore/sbom-action@v0
with: {format: cyclonedx-json, output-file: sbom.cdx.json, upload-artifact: false}
- uses: anchore/scan-action@v6
with: {sbom: sbom.cdx.json, output-format: json, output-file: scan.json, fail-build: false}
- uses: byteray-ai/xpsd@v1
id: xpsd
with:
scan-file: scan.json
model: gpt-5.3-codex
min-severity: high
max-findings: "10" # cap the analyzed findings, highest severity first
# min-cvss: "7.0" # numeric floor instead of the severity band
# is-remote: "true" # only findings shown to be network-reachable (AV:N)
# is-exploited: "true" # only findings CVSS-BT lists as exploited
# max-cycles: "30" # tool-call budget per finding
# max-tokens: "150000" # token budget per finding; first ceiling hit wins
# fail-on: reachable # fail the step when something is reachable
- uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: ${{ steps.xpsd.outputs.sarif-file }}
category: xpsd-reachability
Замените сканер на тот, который вы уже используете. OWASP Xpsd автоматически определяет формат отчёта:
| Производитель | Формат |
|---|---|
| Grype | grype -o json, или SARIF |
| Trivy | trivy -f json, или SARIF |
| OSV-Scanner | --format json |
| Snyk | snyk test --json, одиночный или --all-projects |
| любой производитель SARIF | SARIF 2.1.0 |
| Вердикт | Оповещение | Уровень серьёзности |
|---|---|---|
| достижимо (средняя/высокая уверенность) | error | из CVSS |
| достижимо (низкая уверенность), неопределённо, анализ не удался | warning, требует ручной проверки | из CVSS |
| недостижимо | note, информационное | понижено до low |
Исключённая находка помечается как low, а не сохраняет свой рейтинг CVSS, потому что оценка описывает уязвимость, а не риск, который она представляет для вашего кода. Критическая уязвимость, до которой ничего не может добраться, — это то, что хоронит ту, до которой может. Реальная оценка остаётся в оповещении вместе с обоснованием и доказательствами.
Каждое оповещение содержит обоснование модели, путь вызовов от точки входа до уязвимого использования и ссылки на доказательства в соответствующих строках исходного кода. Повторные запуски обновляют те же оповещения на месте, а находки, исчезнувшие из более поздней загрузки, закрываются автоматически.
Стоимость рассчитывается за находку, по одной агентной сессии на каждую, поэтому фильтрация — это способ сделать
запуск небольшим: min-severity, min-cvss, max-findings и only выбирают, что
просматривать, а is-remote оставляет только находки, показанные как сетевые-достижимые (CVSS
AV:N), и is-exploited оставляет только те, которые набор данных CVSS-BT указывает как
эксплуатируемые. Оба требуют положительных доказательств, поэтому находка, которую они не могут подтвердить,
отбрасывается. fail-on превращает вердикт о достижимости в проваленный шаг, когда вы хотите
заблокировать сборку.
Достижимость также зависит от фактов, которых нет в коде, например от того, что фактически
компилируется или что открыто в сеть. Входной параметр guidance передаёт
их как основополагающие данные для анализа.
Отчёты об ошибках и pull-запросы приветствуются; см. CONTRIBUTING.md. Сообщайте об уязвимостях приватно, как описано в SECURITY.md, где также описаны модель угроз и известные ограничения.
Apache License 2.0, см. LICENSE. Copyright 2026 ByteRay Ltd.