Назад к обновлениям
New releaseSep 4, 2026

skill-scanner v2.0.14

Сканер безопасности для навыков агента

Поделиться

Skill Scanner

License Python 3.10+ PyPI version CI Discord Cisco AI Defense AI Security Framework Ask DeepWiki

Сканер безопасности, работающий по принципу наилучшего усилия, для AI Agent Skills, который обнаруживает внедрение промптов, утечку данных и вредоносные шаблоны кода. Объединяет обнаружение на основе шаблонов (YAML + YARA), LLM-as-a-judge и анализ потоков данных поведения для максимального охвата обнаружения вероятных угроз при минимизации ложных срабатываний.

Важно: Этот сканер обеспечивает обнаружение по принципу наилучшего усилия, а не исчерпывающий или полный охват. Сканирование, не вернувшее результатов, не гарантирует, что навык свободен от всех угроз. См. Область применения и ограничения ниже.

Поддерживает форматы OpenAI Codex Skills и Cursor Agent Skills в соответствии со спецификацией Agent Skills. С флагом --lenient также сканирует нестандартные форматы, такие как Claude Code .claude/commands/*.md и плоские репозитории навыков в markdown.


Ключевые возможности

  • Многофакторное обнаружение — статический анализ, анализ потоков данных поведения, семантический анализ LLM и облачное сканирование для многоуровневого охвата по принципу наилучшего усилия
  • Фильтрация ложных срабатываний — мета-анализатор значительно снижает шум, сохраняя способность обнаружения
  • Готовность к CI/CD — вывод SARIF для GitHub Code Scanning, переиспользуемый рабочий процесс GitHub Actions, коды выхода для сбоев сборки
  • Pre-commit Hook — интеграция со стандартным фреймворком pre-commit для сканирования навыков перед каждым коммитом
  • Расширяемость — архитектура плагинов для пользовательских анализаторов

Присоединяйтесь к Cisco AI Discord, чтобы обсудить, поделиться отзывами или связаться с командой.


Область применения и ограничения

Skill Scanner — это инструмент обнаружения. Он выявляет известные и вероятные шаблоны риска, но не сертифицирует безопасность.

Ключевые ограничения:

  • Отсутствие находок ≠ отсутствие риска. Сканирование, возвращающее «No findings», указывает на то, что известные шаблоны угроз не были обнаружены. Это не гарантирует, что навык безопасен, безвреден или свободен от уязвимостей.
  • Охват по своей природе неполон. Сканер объединяет обнаружение на основе сигнатур, семантический анализ на основе LLM, анализ потоков данных поведения, опциональные облачные сервисы и настраиваемые наборы правил. Хотя этот подход улучшает охват, ни один автоматизированный инструмент не может обнаружить все техники, особенно новые или zero-day атаки.
  • Возможны ложные срабатывания и ложные пропуски. Режимы консенсуса и мета-анализ снижают шум, но ни одна конфигурация не устраняет все некорректные классификации. Настройте политику сканирования под вашу толерантность к риску.
  • Ручная проверка остаётся необходимой. Автоматизированное сканирование — один из компонентов стратегии эшелонированной защиты. Для высокорисковых или производственных развёртываний следует сочетать результаты сканера с ручной проверкой кода и/или моделированием угроз.

Документация

РуководствоОписание
Быстрый стартНачните за 5 минут
АрхитектураПроектирование системы и компоненты
Таксономия угрозПолная таксономия угроз AITech с примерами
LLM AnalyzerКонфигурация и использование LLM
Meta-AnalyzerФильтрация ложных срабатываний и приоритизация
Behavioral AnalyzerДетали анализа потоков данных
Политика сканированияПользовательские политики, пресеты и руководство по настройке
Краткий справочник по политикамКомпактный справочник по разделам и параметрам политик
Создание правилКак добавлять сигнатуры, YARA и правила Python
GitHub ActionsПереиспользуемый рабочий процесс для интеграции с CI/CD
Справочник по APIДокументация REST API
Руководство по разработкеУчастие в разработке и настройка окружения

Установка

Предварительные требования: Python 3.10+ и uv (рекомендуется) или pip

# Using uv (recommended)
uv pip install cisco-ai-skill-scanner

# Using pip
pip install cisco-ai-skill-scanner
Дополнения для облачных провайдеров
# AWS Bedrock support
pip install cisco-ai-skill-scanner[bedrock]

# Google AI Studio / Gemini support
pip install cisco-ai-skill-scanner[google]

# Google Vertex AI support
pip install cisco-ai-skill-scanner[vertex]

# Azure OpenAI support
pip install cisco-ai-skill-scanner[azure]

# All cloud providers
pip install cisco-ai-skill-scanner[all]

Быстрый старт

Настройка окружения (опционально)

# For LLM analyzer and Meta-analyzer
export SKILL_SCANNER_LLM_API_KEY="your_api_key"
export SKILL_SCANNER_LLM_MODEL="claude-3-5-sonnet-20241022"
# Optional: disabled, minimal, low, medium, high, xhigh, or max
export SKILL_SCANNER_LLM_REASONING_EFFORT="low"

# For VirusTotal binary scanning
export VIRUSTOTAL_API_KEY="your_virustotal_api_key"

# For Cisco AI Defense
export AI_DEFENSE_API_KEY="your_aidefense_api_key"

Интерактивный мастер

Не уверены, какие флаги использовать? Запустите skill-scanner без аргументов, чтобы открыть интерактивный мастер:

skill-scanner

Мастер проведёт вас через выбор цели сканирования, анализаторов, политики и формата вывода, а затем покажет собранную команду перед её запуском. Отлично подходит для изучения CLI.

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

# Scan a single skill (core analyzers: static + bytecode + pipeline)
skill-scanner scan /path/to/skill

# Scan with behavioral analyzer (dataflow analysis)
skill-scanner scan /path/to/skill --use-behavioral

# Scan with all engines
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense

# Scan with meta-analyzer for false positive filtering
skill-scanner scan /path/to/skill --use-llm --enable-meta

# Scan with trigger analyzer for vague description checks
skill-scanner scan /path/to/skill --use-trigger

# Run LLM analyzer multiple times and keep majority-agreed findings
skill-scanner scan /path/to/skill --use-llm --llm-consensus-runs 3

# Scan multiple skills recursively
skill-scanner scan-all /path/to/skills --recursive --use-behavioral

# Scan multiple skills with cross-skill overlap detection
skill-scanner scan-all /path/to/skills --recursive --check-overlap

# Scan a GitHub repository (owner/repo shorthand or full URL)
skill-scanner scan-repo owner/repo
skill-scanner scan-repo https://github.com/owner/repo --use-llm

# Lenient mode: tolerate malformed skills instead of failing
skill-scanner scan /path/to/skill --lenient
skill-scanner scan-all /path/to/skills --recursive --lenient

# Lenient mode with non-standard skill formats (no SKILL.md required)
skill-scanner scan .claude/commands/deploy --lenient
skill-scanner scan-all .claude/commands --recursive --lenient

# Use a custom metadata filename instead of SKILL.md
skill-scanner scan /path/to/skill --skill-file README.md

# CI/CD: Fail build if threats found
skill-scanner scan-all ./skills --fail-on-severity high --format sarif --output results.sarif

# Generate interactive HTML report with attack correlation groups
skill-scanner scan /path/to/skill --use-llm --enable-meta --format html --output report.html

# Use custom YARA rules
skill-scanner scan /path/to/skill --custom-rules /path/to/my-rules/

# Use custom taxonomy + threat mapping profiles (JSON/YAML)
skill-scanner scan /path/to/skill --taxonomy /path/to/taxonomy.json --threat-mapping /path/to/threat_mapping.json

# VirusTotal hash scan with optional unknown-file uploads
skill-scanner scan /path/to/skill --use-virustotal --vt-upload-files

# Use a scan policy preset (strict, balanced, permissive)
skill-scanner scan /path/to/skill --policy strict

# Use a custom org policy file
skill-scanner scan /path/to/skill --policy my_org_policy.yaml

# Generate a policy file to customise
skill-scanner generate-policy -o my_org_policy.yaml

# Interactive policy configurator (TUI)
skill-scanner configure-policy

Режим консенсуса сохраняет находку только тогда, когда она появляется более чем в половине настроенных запусков. Когда эти голоса расходятся в оценке серьёзности, побеждает наивысшая наблюдаемая серьёзность, независимо от порядка ответов. Неудачные запуски и успешные запуски, в которых находка отсутствует, не голосуют, но остаются в знаменателе. Это делает выбор серьёзности стабильным для находок, согласованных большинством. Это не делает отдельную выборку LLM детерминированной, и описательные поля из голосов с равной серьёзностью, вывод одиночного запуска и находки без большинства всё ещё могут различаться между сканированиями.

Примечание о провайдере LLM: --llm-provider в настоящее время принимает anthropic или openai. Для Bedrock, Vertex, Azure, Gemini и других бэкендов LiteLLM задайте специфичные для провайдера строки моделей и переменные окружения (см. документацию LLM Analyzer).

Python SDK

from skill_scanner import SkillScanner
from skill_scanner.core.analyzers import BehavioralAnalyzer

# Create scanner with analyzers
scanner = SkillScanner(analyzers=[
    BehavioralAnalyzer(),
])

# Scan a skill
result = scanner.scan_skill("/path/to/skill")

print(f"Findings: {len(result.findings)}")
print(f"Max severity: {result.max_severity}")

# Note: is_safe indicates no HIGH/CRITICAL findings were detected.
# It does not guarantee the skill is free of all risk.
if not result.is_safe:
    print("Issues detected -- review findings before deployment")

Анализаторы безопасности

АнализаторМетод обнаруженияОбластьТребования
StaticШаблоны YAML + YARAВсе файлыНет
BytecodeПроверка целостности .pycБайт-код PythonНет
PipelineАнализ заражения командShell-конвейерыНет
BehavioralАнализ потоков данных ASTФайлы PythonНет
LLMСемантический анализSKILL.md + скриптыAPI-ключ
MetaФильтрация ложных срабатыванийВсе находкиAPI-ключ
VirusTotalВредоносное ПО на основе хешейБинарные файлыAPI-ключ
AI DefenseОблачный AIТекстовое содержимоеAPI-ключ

Опции CLI

ОпцияОписание
--policyПолитика сканирования: имя пресета (strict, balanced, permissive) или путь к пользовательскому YAML
--use-behavioralВключить анализатор поведения (анализ потоков данных)
--use-llmВключить анализатор LLM (требуется API-ключ)
--llm-providerПровайдер LLM для маршрутизации CLI: anthropic или openai
--llm-consensus-runs NЗапустить анализ LLM N раз, сохранить находки, согласованные большинством, и сохранить их наивысшую наблюдаемую серьёзность
--llm-max-tokens NМаксимальное количество выходных токенов для ответов LLM (по умолчанию: 8192)
--llm-reasoning-effort LEVELОпциональная глубина рассуждений (disabled, minimal, low, medium, high, xhigh или max); если не задано, сохраняется значение провайдера по умолчанию
--use-virustotalВключить бинарный сканер VirusTotal
--vt-api-key KEYУказать API-ключ VirusTotal напрямую (опционально)
--vt-upload-filesЗагружать неизвестные бинарные файлы в VirusTotal (опционально)
--use-aidefenseВключить анализатор Cisco AI Defense
--aidefense-api-url URLПереопределить URL API AI Defense (опционально)
--use-triggerВключить анализатор специфичности триггеров
--enable-metaВключить мета-анализатор для фильтрации ложных срабатываний
--verboseВключать отпечатки политик по каждой находке, метаданные совместного появления и сохранять ложные срабатывания мета-анализатора
--formatВывод: summary, json, markdown, table, sarif, html. Формат html создаёт самодостаточный интерактивный отчёт со сворачиваемыми группами корреляции, раскрываемыми фрагментами кода и диаграммами потоков заражения конвейеров
--detailedВключать подробные находки в вывод Markdown
--compactКомпактный вывод JSON
--output PATHПуть к файлу вывода по умолчанию (переопределяется --output-<fmt>)
--fail-on-findingsЗавершиться с ошибкой, если найдены HIGH/CRITICAL (сокращение для --fail-on-severity high)
--fail-on-severity LEVELЗавершиться с ошибкой, если существуют находки уровня LEVEL или выше (critical, high, medium, low, info)
--custom-rules PATHИспользовать пользовательские правила YARA из каталога
--taxonomy PATHЗагрузить пользовательский профиль таксономии (JSON/YAML) для этого запуска
--threat-mapping PATHЗагрузить пользовательский профиль сопоставления угроз сканера (JSON) для этого запуска
--lenientТерпимо относиться к некорректным навыкам (приводить плохие поля, заполнять значения по умолчанию) вместо сбоя. Если SKILL.md отсутствует, переключается на сканирование файлов .md в каталоге
--skill-file FILENAMEПользовательское имя файла метаданных вместо SKILL.md (например, README.md)
--check-overlap(scan-all) Включить проверки пересечения описаний между навыками
КомандаОписание
(без команды)Запустить интерактивный мастер сканирования (при запуске в терминале)
interactiveЗапустить интерактивный мастер сканирования (явно)
scanСканировать один каталог навыка
scan-allСканировать несколько навыков (с --recursive, --check-overlap)
generate-policyСгенерировать YAML политики сканирования для настройки
configure-policyИнтерактивный TUI для создания/редактирования пользовательской политики сканирования (поддерживается --input)
list-analyzersПоказать доступные анализаторы
validate-rulesПроверить сигнатуры правил (поддерживается --rules-file)

Пример вывода

$ skill-scanner scan ./my-skill --use-behavioral

============================================================
Skill: my-skill
============================================================
Status: [OK] No findings
Max Severity: NONE
Total Findings: 0
Scan Duration: 0.15s

Примечание: «No findings» означает, что сканер не обнаружил известных шаблонов угроз — это не гарантия того, что навык свободен от всех рисков. См. Область применения и ограничения.


GitHub Actions

Автоматически сканируйте навыки при каждом push или PR с помощью переиспользуемого рабочего процесса:

# .github/workflows/scan-skills.yml
name: Scan Skills
on:
  pull_request:
    paths: [".cursor/skills/**"]
jobs:
  scan:
    uses: cisco-ai-defense/skill-scanner/.github/workflows/scan-skills.yml@main
    with:
      skill_path: .cursor/skills
    permissions:
      security-events: write
      contents: read

Результаты отображаются в виде встроенных аннотаций в PR через GitHub Code Scanning. См. полное руководство по интеграции с LLM, настройке секретов и настройке защиты веток.


Pre-commit Hook

Сканируйте навыки перед каждым коммитом с помощью фреймворка pre-commit:

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/cisco-ai-defense/skill-scanner
    rev: v1.0.0  # use the latest release tag
    hooks:
      - id: skill-scanner

Или установите встроенный хук напрямую:

skill-scanner-pre-commit --install

Хук сопоставляет изменённые файлы с ближайшим SKILL.md и сканирует каждый затронутый навык один раз. Во время обычного коммита он читает проиндексированный diff. В CI сравните две ревизии, чтобы не требовался проиндексированный индекс:

pre-commit run skill-scanner --from-ref "$BASE_SHA" --to-ref "$HEAD_SHA"

Обе ревизии должны существовать в рабочей копии. Чтобы просканировать каждый настроенный навык, вызовите хук напрямую:

skill-scanner-pre-commit --scan-all

Либо настройте args: [--scan-all] для хука в .pre-commit-config.yaml.


Участие в разработке

Мы приветствуем вклад! Пожалуйста, см. CONTRIBUTING.md для руководящих принципов.

Лицензия

Apache 2.0 — см. LICENSE для подробностей.

Copyright 2026 Cisco Systems, Inc. and its affiliates


GitHubDiscordPyPI

Категории