SkillSpector — сканер безопасности для скиллов AI-агентов от NVIDIA
📂 Исходный код на GitHubСканер безопасности для скиллов AI-агентов: находит уязвимости, prompt injection, утечку данных и риски supply chain до установки скилла
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