
Security Scanner for Agent Skills
Сканер безопасности на основе best-effort для AI Agent Skills, который обнаруживает инжекцию промптов, утечку данных и вредоносные паттерны кода. Объединяет детектирование на основе паттернов (YAML + YARA), LLM в качестве судьи и поведенческий анализ потоков данных, чтобы максимизировать покрытие вероятных угроз и минимизировать ложные срабатывания.
Важно: Этот сканер обеспечивает обнаружение по принципу best-effort, а не полное или всеобъемлющее покрытие. Сканирование, не выявившее находок, не гарантирует, что навык свободен от всех угроз. См. Область применения и ограничения ниже.
Поддерживает форматы OpenAI Codex Skills и Cursor Agent Skills в соответствии со спецификацией Agent Skills. С опцией --lenient также сканирует нестандартные форматы, такие как .claude/commands/*.md от Claude Code и плоские репозитории навыков в Markdown.
Присоединяйтесь к Cisco AI Discord для обсуждения, обратной связи или общения с командой.
Skill Scanner — это инструмент обнаружения. Он выявляет известные и вероятные паттерны риска, но не сертифицирует безопасность.
Ключевые ограничения:
Требования: Python 3.10+ и uv (рекомендуется) или pip
# Используя uv (рекомендуется)
uv pip install cisco-ai-skill-scanner
# Используя pip
pip install cisco-ai-skill-scanner
# Поддержка AWS Bedrock
pip install cisco-ai-skill-scanner[bedrock]
# Поддержка Google AI Studio / Gemini
pip install cisco-ai-skill-scanner[google]
# Поддержка Google Vertex AI
pip install cisco-ai-skill-scanner[vertex]
# Поддержка Azure OpenAI
pip install cisco-ai-skill-scanner[azure]
# Все облачные провайдеры
pip install cisco-ai-skill-scanner[all]
# Для LLM-анализатора и Мета-анализатора
export SKILL_SCANNER_LLM_API_KEY="your_api_key"
export SKILL_SCANNER_LLM_MODEL="claude-3-5-sonnet-20241022"
# Для сканирования бинарных файлов через VirusTotal
export VIRUSTOTAL_API_KEY="your_virustotal_api_key"
# Для Cisco AI Defense
export AI_DEFENSE_API_KEY="your_aidefense_api_key"
Не уверены, какие флаги использовать? Запустите skill-scanner без аргументов, чтобы запустить интерактивный мастер:
skill-scanner
Мастер проведёт вас через выбор цели сканирования, анализаторов, политики и формата вывода, затем покажет собранную команду перед выполнением. Отлично подходит для изучения CLI.
# Сканирование одного навыка (основные анализаторы: статический + байткод + конвейерный)
skill-scanner scan /path/to/skill
# Сканирование с поведенческим анализатором (анализ потоков данных)
skill-scanner scan /path/to/skill --use-behavioral
# Сканирование со всеми движками
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense
# Сканирование с мета-анализатором для фильтрации ложных срабатываний
skill-scanner scan /path/to/skill --use-llm --enable-meta
# Сканирование с триггерным анализатором для проверки расплывчатых описаний
skill-scanner scan /path/to/skill --use-trigger
# Запуск LLM-анализатора несколько раз с сохранением результатов, поддержанных большинством
skill-scanner scan /path/to/skill --use-llm --llm-consensus-runs 3
# Сканирование нескольких навыков рекурсивно
skill-scanner scan-all /path/to/skills --recursive --use-behavioral
# Сканирование нескольких навыков с обнаружением перекрытий между навыками
skill-scanner scan-all /path/to/skills --recursive --check-overlap
# Сканирование репозитория GitHub (краткая запись владелец/репозиторий или полный URL)
skill-scanner scan-repo owner/repo
skill-scanner scan-repo https://github.com/owner/repo --use-llm
# Либеральный режим: терпимость к некорректным навыкам вместо ошибки
skill-scanner scan /path/to/skill --lenient
skill-scanner scan-all /path/to/skills --recursive --lenient
# Либеральный режим с нестандартными форматами навыков (SKILL.md не требуется)
skill-scanner scan .claude/commands/deploy --lenient
skill-scanner scan-all .claude/commands --recursive --lenient
# Использование пользовательского имени файла метаданных вместо SKILL.md
skill-scanner scan /path/to/skill --skill-file README.md
# CI/CD: Ошибка сборки при обнаружении угроз
skill-scanner scan-all ./skills --fail-on-severity high --format sarif --output results.sarif
# Генерация интерактивного HTML-отчёта с группами корреляции атак
skill-scanner scan /path/to/skill --use-llm --enable-meta --format html --output report.html
# Использование пользовательских YARA-правил
skill-scanner scan /path/to/skill --custom-rules /path/to/my-rules/
# Использование пользовательской таксономии и профилей карты угроз (JSON/YAML)
skill-scanner scan /path/to/skill --taxonomy /path/to/taxonomy.json --threat-mapping /path/to/threat_mapping.json
# Сканирование хэша VirusTotal с опциональной загрузкой неизвестных файлов
skill-scanner scan /path/to/skill --use-virustotal --vt-upload-files
# Использование предустановки политики сканирования (strict, balanced, permissive)
skill-scanner scan /path/to/skill --policy strict
# Использование пользовательского файла политики организации
skill-scanner scan /path/to/skill --policy my_org_policy.yaml
# Генерация файла политики для настройки
skill-scanner generate-policy -o my_org_policy.yaml
# Интерактивный конфигуратор политики (TUI)
skill-scanner configure-policy
Примечание по провайдерам LLM: --llm-provider в настоящее время принимает anthropic или openai.
Для бэкендов Bedrock, Vertex, Azure, Gemini и других LiteLLM задавайте строки модели и переменные окружения, специфичные для провайдера (см. документацию LLM-анализатора).
from skill_scanner import SkillScanner
from skill_scanner.core.analyzers import BehavioralAnalyzer
# Создание сканера с анализаторами
scanner = SkillScanner(analyzers=[
BehavioralAnalyzer(),
])
# Сканирование навыка
result = scanner.scan_skill("/path/to/skill")
print(f"Находок: {len(result.findings)}")
print(f"Макс. серьёзность: {result.max_severity}")
# Примечание: is_safe указывает, что не обнаружено находок уровня HIGH/CRITICAL.
# Это не гарантирует, что навык свободен от всех рисков.
if not result.is_safe:
print("Обнаружены проблемы — проверьте находки перед развёртыванием")
$ skill-scanner scan ./my-skill --use-behavioral
============================================================
Навык: my-skill
============================================================
Статус: [OK] Находок нет
Макс. серьёзность: НЕТ
Всего находок: 0
Длительность сканирования: 0.15s
Примечание: "Находок нет" означает, что сканер не обнаружил известных паттернов угроз — это не гарантия того, что навык свободен от всех рисков. См. Область применения и ограничения.
Автоматическое сканирование навыков при каждом 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:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/cisco-ai-defense/skill-scanner
rev: v1.0.0 # используйте последний релизный тег
hooks:
- id: skill-scanner
Или установите встроенный hook напрямую:
skill-scanner-pre-commit install
Hook автоматически определяет, какие директории навыков имеют постановочные изменения, и сканирует только их, что ускоряет коммиты. Используйте --all для сканирования всего.
Мы приветствуем ваш вклад! Пожалуйста, ознакомьтесь с CONTRIBUTING.md для получения рекомендаций.
Apache 2.0 — См. LICENSE для подробностей.
Copyright 2026 Cisco Systems, Inc. and its affiliates
| Руководство | Описание |
|---|
| Быстрый старт | Начало работы за 5 минут |
| Архитектура | Системный дизайн и компоненты |
| Таксономия угроз | Полная таксономия угроз AITech с примерами |
| LLM-анализатор | Конфигурация и использование LLM |
| Мета-анализатор | Фильтрация ложных срабатываний и приоритизация |
| Поведенческий анализатор | Детали анализа потоков данных |
| Политика сканирования | Пользовательские политики, предустановки и руководство по настройке |
| Краткий справочник по политике | Компактный справочник по секциям и параметрам политики |
| Создание правил | Как добавить сигнатурные, YARA и Python-правила |
| GitHub Actions | Повторно используемый рабочий процесс для интеграции CI/CD |
| API-справочник | Документация REST API |
| Руководство разработчика | Участие и настройка разработки |
| Анализатор | Метод обнаружения | Область | Требования |
|---|
| Static (статический) | Паттерны YAML + YARA | Все файлы | Нет |
| Bytecode (байткод) | Проверка целостности .pyc | Байткод Python | Нет |
| Pipeline (конвейерный) | Taint-анализ команд | Командные конвейеры (shell pipeline) | Нет |
| Behavioral (поведенческий) | AST-анализ потоков данных | Файлы Python | Нет |
| LLM | Семантический анализ | SKILL.md + скрипты | API-ключ |
| Meta (мета-анализатор) | Фильтрация ложных срабатываний | Все находки | API-ключ |
| VirusTotal | Поиск вредоносного ПО по хэшу | Бинарные файлы | API-ключ |
| AI Defense | Облачный AI | Текстовое содержимое | API-ключ |
| Параметр | Описание |
|---|
--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) |
--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 создаёт самодостаточный интерактивный отчёт со сворачиваемыми группами корреляции, раскрываемыми фрагментами кода и диаграммами потоков taint в конвейерах |
--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) |