Дата публикации
ai_products

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

Что нового

SkillSpector — это новый open source‑сканер безопасности для «скиллов» AI‑агентов (Claude Code, Codex CLI, Gemini CLI и другие). Он отвечает на простой вопрос: безопасно ли ставить этот навык.

Ключевые факты и цифры:

  • Анализирует навыки до установки и ищет 64 типа уязвимостей в 16 категориях: от prompt‑инъекций и утечки данных до supply chain‑рисков и вредоносного кода.
  • Работает с разными источниками кода: Git‑репозитории, URL, zip‑архивы, директории, отдельные файлы.
  • Использует двухэтапный анализ:
    • быстрый статический сканер (регулярные выражения + AST);
    • опциональный семантический разбор через LLM.
  • Поддерживает онлайн‑проверку зависимостей по базе OSV.dev с автоматическим офлайн‑фолбэком.
  • Считает риск‑скор от 0 до 100 с ярлыками серьёзности (LOW / MEDIUM / HIGH / CRITICAL) и прямой рекомендацией: ставить или «DO NOT INSTALL».
  • Выдаёт отчёты в форматах terminal, JSON, Markdown, SARIF — удобно и для людей, и для CI/CD.
  • Работает с LLM‑провайдерами через OpenAI‑совместимый API: GPT‑5, Claude Opus 4.6, NVIDIA build.nvidia.com, DeepSeek, а также локальные серверы (Ollama, vLLM, llama.cpp).
  • Исходит из реального ресёрча: по данным Liu et al. (2026), 26,1% навыков содержат уязвимости, 5,2% — признаки злонамеренного поведения, а навыки с исполняемыми скриптами уязвимы в 2,12 раза чаще.

SkillSpector можно использовать как CLI‑утилиту, как Python‑библиотеку и как часть пайплайна безопасности в CI/CD.

Как это работает

SkillSpector строится вокруг двухэтапного пайплайна анализа.

Этап 1: статический анализ

Статический слой работает быстро и даёт высокий охват потенциальных проблем:

  • 11 статических анализаторов на регулярных выражениях и шаблонах.
  • AST‑анализ Python‑кода для поиска опасных конструкций:
    • exec(), eval(), compile();
    • subprocess, os.system и другие exec‑семейства;
    • динамические импорты (__import__) и getattr с нелитералами.
  • Проверка зависимостей через OSV.dev (SC4):
    • один batсh‑запрос на все зависимости;
    • кэширование результатов в памяти на 1 час;
    • если сеть недоступна, используется небольшой встроенный список известных CVE.
  • Сканер проходит по всем файлам навыка и ищет 64 паттерна:
    • prompt‑инъекции и утечки контекста;
    • сбор и отправку env‑переменных;
    • привилегированные операции (sudo, доступ к SSH‑ключам и токенам);
    • рискованные практики supply chain (unpinned зависимости, curl | bash, обфускация, typosquatting);
    • злоупотребление инструментами и ресурсами;
    • сигнатуры малвари через YARA и цепочки «taint tracking» (откуда данные и куда они утекают).

Этот этап даёт высокий recall — то есть находит большинство потенциальных проблем, но может давать ложные срабатывания.

Этап 2: семантический анализ через LLM (опционально)

Второй слой — это LLM, который смотрит на контекст и намерения кода:

  • анализирует найденные паттерны в контексте всего навыка;
  • отбрасывает ложные срабатывания;
  • формирует человеческие объяснения, почему фрагмент опасен;
  • повышает точность до около 87%.

SkillSpector умеет работать с несколькими провайдерами через переменную SKILLSPECTOR_PROVIDER:

  • openai — GPT‑5.4 (по умолчанию для этого провайдера);
  • anthropic — Claude Opus 4.6;
  • nv_build — build.nvidia.com (по умолчанию модель deepseek-ai/deepseek-v4-flash).

Можно подключить и локальные OpenAI‑совместимые серверы:

  • Ollama;
  • vLLM;
  • llama.cpp;
  • любые управляемые шлюзы инференса.

Параметры доступа задаются через переменные окружения (OPENAI_API_KEY, ANTHROPIC_API_KEY, NVIDIA_INFERENCE_KEY, OPENAI_BASE_URL). Если нужен только статический анализ, LLM легко отключить флагом --no-llm.

Система оценок риска

SkillSpector присваивает каждому навыку интегральный балл риска от 0 до 100.

Формула:

  • CRITICAL: +50 баллов за каждую проблему;
  • HIGH: +25 баллов;
  • MEDIUM: +10 баллов;
  • LOW: +5 баллов;
  • если в навыке есть исполняемые скрипты — итоговый балл умножается на 1,3.

Интерпретация:

  • 0–20 — LOW / SAFE;
  • 21–50 — MEDIUM / CAUTION;
  • 51–80 — HIGH / DO NOT INSTALL;
  • 81–100 — CRITICAL / DO NOT INSTALL.

SkillSpector не просто выдаёт цифру, а даёт явную рекомендацию: можно ли ставить навык.

Категории уязвимостей

Инструмент закрывает 16 категорий угроз. Краткий обзор:

  1. Prompt Injection (5 паттернов) — попытки переписать системные инструкции, обойти ограничения, вынести контекст наружу или спровоцировать вредные действия.
  2. Data Exfiltration (4) — отправка данных на внешние URL, сбор env‑переменных, обход по файловой системе в поисках чувствительных файлов, утечка контекста диалога.
  3. Privilege Escalation (3) — запрос лишних прав, запуск с sudo/root, доступ к SSH‑ключам и паролям.
  4. Supply Chain (6) — неприжаты версии зависимостей, curl | bash, обфускация, CVE в зависимостях (через OSV.dev), заброшенные библиотеки, typosquatting.
  5. Excessive Agency (4) — слишком широкие полномочия инструмента, автономные решения без человека, расширение функциональности за пределы заявленного, отсутствие лимитов использования ресурсов.
  6. Output Handling (3) — небезопасное использование вывода модели без валидации, пересечение зон доверия, отсутствие лимитов на размер/скорость вывода.
  7. System Prompt Leakage (3) — прямой и косвенный слив системного промпта, включая через файлы и сеть.
  8. Memory Poisoning (3) — попытки записать вредный контент в долговременную память агента, выдавить из контекста safety‑правила, изменить хранимое состояние.
  9. Tool Misuse (3) — опасные параметры (shell=True, --force), цепочки инструментов, обходящие проверки, слишком мягкие настройки по умолчанию (нет TLS, нет аутентификации).
  10. Rogue Agent (2) — сам модифицирующийся код и несанкционированная персистентность (cron, автозапуск).
  11. Trigger Abuse (3) — триггеры, которые срабатывают слишком часто, маскируются под системные команды или провоцируют максимально частую активацию.
  12. Behavioral AST (8) — опасные конструкции в AST: exec, eval, динамические импорты, subprocess, os.system, compile, динамический getattr, комбинации «сетевой ввод/закодированные данные → exec/eval`.
  13. Taint Tracking (5) — отслеживание пути данных: от внешнего ввода или файлов к сети, кода‑исполнению и утечке секретов.
  14. YARA Signatures (4) — совпадения с сигнатурами малвари, вебшеллов, криптомайнеров и эксплойтов.
  15. MCP Least Privilege (4) — нарушения принципа наименьших привилегий в MCP‑инструментах.
  16. MCP Tool Poisoning (4) — скрытые инструкции и обман в метаданных инструментов: невидимые символы, base64, подмена описаний и параметров.

Что это значит для вас

Кому это нужно

SkillSpector полезен, если вы:

  • разрабатываете или интегрируете AI‑агентов и ставите навыки из маркетплейсов;
  • собираете внутренний каталог навыков для сотрудников и хотите минимизировать риск утечек и компрометаций;
  • отвечаете за безопасность и соответствие требованиям (security, compliance) в компании, где активно используют LLM‑агентов;
  • строите платформу вокруг MCP/CLI‑агентов и хотите автоматический security‑гейт в CI/CD.

Ресёрч Liu et al. показывает неприятную картину: каждый четвёртый навык уязвим, а более 5% выглядят откровенно злонамеренными. Это не те цифры, с которыми хочется жить без автоматического сканера.

Как использовать на практике

Несколько типичных сценариев:

  1. Перед установкой навыка из GitHub или маркетплейса:

    • прогоняете skillspector scan <url или путь>;
    • смотрите итоговый скор и список проблем;
    • если результат HIGH/CRITICAL и рекомендация «DO NOT INSTALL» — не ставите навык в прод.
  2. Встроить в CI/CD для своих навыков:

    • добавляете шаг со skillspector scan и выводом в SARIF;
    • подключаете к IDE/Code Scanning, чтобы разработчики видели проблемы до ревью;
    • ставите порог по скору, выше которого билд падает.
  3. Проверять внешние вклады (pull‑requests) в ваш каталог навыков:

    • при каждом PR прогоняете SkillSpector;
    • если новый навык тянет риск на HIGH/CRITICAL — PR блокируется до исправлений.
  4. Аудит существующего каталога:

    • раз в квартал прогоняете все репозитории/директории с навыками;
    • собираете JSON‑отчёты и строите карту рисков.

Где инструмент помогает, а где нет

Сильные стороны:

  • хорошо выявляет структурные проблемы: утечки, небезопасные вызовы, подозрительные зависимости;
  • даёт понятные объяснения по каждому фрагменту кода (при включённом LLM);
  • покрывает не только код, но и метаданные MCP‑инструментов, где часто прячут скрытые инструкции;
  • удобен для автоматизации: CLI, JSON/SARIF, Python API.

Ограничения, о которых лучше знать заранее:

  • Не работает с картинками: текст в изображениях он не видит.
  • Не разбирает зашифрованный или бинарный код: только исходники.
  • Не делает динамический анализ: это статический сканер, он не запускает код.
  • Хуже ловит неанглоязычные паттерны: на других языках часть уязвимостей может пройти мимо.
  • Для полноценных проверок зависимостей по OSV.dev нужен исходящий HTTPS к api.osv.dev. Без него вы получите только статический fallback‑список CVE.

Доступность из России

SkillSpector — это репозиторий на GitHub и локальная утилита. Сам по себе он не заблокирован. Но важные моменты:

  • для LLM‑анализа через GPT‑5 или Claude Opus 4.6 может потребоваться обход региональных ограничений и работающий платёжный аккаунт;
  • доступ к build.nvidia.com и другим провайдерам тоже зависит от вашей сети и политики компании;
  • для OSV.dev нужен доступ к https://api.osv.dev.

Если вы работаете в изолированной сети, можно:

  • использовать только статический анализ (--no-llm);
  • положиться на офлайн‑fallback для CVE;
  • поднять локальный OpenAI‑совместимый сервер (Ollama, vLLM) и подключить его через OPENAI_BASE_URL.

Место на рынке

Сегмент сканеров для AI‑агентов только формируется. Есть несколько направлений:

  • классические SAST/DAST‑инструменты для кода;
  • линтеры для prompt‑инъекций;
  • аудит конфигураций LLM‑платформ.

SkillSpector занимает нишу специализированного сканера именно для «скиллов» агентов и MCP‑инструментов.

Отличительные особенности по фактам из проекта:

  • Фокус не на общем коде, а на структуре навыка агента: SKILL‑описания, MCP‑права, триггеры, метаданные.
  • Большой каталог 64 конкретных паттернов с привязкой к реальным атакам: от curl | bash до YARA‑сигнатур криптомайнеров.
  • Жёсткая числовая оценка риска с простым месседжем «SAFE / DO NOT INSTALL».
  • Поддержка SARIF‑отчётов, что делает его естественным кандидатом для интеграции в существующие security‑пайплайны.
  • Опора на исследование 42 447 навыков с конкретными процентами уязвимостей и злонамеренных скиллов.

Пока нет публичных сравнительных бенчмарков SkillSpector против других сканеров AI‑навыков. Но по объёму описанных категорий и глубине AST/taint‑анализа это уже серьёзный инструмент для тех, кто строит инфраструктуру вокруг агентов.

Установка

SkillSpector распространяется как Python‑пакет. Рекомендуемый сценарий — отдельное виртуальное окружение.

# Клонируем репозиторий

git clone https://github.com/NVIDIA/skillspector.git
cd skillspector

# Создаём и активируем виртуальное окружение

uv venv .venv && source .venv/bin/activate
# или:
python3 -m venv .venv && source .venv/bin/activate

# Установка для продакшн-использования

make install

# Установка с dev-зависимостями

make install-dev

Как запустить

Базовое использование CLI

# Скан локальной директории с навыком

skillspector scan ./my-skill/

# Скан одного файла SKILL.md

skillspector scan ./SKILL.md

# Скан Git-репозитория

skillspector scan https://github.com/user/my-skill

# Скан zip-архива

skillspector scan ./my-skill.zip

Форматы вывода

# Вывод в терминал (по умолчанию) — красиво отформатированный отчёт

skillspector scan ./my-skill/

# JSON — для машинной обработки

skillspector scan ./my-skill/ --format json --output report.json

# Markdown — удобно прикладывать к документации

skillspector scan ./my-skill/ --format markdown --output report.md

# SARIF — для CI/CD и интеграции с IDE

skillspector scan ./my-skill/ --format sarif --output report.sarif

Подключение LLM‑анализа

SkillSpector использует переменную SKILLSPECTOR_PROVIDER для выбора провайдера и соответствующий API‑ключ.

Таблица провайдеров:

  • openai
    • OPENAI_API_KEY (+ опционально OPENAI_BASE_URL)
    • endpoint: api.openai.com или любой OpenAI‑совместимый URL
    • модель по умолчанию: gpt-5.4
  • anthropic
    • ANTHROPIC_API_KEY
    • endpoint: api.anthropic.com
    • модель по умолчанию: claude-opus-4-6
  • nv_build
    • NVIDIA_INFERENCE_KEY
    • endpoint: build.nvidia.com
    • модель по умолчанию: deepseek-ai/deepseek-v4-flash

Примеры настройки:

# Стандартный OpenAI (GPT-5.4)

export SKILLSPECTOR_PROVIDER=openai
export OPENAI_API_KEY=sk-...
skillspector scan ./my-skill/

# Anthropic (Claude Opus 4.6)

export SKILLSPECTOR_PROVIDER=anthropic
export ANTHROPIC_API_KEY=sk-ant-...
skillspector scan ./my-skill/

# NVIDIA build.nvidia.com

export SKILLSPECTOR_PROVIDER=nv_build
export NVIDIA_INFERENCE_KEY=nvapi-...
skillspector scan ./my-skill/

# Локальный Ollama или другой OpenAI-совместимый endpoint

export SKILLSPECTOR_PROVIDER=openai
export OPENAI_API_KEY=ollama
export OPENAI_BASE_URL=http://localhost:11434/v1
export SKILLSPECTOR_MODEL=llama3.1:8b
skillspector scan ./my-skill/

# Переопределить модель провайдера

export SKILLSPECTOR_MODEL=gpt-5.2
skillspector scan ./my-skill/

# Отключить LLM-анализ (только статический, быстрее)

skillspector scan ./my-skill/ --no-llm

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

SkillSpector Security Report v2.0.0
Skill: suspicious-skill
Source: ./suspicious-skill/
Scanned: 2026-01-29 10:30:00 UTC

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

Components (3)
File             Type      Lines Executable
SKILL.md         markdown  142   No
scripts/sync.py  python    87    Yes
requirements.txt text      3     No

Issues (2)
HIGH: Env Variable Harvesting (E2)
Location: scripts/sync.py:23
Finding: for key, val in os.environ.items():...
Confidence: 94%
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
Finding: requests.post("https://api.skill.io/env"...
Confidence: 89%
Explanation: Data is being sent to an external server. Combined with env harvesting above, this indicates credential exfiltration.

Переменные окружения и CLI‑опции

Основные переменные окружения

  • SKILLSPECTOR_PROVIDER — активный LLM‑провайдер: openai, anthropic или nv_build. По умолчанию nv_build.
  • NVIDIA_INFERENCE_KEY — ключ для nv_build (build.nvidia.com). Нужен для LLM‑анализа.
  • OPENAI_API_KEY — ключ для openai. Также используется как второй уровень в «водопаде» учётных данных, если активный провайдер не вернул ключ.
  • OPENAI_BASE_URL — переопределение endpoint’а OpenAI (например, на Ollama).
  • ANTHROPIC_API_KEY — ключ для anthropic.
  • SKILLSPECTOR_MODEL — переопределяет модель по умолчанию для активного провайдера.
  • SKILLSPECTOR_MODEL_REGISTRY — путь к кастомному YAML‑реестру моделей вместо встроенного (src/skillspector/providers/<provider>.yaml).
  • SKILLSPECTOR_LOG_LEVEL — уровень логов: DEBUG, INFO, WARNING, ERROR (по умолчанию WARNING).

CLI‑опции

skillspector scan --help

Options:
  -f, --format [terminal | json | markdown | sarif]  Output format [default: terminal]
  -o, --output PATH                                  Output file path
      --no-llm                                       Skip LLM analysis (static only)
  -V, --verbose                                      Show detailed progress
      --help                                         Show this message and exit

Интеграция с Python

SkillSpector можно вызывать напрямую из Python‑кода, например из собственного пайплайна безопасности или платформы агентов.

from skillspector import graph

# Invoke the LangGraph workflow
result = graph.invoke({
    "input_path": "/path/to/skill",
    "output_format": "json",  # terminal, json, markdown, or sarif
    "use_llm": True,           # False for static-only analysis
})

# Access results
print(f"Risk Score: {result['risk_score']} /100")
print(f"Severity: {result['risk_severity']}")
print(f"Recommendation: {result['risk_recommendation']}")

for finding in result["filtered_findings"]:
    print(f"[{finding['severity']}] {finding['rule_id']}: {finding['message']}")

Как устроена разработка

Для разработки достаточно стандартного Python‑стека с make.

# Клон, venv, активация, установка dev-зависимостей

git clone https://github.com/NVIDIA/skillspector.git
cd skillspector

uv venv .venv && source .venv/bin/activate
# или:
python3 -m venv .venv && source .venv/bin/activate

make install-dev

# Запуск тестов

make test

# Тесты с покрытием

make test-cov

# Линтинг

make lint

# Форматирование кода

make format

Лицензия — Apache 2.0, проект открыт для pull‑request’ов.

Ограничения и исследовательский бэкграунд

SkillSpector честно обозначает ограничения:

  • хуже работает с контентом не на английском языке;
  • не анализирует текст в изображениях;
  • не разбирает зашифрованный или бинарный код;
  • не выполняет код, только статический анализ;
  • без доступа к api.osv.dev проверка CVE ограничена встроенным списком.

Инструмент опирается на исследование "Agent Skills in the Wild: An Empirical Study of Security Vulnerabilities at Scale" (Liu et al., 2026):

  • датасет — 42 447 навыков из крупных маркетплейсов;
  • 26,1% содержат хотя бы одну уязвимость;
  • 5,2% демонстрируют вероятно злонамеренное поведение;
  • навыки с исполняемыми скриптами в 2,12 раза чаще оказываются уязвимыми.

Если вы уже запускаете агентов в проде или только собираетесь, SkillSpector — это разумный минимум для гигиены безопасности вокруг навыков.


Читайте также