SkillSpector — сканер безопасности для скиллов AI-агентов от NVIDIA

· 5 мин чтения
security agent-skills vulnerability-scanning supply-chain-security nvidia
📂 Исходный код на GitHub

Сканер безопасности для скиллов AI-агентов: находит уязвимости, prompt injection, утечку данных и риски supply chain до установки скилла

SkillSpector — сканер безопасности для скиллов AI-агентов от NVIDIA

SkillSpector — открытый сканер безопасности для скиллов AI-агентов от NVIDIA. Инструмент проверяет скиллы для Claude Code, Codex CLI, Gemini CLI и других кодирующих агентов до установки: находит уязвимости, вредоносные паттерны, prompt injection, утечку данных и риски supply chain. Проект входит в конвейер NVIDIA Verified Skills, который сканирует, оценивает и подписывает скиллы перед публикацией в каталоге NVIDIA.

Зачем проверять скиллы

Скиллы агентов выполняются с полным доверием, и перед установкой их почти никто не проверяет. В исследовательском наборе из 31 132 скиллов 26,1% содержат уязвимости, а 5,2% показывают признаки вредоносного замысла. Скилл может собирать переменные окружения с API-ключами, отправлять контекст диалога на внешние серверы, подменять инструкции агента или закрепляться в системе через cron-задачи.

SkillSpector отвечает на один вопрос: безопасно ли устанавливать этот скилл.

Двухэтапный анализ

Проверка идёт в два этапа. Сначала быстрый статический анализ: правила, AST-разбор Python-кода, taint tracking и YARA-сигнатуры. Затем опциональный семантический анализ через LLM — модель ловит скрытые смыслы, которые не видны статике.

Для LLM-анализа подходит любой OpenAI-совместимый endpoint: OpenAI, Anthropic, AWS Bedrock, Gemini на Google Cloud, Ollama, vLLM, llama.cpp и корпоративные шлюзы. Есть и режимы через локальные CLI-агенты — Claude, Gemini и OpenCode: используется их существующая авторизация, API-ключи не нужны. Флаг --no-llm оставляет только статику: скан быстрее и работает без ключей.

Что ищет сканер

71 паттерн уязвимостей в 17 категориях. Основные:

Категория Что находит
Prompt injection Подмена инструкций, скрытые директивы в комментариях и невидимом тексте, инструкции «спрятанные» пробелами
Data exfiltration Отправка данных на внешние URL, сбор переменных окружения, утечка контекста диалога
Privilege escalation Чтение SSH-ключей, токенов и паролей, запуск с повышенными правами
Supply chain Незакреплённые версии зависимостей, curl \| bash, обфусцированный код, тайпсквоттинг, зависимости с известными CVE
Excessive agency Неограниченный доступ к инструментам, важные решения без человека в контуре
System prompt leakage Выуживание системного промпта напрямую или через обходные каналы
Memory poisoning Контент, который сохраняется между сессиями и подменяет поведение агента
Rogue agent Самомодификация кода в рантайме, закрепление через cron и автозапуск
Dangerous code (AST) exec(), eval(), subprocess, динамические импорты, опасные цепочки исполнения
Taint tracking Поток данных от источника к приёмнику без проверки: переменные окружения — в сеть, файлы — в сеть, внешний ввод — в исполнение кода
MCP least privilege Код использует возможности, не заявленные в правах; wildcard-разрешения
MCP tool poisoning Скрытые директивы в метаданных, юникод-обман через гомоглифы, расхождение описания инструмента с реальным кодом

Некоторые проверки работают вживую: зависимости с уязвимостями сверяются с базой OSV.dev — при отсутствии сети сканер откатывается к офлайн-режиму.

Оценка риска

Каждая находка добавляет очки: CRITICAL — 50, HIGH — 25, MEDIUM — 10, LOW — 5. Наличие исполняемых скриптов умножает счёт на 1,3. Итог — шкала от 0 до 100 с вердиктом:

Баллы Серьёзность Рекомендация
0–20 LOW SAFE
21–50 MEDIUM CAUTION
51–80 HIGH DO NOT INSTALL
81–100 CRITICAL DO NOT INSTALL

Пример отчёта в терминале:

 SkillSpector Security Report  v2.0.0

Skill: suspicious-skill
Source: ./suspicious-skill/

        Risk Assessment
 Score           78/100
 Severity        HIGH
 Recommendation  DO NOT INSTALL

Issues (2)

  HIGH: Env Variable Harvesting (E2)
    Location: scripts/sync.py:23
    Explanation: This code collects environment variables containing
    API keys and secrets, then sends them to an external server.

  HIGH: External Transmission (E1)
    Location: scripts/sync.py:45
    Explanation: Data is being sent to an external server. Combined
    with env harvesting above, this indicates credential exfiltration.

Входы и форматы отчётов

Сканер принимает Git-репозиторий, URL, zip-архив, директорию или один файл SKILL.md. Режим --recursive проверяет коллекцию скиллов — по умолчанию до 32, предел меняется флагом --max-skills. Для больших каталогов есть параллельный batch-сканер из contrib/batch_scan. Отчёт выдаётся в терминал, JSON, Markdown или SARIF — последний формат рассчитан на CI/CD и IDE.

От oversized-загрузок и zip-бомб защищают лимиты: 100 МиБ на вход и 10 000 записей в архиве. Превышение останавливает скан.

Режим MCP-сервера

SkillSpector работает и как MCP-сервер: локальные агенты (Claude Code, Codex CLI, Gemini CLI) вызывают сканирование как инструмент и блокируют установку опасных скиллов прямо в сессии. Проверка становится рантайм-ограничителем, а не отдельным аудитом на стороне:

uv tool install --force 'skillspector[mcp] @ git+https://github.com/NVIDIA/skillspector.git'
skillspector mcp
claude mcp add skillspector -- skillspector mcp

Сервер отдаёт один инструмент — scan_skill. На вход он принимает Git URL, файл или директорию, на выходе — структурированный вердикт: risk_score, severity, recommendation и safe_to_install. В отчёте виден и режим скана, поэтому низкий балл чисто статического скана не спутать с полным LLM-анализом.

HTTP-транспорт работает без авторизации, поэтому привязан только к локальным loopback-адресам; локальные пути и file:// URL по HTTP отклоняются. Для приватных репозиториев предназначен stdio-транспорт или CLI.

Установка и базовое использование

Установка одной командой через uv:

uv tool install git+https://github.com/NVIDIA/skillspector.git

Вариант через Docker — без Python на хосте:

make docker-build
docker run --rm -v "$PWD:/scan" skillspector scan ./my-skill/ --no-llm

Базовые команды:

skillspector scan ./my-skill/                       # локальная директория
skillspector scan ./SKILL.md                        # один файл манифеста
skillspector scan https://github.com/user/my-skill  # Git-репозиторий
skillspector scan ./my-skill.zip                    # zip-архив

Ложные срабатывания и baseline

Знакомые находки можно принять в baseline-файл. Повторные сканы показывают только новые проблемы, а итоговый риск считается без уже разобранных:

skillspector baseline ./my-skill/ -o .skillspector-baseline.yaml
skillspector scan ./my-skill/ --baseline .skillspector-baseline.yaml

Помимо точных отпечатков baseline поддерживает гибкие glob-правила — по идентификатору правила, пути файла или тексту сообщения. Подробности в гайде по подавлению находок и в примере baseline-файла.

Интеграция в CI/CD

Код возврата — стабильный контракт для конвейеров: 0 — безопасно, 1 — риск выше порога либо сработал строгий фильтр, 2 — ошибка. Флаги --fail-on-findings, --fail-on-incomplete и --min-coverage превращают сканер в строгий фильтр: любое срабатывание, неполное покрытие или недостаточная доля проверенных файлов ломает сборку. В связке с SARIF-отчётом сканер встраивается в CI как обычный шаг проверки качества.

Для работы прямо внутри агентской сессии есть расширения: OpenCode extension добавляет команду /skillspector в OpenCode, а Pi extension — аналогичный инструмент для Pi.

Желающим копнуть глубже — гайд по разработке: архитектура, устройство пакетов и способ добавить свой анализатор в конвейер.

Источник: https://github.com/NVIDIA/skillspector