AI DevelopmentOpen Source

SkillSpector: Escaneá las Skills de Agentes IA Antes de Instalarlas

14 de octubre de 2026
10 min de lectura
Lupa inspeccionando una pila de paquetes sellados sobre una mesa de trabajo
Compartir:

Instalar una skill de agente parece instalar una nota. Se parece más a instalar un paquete: un SKILL.md que dirige a tu agente, más scripts que pueden correr en tu máquina con tus credenciales. SkillSpector, de NVIDIA, ya superó las 20.000 estrellas en GitHub y es un escáner estático pensado para mirar adentro de una skill antes de dejarla entrar.

En esta guía te cuento qué es, su pipeline de cuatro pasos, los comandos tal como están documentados, un gate de CI y, igual de importante, dónde termina su alcance. La versión de una línea: skillspector scan ./my-skill/. Un escaneo es un filtro, no un veredicto.

1. ¿Qué es SkillSpector?

SkillSpector es un escáner de seguridad para skills de agentes IA: las carpetas de instrucciones y scripts que herramientas como Claude Code, Codex CLI o Gemini CLI cargan bajo demanda. Le pasás una skill (un directorio, un SKILL.md suelto, un zip o una URL de Git) y te devuelve vulnerabilidades, patrones maliciosos y un puntaje de riesgo de 0 a 100 con una recomendación de instalación. El proyecto lo publica NVIDIA bajo Apache-2.0 y está escrito en Python.

⭐

~20,2k

Estrellas

API de GitHub, 14 oct 2026

📜

Apache-2.0

Licencia

Open source

🏷️

v2.12.0

Última release

23 sep 2026

🐍

Python 3.12+

Stack

CLI + servidor MCP opcional

Datos leídos de la API de GitHub y del README el 2026-10-14. Las estrellas cambian a diario; el repo se creó en marzo de 2026.

El README dice que forma parte del pipeline Verified Skills de NVIDIA, que escanea, evalúa y firma skills de agentes antes de publicarlas. Ese contexto importa: nació como puerta de control para el catálogo de un publicador, y sirve igual como chequeo previo a la instalación para quien consume skills.

¿Por qué escanear skills?

El README cita un estudio académico, “Agent Skills in the Wild” (Liu et al., 2026, arXiv 2601.10338). Los investigadores recolectaron 42.447 skills, analizaron 31.132 y usaron su propio escáner, no SkillSpector, para los números de abajo. Leelos como una señal del ecosistema, no como una medición de esta herramienta.

26,1%

de las skills analizadas tenía al menos una vulnerabilidad

5,2%

mostró patrones de severidad alta que apuntan a intención maliciosa probable

2,12x

más probabilidad de ser vulnerable cuando la skill incluye scripts ejecutables

2. Cómo Funciona: Cuatro Pasos del Input al Veredicto

El README describe un pipeline de detección en dos etapas, envuelto por un paso de ingesta y uno de puntaje. Nada de eso ejecuta la skill: el modelo de confianza dice sin vueltas que nunca corre lo que escanea.

📥

1. Ingesta e inventario

Le pasás un directorio, un archivo suelto, un zip o una URL de Git. SkillSpector arma un inventario de los archivos que puede analizar (instrucciones, scripts, manifiestos, archivos de dependencias). Desde la v2.12.0 también acepta enlaces a subdirectorios de GitHub y enlaces a archivos de GitHub o GitLab.

🔬

2. Etapa 1: análisis estático determinista

Detección rápida de patrones con 11 analizadores estáticos, más chequeos de AST de Python, firmas YARA y taint tracking desde fuentes como credenciales hasta sumideros como salida de red. Repetible y sin API key. Los nombres y versiones de dependencias se consultan contra OSV.dev.

🧠

3. Etapa 2: revisión semántica opcional con LLM

Un modelo compara lo que la skill dice hacer con lo que hace su código, lo que ayuda con desajustes descripción-comportamiento y triggers vagos. Cada hallazgo determinista queda en el reporte aunque el modelo lo confirme, lo discuta o lo ignore; los confirmados pueden ganar explicación y más confianza, nunca menos.

📊

4. Puntaje, veredicto y reporte

Los hallazgos se ponderan (CRITICAL 50, HIGH 25, MEDIUM 10, LOW 5 puntos, con multiplicador 1,3x para scripts ejecutables) hasta un puntaje de 0–100, una severidad y una recomendación de instalación. Los reportes salen en terminal, JSON, Markdown o SARIF 2.1.0.

Mapeo de puntaje a veredicto (README)

0–20

LOW

SAFE

21–50

MEDIUM

CAUTION

51–80

HIGH

DO_NOT_INSTALL

81–100

CRITICAL

DO_NOT_INSTALL

Fijate en la palabra: SAFE significa que nada puntuó lo suficiente, no que la skill esté probada como segura. La sección 8 vuelve sobre esto.

3. Qué Revisa: 17 Categorías de Riesgo en Skills

Esta es la taxonomía propia del README. Cada categoría tiene IDs de regla numerados (P1, E2, SC4, AST1, TT3…) que aparecen en reportes y baselines, así podés hablar de un hallazgo con precisión.

Prompt Injection

P1–P5, P9

Sobrescritura de instrucciones, instrucciones ocultas, comandos de exfiltración, manipulación de comportamiento, contenido dañino, relleno con espacios en blanco.

Anti-Refusal

AR1–AR3

Texto que le ordena al agente dejar de rechazar, quitar avisos o tratar la política de seguridad como nula.

Data Exfiltration

E1–E4

Transmisión externa, recolección de variables de entorno, enumeración del sistema de archivos, fuga de contexto.

Privilege Escalation

PE1–PE3

Permisos excesivos, ejecución con sudo o root, acceso a credenciales.

Supply Chain

SC1–SC10

Dependencias sin fijar o con vulnerabilidades conocidas, descarga remota de scripts, código ofuscado, typosquatting, bytecode incluido, ejecutables ocultos, redirección del origen de dependencias.

Excessive Agency

EA1–EA5

Acceso irrestricto a herramientas, decisiones autónomas, scope creep, recursos sin límite, selección externa de modelo o proveedor.

Output Handling

OH1–OH3

Inyección por salida sin validar, salida entre contextos, salida sin límite.

System Prompt Leakage

P6–P8

Fuga directa, extracción indirecta y exfiltración por herramientas de system prompts.

Memory Poisoning

MP1–MP3

Inyección persistente de contexto, saturación de la ventana de contexto, manipulación de memoria.

Tool Misuse

TM1–TM3

Abuso de parámetros, abuso de encadenamiento y defaults inseguros como TLS desactivado.

Rogue Agent

RA1–RA2

Automodificación en runtime y persistencia de sesión, como cron jobs o hooks de arranque.

Trigger Abuse

TR1–TR3

Triggers demasiado amplios, comandos que tapan a los nativos o a otras skills, keyword baiting.

Behavioral AST

AST1–AST9

Llamadas peligrosas de Python halladas por análisis de árbol sintáctico: exec, eval, import dinámico, subprocess, os.system, compile, sumideros de getattr.

Taint Tracking

TT1–TT5

Datos que fluyen desde credenciales, archivos o input externo hacia salida de red o ejecución de código.

YARA Signatures

YR1–YR4

Firmas de malware, webshells, cryptominers y herramientas de exploit.

MCP Least Privilege

LP1–LP4

Permisos declarados que no coinciden con las capacidades reales: subdeclarados, comodín, faltantes o sobredeclarados.

MCP Tool Poisoning

TP1–TP4

Instrucciones ocultas, engaño con Unicode, inyección en descripciones de parámetros y desajuste descripción-comportamiento.

Aviso sobre la cuenta de patrones: el titular del README dice 71 patrones y la página de docs de NVIDIA dice 68. El número difiere entre fuentes y releases, así que tomalo como unas 70 reglas en 17 categorías. Lo que importa son los IDs de regla de tu propio reporte.

4. Quickstart: Verificado Contra el README el 2026-10-14

Cada comando de abajo está copiado del README del proyecto a día de hoy (Python 3.12+ según su badge). Acá los documento, no los ejecuto por vos: leé qué hace un instalador antes de correrlo, que es justamente el punto de este artículo.

Instalación (uv tool)

uv tool install git+https://github.com/NVIDIA/skillspector.git

Escanear una skill

# Scan a local skill directory
skillspector scan ./my-skill/

# Scan a single SKILL.md file
skillspector scan ./SKILL.md

# Scan a Git repository
skillspector scan https://github.com/user/my-skill

# Scan a zip file
skillspector scan ./my-skill.zip

Formatos de salida

# JSON output - machine readable
skillspector scan ./my-skill/ --format json --output report.json

# Markdown output - for documentation
skillspector scan ./my-skill/ --format markdown --output report.md

# SARIF output - for CI/CD integration and IDE tooling
skillspector scan ./my-skill/ --format sarif --output report.sarif

Docker, solo estático (construí desde un checkout del repo)

docker build -t skillspector .
docker run --rm -v "$PWD:/scan" skillspector scan ./my-skill/ --no-llm

Leé esto antes de escanear skills privadas

Con el análisis LLM activo, el contenido de los archivos elegibles se envía al proveedor configurado, y según el README el proveedor por defecto es nv_build (el endpoint hosteado de NVIDIA). Pasá --no-llm para que el contenido no salga de tu máquina. Aun con --no-llm, el chequeo de supply chain SC4 envía nombres y versiones de dependencias (no contenido de archivos) a OSV.dev. Para cambiar de proveedor, definí SKILLSPECTOR_PROVIDER (entre los valores documentados están openai, anthropic, bedrock, gemini, ollama, azure_openai y openai_compatible) junto con la variable de API key de ese proveedor.

5. Llevalo a CI Antes de que las Skills de Terceros Lleguen a Tu Agente

El README presenta el exit code y la salida JSON como un contrato estable para pipelines de CI, puertas de instalación e integraciones con editores. No trae un snippet de GitHub Actions, así que el script de abajo es una composición mía a partir de flags documentados. No lo corrí: probalo primero en un repo descartable.

Exit codes de skillspector scan (README)

  • 0El escaneo terminó, puntaje ≤ 50 (SAFE o CAUTION) y no se activó ningún gate estricto.
  • 1Puntaje mayor a 50, o se activó un gate estricto: --fail-on-findings, --fail-on-incomplete o --min-coverage.
  • 2Error: input inválido, fuente ilegible o falla interna.

Por defecto SAFE y CAUTION devuelven 0, así que un build en verde no significa cero hallazgos. Endurecé el gate con --fail-on-findings (cualquier hallazgo activo) y --fail-on-incomplete (cobertura parcial), o leé la recomendación del reporte JSON y aplicá tu propia política. El flag opt-in --fail-on-findings llegó en la v2.12.0, así que revisá la versión que instalás.

El flujo previo a la instalación que yo usaría

  1. Paso 1 — Cuarentena: Nunca tires una skill de terceros directo en ~/.claude/skills/. Traela a un directorio temporal o dejá que SkillSpector descargue la URL de Git por su cuenta.
  2. Paso 2 — Escaneá primero en estático: Corré con --no-llm para que nada salga de tu máquina. Sumá la etapa LLM solo para skills que podés compartir con un proveedor.
  3. Paso 3 — Leé veredicto y cobertura: Revisá risk_assessment.recommendation y analysis_completeness.is_complete en el JSON. Los docs de NVIDIA dicen que un escaneo incompleto no es seguro de instalar, sea cual sea el puntaje.
  4. Paso 4 — Revisión humana y recién ahí scope de proyecto: Una persona lee SKILL.md y cada script marcado; después la skill entra al repo, donde los cambios futuros aparecen en un pull request.

Gate de CI ilustrativo (compuesto con flags documentados, no copiado del README)

#!/usr/bin/env bash
# ci/scan-skills.sh - fail the build if a vendored skill is risky or unreadable
set -u

# Pin a release tag so scores do not drift between runs (uv accepts git refs after @)
uv tool install git+https://github.com/NVIDIA/skillspector.git@v2.12.0

mkdir -p reports
status=0
for d in .claude/skills/*/; do
  skillspector scan "$d" --no-llm \
    --fail-on-findings --fail-on-incomplete \
    --format sarif --output "reports/$(basename "$d").sarif" || status=1
done
exit $status

Aceptá hallazgos conocidos con un baseline

Los hallazgos ya triados se pueden suprimir para que el puntaje refleje solo lo nuevo. El baseline es un archivo YAML que commiteás, y cada entrada exige un motivo. Los fingerprints dejan de coincidir tras una actualización del escáner o un cambio de contenido, las reglas amplias pueden esconder contenido nuevo malicioso, y las notas de la v2.12.0 advierten que puntajes y recomendaciones pueden cambiar entre versiones; revisá los baselines después de actualizar.

skillspector baseline ./my-skill/ -o .skillspector-baseline.yaml
skillspector scan ./my-skill/ --baseline .skillspector-baseline.yaml

6. Casos de Uso Que Valen la Pena

Cuatro lugares donde un escáner estático de skills justifica el tiempo de setup.

🧪

Revisar una skill antes de instalarla

Alguien comparte una skill en un hilo o en un marketplace. Escaneás la carpeta o su URL de Git, leés el reporte y recién después decidís. Es el trabajo central.

🚦

Un gate en PRs para repos que vendorizan skills

Los equipos que commitean su carpeta de skills obtienen un chequeo en cada cambio: salida SARIF para la vista de code scanning de tu CI y un exit code que bloquea el merge.

📦

Chequeos previos a publicar para autores de skills

NVIDIA lo corre como el nivel de seguridad antes de publicar en su catálogo. Si distribuís skills a otras personas, corré el mismo escaneo sobre tu trabajo antes de etiquetar una release.

🤖

Que el agente pregunte primero (MCP)

Con el extra MCP opcional, un agente puede llamar al escáner como herramienta antes de instalar algo. El transporte HTTP no tiene autenticación, así que atalo solo a loopback.

Extra MCP (comandos verificados, README 2026-10-14)

uv tool install 'skillspector[mcp] @ git+https://github.com/NVIDIA/skillspector.git'
claude mcp add skillspector -- skillspector mcp

7. Dónde Encaja: Escáner Antes, Sandbox Durante

El README es explícito: SkillSpector es defensa en profundidad, no un sandbox. Nunca ejecuta la skill y tampoco contiene una skill que instalás igual. Son dos controles distintos que responden dos preguntas distintas.

Escáner estático (SkillSpector)

  • • Pregunta: ¿qué hay adentro de esta skill?
  • • Cuándo: antes de instalar y en cada cambio
  • • Fortaleza: barato, repetible, detecta patrones conocidos
  • • Punto ciego: todo lo que solo aparece en runtime

Contención en runtime (sandbox, permisos)

  • • Pregunta: ¿qué puede hacer esta skill si se porta mal?
  • • Cuándo: en cada ejecución
  • • Fortaleza: limita el radio de daño incluso ante trucos desconocidos
  • • Punto ciego: no dice nada de lo que contiene la skill

Un esquema por capas que cuesta una tarde

  1. 1. Escaneá cada skill nueva o actualizada en CI (primero estático, gates estrictos).
  2. 2. Instalá en scope de proyecto para que los cambios aparezcan en code review.
  3. 3. Dale al agente permisos de herramientas de mínimo privilegio y dejá las credenciales de producción fuera de su entorno.
  4. 4. Corré las skills con scripts dentro de un contenedor o VM sin secretos ambientales y con egreso de red restringido.
  5. 5. Guardá logs de lo que el agente ejecutó, así un fallo se vuelve una investigación y no un misterio.

8. Cuándo No Confiar en Él: La Falsa Sensación de Seguridad

Un reporte limpio es la salida más peligrosa que produce esta herramienta, porque se siente como un permiso. La sección Limitations del README es corta y conviene tomarla literal.

🌍

Contenido que no está en inglés

El README dice que puede perderse patrones escritos en otros idiomas. Una instrucción hostil en un idioma que las reglas no cubren es un hueco conocido.

🖼️

Imágenes

No puede analizar texto dentro de imágenes, así que las instrucciones escondidas en una captura o un diagrama quedan fuera de alcance.

🔐

Código cifrado o binario

El contenido compilado o cifrado no se puede inspeccionar, justo donde alguien escondería un payload.

⏱️

Comportamiento en runtime

Solo análisis estático, sin ejecución dinámica. Lo que una skill descarga o decide en runtime es invisible para una pasada estática.

Tené presente también

  • • Un escaneo incompleto no es un escaneo limpio. Límites de tamaño, codificaciones no soportadas o timeouts pueden dejar parte de la skill sin leer; los docs de NVIDIA dicen que is_complete: false equivale a no seguro de instalar.
  • • El exit code 0 incluye CAUTION. Sin gates estrictos, un check de CI puede estar en verde con hallazgos presentes.
  • • La capa semántica puede variar entre corridas. Los docs de baseline recomiendan --no-llm para aceptaciones repetibles.
  • • Una firma no es verificación: un archivo de OpenSSF Model Signing en la raíz se reconoce, pero el README aclara que la firma en sí no se verifica.
  • • Los baselines pueden esconder un problema nuevo si una regla es demasiado amplia. Mantenelos angostos y revisalos.

✅ Buen ajuste cuando...

  • • Consumís skills o servidores MCP de terceros
  • • Vendorizás skills en git y querés un gate en PRs
  • • Publicás skills y querés un chequeo pre-release
  • • Necesitás salida legible por máquina (JSON, SARIF) para tu política

⚠️ No reemplaza a...

  • • Un sandbox o permisos de mínimo privilegio
  • • Leer la skill vos mismo, sobre todo scripts/
  • • Confianza en el publicador: procedencia, firma, revisión
  • • Contenido en idiomas o formatos que no puede leer

Regla de oro

Tratá DO_NOT_INSTALL como una señal de stop y SAFE como “no se encontró ningún patrón malo conocido”. La decisión de instalar sigue siendo humana.

Conclusión

SkillSpector se gana sus estrellas haciendo bien un trabajo poco glamoroso: convertir “¿esta skill es sospechosa?” de una corazonada en un chequeo repetible con IDs de regla, un puntaje y un exit code. Para quien instala skills de desconocidos, que en 2026 somos casi todos, vale diez minutos de setup.

Usalo como primer filtro, no como el último. Escaneá primero en estático, gateá por completitud, instalá en scope de proyecto y mantené un sandbox debajo de todo lo que ejecuta código. Si tus agentes ya traen skills de cualquier lado y nadie es dueño de esa auditoría, es el tipo de hueco que cierro en trabajos de rescate de proyectos.

Diego Rodriguez

Diego Rodriguez

Ingeniero Senior Full-Stack & AI

Diego tiene mas de 9 anos de experiencia construyendo aplicaciones potenciadas por IA de produccion, desde orquestacion de LLMs y pipelines RAG hasta deteccion de riesgos con ML y sistemas de trading algoritmico.

Conoce mas sobre Diego →