
Escáner de seguridad para habilidades de agentes
Un escáner de seguridad de mejor esfuerzo para skills de agentes de IA que detecta inyección de prompts, exfiltración de datos y patrones de código malicioso. Combina detección basada en patrones (YAML + YARA), LLM como juez y análisis de flujo de datos conductual para maximizar la cobertura de detección de amenazas probables y minimizar los falsos positivos.
Importante: Este escáner ofrece una detección de mejor esfuerzo, no una cobertura exhaustiva ni completa. Un escaneo sin hallazgos no garantiza que una skill esté libre de todas las amenazas. Consulta Alcance y limitaciones a continuación.
Es compatible con los formatos OpenAI Codex Skills y Cursor Agent Skills, siguiendo la especificación de Agent Skills. Con --lenient, también escanea formatos no estándar como .claude/commands/*.md de Claude Code y repositorios de skills en markdown plano.
Únete al Discord de Cisco AI para debatir, compartir comentarios o conectar con el equipo.
Skill Scanner es una herramienta de detección. Identifica patrones de riesgo conocidos y probables, pero no certifica la seguridad.
Limitaciones clave:
Requisitos previos: Python 3.10+ y uv (recomendado) o pip
# Usando uv (recomendado)
uv pip install cisco-ai-skill-scanner
# Usando pip
pip install cisco-ai-skill-scanner
# Soporte para AWS Bedrock
pip install cisco-ai-skill-scanner[bedrock]
# Soporte para Google AI Studio / Gemini
pip install cisco-ai-skill-scanner[google]
# Soporte para Google Vertex AI
pip install cisco-ai-skill-scanner[vertex]
# Soporte para Azure OpenAI
pip install cisco-ai-skill-scanner[azure]
# Todos los proveedores de nube
pip install cisco-ai-skill-scanner[all]
# Para el analizador LLM y el meta-analizador
export SKILL_SCANNER_LLM_API_KEY="your_api_key"
export SKILL_SCANNER_LLM_MODEL="claude-3-5-sonnet-20241022"
# Para el escaneo de binarios con VirusTotal
export VIRUSTOTAL_API_KEY="your_virustotal_api_key"
# Para Cisco AI Defense
export AI_DEFENSE_API_KEY="your_aidefense_api_key"
¿No sabes qué opciones usar? Ejecuta skill-scanner sin argumentos para iniciar el asistente interactivo:
skill-scanner
El asistente te guía paso a paso en la selección del objetivo de escaneo, los analizadores, la política y el formato de salida, y luego muestra el comando ensamblado antes de ejecutarlo. Ideal para aprender a usar la CLI.
# Escanea una sola skill (analizadores principales: static + bytecode + pipeline)
skill-scanner scan /path/to/skill
# Escanea con el analizador conductual (análisis de flujo de datos)
skill-scanner scan /path/to/skill --use-behavioral
# Escanea con todos los motores
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense
# Escanea con el meta-analizador para filtrar falsos positivos
skill-scanner scan /path/to/skill --use-llm --enable-meta
# Escanea con el analizador de disparadores (trigger) para comprobar descripciones vagas
skill-scanner scan /path/to/skill --use-trigger
# Ejecuta el analizador LLM varias veces y conserva los hallazgos acordados por mayoría
skill-scanner scan /path/to/skill --use-llm --llm-consensus-runs 3
# Escanea varias skills de forma recursiva
skill-scanner scan-all /path/to/skills --recursive --use-behavioral
# Escanea varias skills con detección de solapamiento entre skills
skill-scanner scan-all /path/to/skills --recursive --check-overlap
# Escanea un repositorio de GitHub (abreviatura owner/repo o URL completa)
skill-scanner scan-repo owner/repo
skill-scanner scan-repo https://github.com/owner/repo --use-llm
# Modo tolerante: tolera skills malformadas en lugar de fallar
skill-scanner scan /path/to/skill --lenient
skill-scanner scan-all /path/to/skills --recursive --lenient
# Modo tolerante con formatos de skill no estándar (no se requiere SKILL.md)
skill-scanner scan .claude/commands/deploy --lenient
skill-scanner scan-all .claude/commands --recursive --lenient
# Usa un nombre de archivo de metadatos personalizado en lugar de SKILL.md
skill-scanner scan /path/to/skill --skill-file README.md
# CI/CD: falla la compilación si se encuentran amenazas
skill-scanner scan-all ./skills --fail-on-severity high --format sarif --output results.sarif
# Genera un informe HTML interactivo con grupos de correlación de ataques
skill-scanner scan /path/to/skill --use-llm --enable-meta --format html --output report.html
# Usa reglas YARA personalizadas
skill-scanner scan /path/to/skill --custom-rules /path/to/my-rules/
# Usa perfiles personalizados de taxonomía + mapeo de amenazas (JSON/YAML)
skill-scanner scan /path/to/skill --taxonomy /path/to/taxonomy.json --threat-mapping /path/to/threat_mapping.json
# Escaneo de hashes con VirusTotal con carga opcional de archivos desconocidos
skill-scanner scan /path/to/skill --use-virustotal --vt-upload-files
# Usa un ajuste preestablecido de política de escaneo (strict, balanced, permissive)
skill-scanner scan /path/to/skill --policy strict
# Usa un archivo de política personalizado de tu organización
skill-scanner scan /path/to/skill --policy my_org_policy.yaml
# Genera un archivo de política para personalizar
skill-scanner generate-policy -o my_org_policy.yaml
# Configurador interactivo de políticas (TUI)
skill-scanner configure-policy
Nota sobre el proveedor de LLM: actualmente --llm-provider acepta anthropic u openai.
Para los backends de Bedrock, Vertex, Azure, Gemini y otros de LiteLLM, configura las cadenas de modelo y las variables de entorno específicas del proveedor (consulta la documentación del analizador LLM).
from skill_scanner import SkillScanner
from skill_scanner.core.analyzers import BehavioralAnalyzer
# Crea el escáner con analizadores
scanner = SkillScanner(analyzers=[
BehavioralAnalyzer(),
])
# Escanea una skill
result = scanner.scan_skill("/path/to/skill")
print(f"Findings: {len(result.findings)}")
print(f"Max severity: {result.max_severity}")
# Nota: is_safe indica que no se detectaron hallazgos HIGH/CRITICAL.
# No garantiza que la skill esté libre de todo riesgo.
if not result.is_safe:
print("Issues detected -- review findings before deployment")
$ skill-scanner scan ./my-skill --use-behavioral
============================================================
Skill: my-skill
============================================================
Status: [OK] No findings
Max Severity: NONE
Total Findings: 0
Scan Duration: 0.15s
Nota: "Sin hallazgos" significa que el escáner no detectó ningún patrón de amenaza conocido; no es una garantía de que la skill esté libre de todo riesgo. Consulta Alcance y limitaciones.
Escanea las skills automáticamente en cada push o PR con el flujo de trabajo reutilizable:
# .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
Los resultados aparecen como anotaciones en línea en los PR mediante GitHub Code Scanning. Consulta la guía completa para la integración con LLM, la configuración de secretos y la protección de ramas.
Escanea las skills antes de cada commit con el framework pre-commit:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/cisco-ai-defense/skill-scanner
rev: v1.0.0 # usa la última etiqueta de release
hooks:
- id: skill-scanner
O instala el hook integrado directamente:
skill-scanner-pre-commit install
El hook detecta automáticamente qué directorios de skills tienen cambios en el área de staging y solo escanea esos, lo que mantiene rápidos los tiempos de commit. Usa --all para escanearlo todo.
¡Agradecemos las contribuciones! Consulta CONTRIBUTING.md para conocer las pautas.
Apache 2.0 - Consulta LICENSE para más detalles.
Copyright 2026 Cisco Systems, Inc. y sus filiales
| Guía | Descripción |
|---|
| Inicio rápido | Empieza en 5 minutos |
| Arquitectura | Diseño del sistema y componentes |
| Taxonomía de amenazas | Taxonomía completa de amenazas AITech con ejemplos |
| Analizador LLM | Configuración y uso del LLM |
| Meta-analizador | Filtrado de falsos positivos y priorización |
| Analizador conductual | Detalles del análisis de flujo de datos |
| Política de escaneo | Políticas personalizadas, ajustes preestablecidos y guía de ajuste |
| Referencia rápida de políticas | Referencia compacta de secciones y parámetros de política |
| Creación de reglas | Cómo añadir reglas de firmas, YARA y Python |
| GitHub Actions | Flujo de trabajo reutilizable para integración con CI/CD |
| Referencia de API | Documentación de la API REST |
| Guía de desarrollo | Contribución y configuración del desarrollo |
| Analizador | Método de detección | Alcance | Requisitos |
|---|
| Static | Patrones YAML + YARA | Todos los archivos | Ninguno |
| Bytecode | Verificación de integridad de .pyc | Bytecode de Python | Ninguno |
| Pipeline | Análisis de contaminación de comandos | Pipelines de shell | Ninguno |
| Behavioral | Análisis de flujo de datos AST | Archivos de Python | Ninguno |
| LLM | Análisis semántico | SKILL.md + scripts | Clave de API |
| Meta | Filtrado de falsos positivos | Todos los hallazgos | Clave de API |
| VirusTotal | Detección de malware basada en hash | Archivos binarios | Clave de API |
| AI Defense | IA basada en la nube | Contenido de texto | Clave de API |
| Opción | Descripción |
|---|
--policy | Política de escaneo: nombre de ajuste preestablecido (strict, balanced, permissive) o ruta a un YAML personalizado |
--use-behavioral | Habilita el analizador conductual (análisis de flujo de datos) |
--use-llm | Habilita el analizador LLM (requiere clave de API) |
--llm-provider | Proveedor de LLM para el enrutamiento de la CLI: anthropic u openai |
--llm-consensus-runs N | Ejecuta el análisis del LLM N veces y conserva los hallazgos acordados por mayoría |
--llm-max-tokens N | Máximo de tokens de salida para las respuestas del LLM (por defecto: 8192) |
--use-virustotal | Habilita el escáner de binarios de VirusTotal |
--vt-api-key KEY | Proporciona la clave de API de VirusTotal directamente (opcional) |
--vt-upload-files | Sube binarios desconocidos a VirusTotal (opcional) |
--use-aidefense | Habilita el analizador Cisco AI Defense |
--aidefense-api-url URL | Sobrescribe la URL de la API de AI Defense (opcional) |
--use-trigger | Habilita el analizador de especificidad de disparadores (trigger) |
--enable-meta | Habilita el meta-analizador para el filtrado de falsos positivos |
--verbose | Incluye huellas de política por hallazgo, metadatos de co-ocurrencia y conserva los falsos positivos del meta-analizador |
--format | Salida: summary, json, markdown, table, sarif, html. El formato html produce un informe interactivo autocontenido con grupos de correlación plegables, fragmentos de código expandibles y diagramas de flujo de contaminación de pipelines |
--detailed | Incluye hallazgos detallados en la salida Markdown |
--compact | Salida JSON compacta |
--output PATH | Ruta de archivo de salida por defecto (anulada por --output-<fmt>) |
--fail-on-findings | Sale con error si se encuentran hallazgos HIGH/CRITICAL (abreviatura de --fail-on-severity high) |
--fail-on-severity LEVEL | Sale con error si existen hallazgos en LEVEL o superior (critical, high, medium, low, info) |
--custom-rules PATH | Usa reglas YARA personalizadas de un directorio |
--taxonomy PATH | Carga un perfil de taxonomía personalizado (JSON/YAML) para esta ejecución |
--threat-mapping PATH | Carga un perfil personalizado de mapeo de amenazas del escáner (JSON) para esta ejecución |
--lenient | Tolera skills malformadas (corrige campos incorrectos, rellena valores por defecto) en lugar de fallar. Cuando no hay SKILL.md, recurre a escanear los archivos .md del directorio |
--skill-file FILENAME | Nombre de archivo de metadatos personalizado para usar en lugar de SKILL.md (p. ej., README.md) |
--check-overlap | (scan-all) Habilita las comprobaciones de solapamiento de descripciones entre skills |
| Comando | Descripción |
|---|
| (sin comando) | Inicia el asistente interactivo de escaneo (cuando se ejecuta en una terminal) |
interactive | Inicia el asistente interactivo de escaneo (explícito) |
scan | Escanea un único directorio de skill |
scan-all | Escanea varias skills (con --recursive, --check-overlap) |
generate-policy | Genera un YAML de política de escaneo para personalizar |
configure-policy | TUI interactiva para crear/editar una política de escaneo personalizada (admite --input) |
list-analyzers | Muestra los analizadores disponibles |
validate-rules | Valida las firmas de reglas (admite --rules-file) |