sast-skills

Colección de habilidades de agente que convierten tu codificador de IA en un escáner SAST

Documentación

🛡️ sast-skills

Convierte tu asistente de codificación LLM en un escáner SAST completamente funcional.

Habilidades de agente listas para usar para 14 asistentes de IA — Claude Code, OpenAI Codex CLI, Gemini CLI, GitHub Copilot, Cursor, Windsurf, OpenCode, Cline, Antigravity, Aider, Kilo Code, Augment Code, Hermes Agent y Mistral Vibe.

npm version CI tests License: MIT Node.js

Se recomienda Claude Code con Opus para mayor calidad; cualquier modelo capaz funciona.

⚡ Inicio rápido

npx sast-skills install   # pick your assistant(s) — ones found on your PATH are pre-enabled

Luego abre el proyecto en tu asistente y escribe el prompt:

Ejecutar escaneo de vulnerabilidades

Ejecuta las cuatro fases y escribe los hallazgos en sast/. Agréguelos con npx sast-skills export --format sarif para GitHub Code Scanning, o --format oscal para evidencia de cumplimiento NIST OSCAL.


📑 Tabla de contenidos


✨ Características destacadas

  • 68 habilidades en 64 clases de vulnerabilidades — inyección (incl. XPath, lenguaje de expresiones, fórmula CSV, variantes de bomba XML), control de acceso roto, profundidad de API y sesión (limitación de tasa, OAuth/OIDC, fijación de sesión, rutas ocultas), criptografía débil, manejo de archivos, cadena de suministro, riesgos de CI/CD y metadatos en la nube, lógica de negocio y abuso de pagos, seguridad agéntica/MCP (envenenamiento de configuración de habilidades, envenenamiento de herramientas MCP, configuración como ejecución, identidad de agente con privilegios excesivos), y tiempo de ejecución de LLM/agente (agencia excesiva, aislamiento RAG, llamadas inseguras a herramientas, envenenamiento de memoria, denegación de billetera), además de un enrutador de pila tecnológica.
  • Orquestación de cuatro fases — reconocimiento → detección paralela → informe consolidado → triaje basado en evidencia, impulsado completamente desde CLAUDE.md / AGENTS.md.
  • Idempotente y reanudable — cada fase omite trabajo cuyo resultado ya existe; vuelve a ejecutar después de corregir problemas para actualizar solo lo que está desactualizado.
  • Salida legible por máquina — cada habilidad emite JSON canónico; sast-skills export agrega a JSON, SARIF 2.1.0, o HTML para GitHub Code Scanning y CI.
  • Salida lista para cumplimiento — los mismos hallazgos se exportan como NIST OSCAL 1.2.3: un documento assessment-results (SAR) o un plan-of-action-and-milestones (POA&M), con cada hallazgo mapeado a los controles NIST SP 800-53 Rev 5 que pone en duda.
  • Multi-asistente — habilidades idénticas se envían para Claude Code (.claude/skills) y cada asistente AGENTS.md (.agents/skills).
  • CLI sin configuración — install / update / uninstall / doctor / export, publicado desde GitHub Actions con procedencia npm (atestación SLSA).

🔄 Flujo

El orquestador ejecuta cuatro fases — reconocimiento, detección paralela, síntesis y triaje:

flowchart TD
    U(["User: Run vulnerability scan"]) --> R{"CLAUDE.md / AGENTS.md orchestrator"}
    R --> S1["Step 1 — sast-analysis<br/>codebase and architecture map"]
    S1 -->|sast/architecture.md| S2["Step 2 — parallel vulnerability scan<br/>64 skills: recon, batched verify, merge"]
    S2 -->|sast/*-results.md and *-results.json| S3["Step 3 — sast-report<br/>consolidate and rank"]
    S3 -->|sast/final-report.md| S4["Step 4 — sast-triage<br/>false-positive elimination,<br/>severity adjustment with evidence"]
    S4 -->|sast/final-report-triaged.md and triaged.json| EXP["npx sast-skills export<br/>JSON, SARIF, HTML, OSCAL"]
    EXP --> CS(["GitHub Code Scanning, CI, dashboards"])
    EXP --> GRC(["OSCAL SAR / POA&M for GRC"])

Cada paso es idempotente: si su archivo de salida ya existe, el orquestador lo omite. Vuelve a ejecutar el escaneo después de corregir problemas para actualizar solo lo que está desactualizado.


🔍 Qué detecta

Todas las habilidades siguen el mismo patrón de tres fases: reconocimiento → verificación por lotes (subagentes paralelos, 3 por lote) → fusión. Cada una escribe un informe markdown legible por humanos y un archivo JSON canónico de hallazgos que sast-skills export agrega.

Reconocimiento y síntesis

HabilidadRol
sast-analysisReconocimiento del código base, mapeo de arquitectura, modelo de amenazas
sast-stackEnrutador de pila tecnológica — elige qué habilidades de detección ejecutar por proyecto
sast-reportConsolidar hallazgos por clase en un informe clasificado
sast-triageEliminar falsos positivos y ajustar severidades con evidencia del código base

Inyección

HabilidadClase de vulnerabilidad
sast-sqliInyección SQL
sast-nosqlInyección NoSQL (Mongo, Firestore, DynamoDB)
sast-ldapInyección de filtro LDAP / DN
sast-graphqlConstrucción insegura de documentos GraphQL
sast-xssCross-Site Scripting
sast-sstiInyección de plantillas del lado del servidor
sast-rceEjecución remota de código (inyección de comandos, eval, deserialización insegura)
sast-xxeXML External Entity
sast-ssrfServer-Side Request Forgery
sast-openredirectRedirección abierta (phishing / robo de tokens OAuth)
sast-crlfCRLF / división de respuesta HTTP (inyección de encabezados)
sast-ssrfimdsSSRF de metadatos en la nube (robo de credenciales IMDSv1)
sast-unsafeconsumptionRespuesta de API de terceros no validada hacia un sumidero (inyección de segundo orden)
sast-xpathInyección XPath (entrada de usuario en una expresión XPath)
sast-csvinjInyección de fórmula / CSV en exportaciones de hojas de cálculo
sast-elinjInyección de lenguaje de expresiones (OGNL / SpEL / MVEL / JEXL)

Control de acceso y autenticación

HabilidadClase de vulnerabilidad
sast-idorReferencia directa insegura a objetos
sast-missingauthAutenticación faltante / autorización a nivel de función rota
sast-jwtImplementaciones JWT inseguras
sast-csrfCross-Site Request Forgery
sast-corsConfiguración incorrecta de CORS
sast-cookieflagsHttpOnly / Secure / SameSite faltantes en cookies de sesión
sast-massassignAsignación masiva / sobrepublicación (escalada de privilegios)
sast-secheadersEncabezados de seguridad faltantes (CSP, HSTS, X-Frame-Options, SRI)
sast-ratelimitLímite de tasa faltante en endpoints de autenticación / costosos
sast-sessionFijación de sesión + IDs de sesión de baja entropía
sast-oauthConfiguración incorrecta de OAuth / OIDC (redirect_uri, state, PKCE)
sast-routeinventoryRutas ocultas / de depuración / de administrador registradas
sast-postmessageConfianza de origen postMessage / CSWSH / reverse-tabnabbing

Archivos, criptografía y tiempo de ejecución

HabilidadClase de vulnerabilidad
sast-pathtraversalTraversal de ruta / directorio
sast-fileuploadCarga de archivos insegura
sast-cryptoPrimitivas débiles, modos incorrectos, reutilización de IV, PRNG débil
sast-prototypePolución de prototipos en JavaScript
sast-redosDoS por regex con retroceso catastrófico
sast-raceCondiciones de carrera y TOCTOU
sast-deserDeserialización insegura (cadenas de gadgets, pickle, unserialize)
sast-tlsVerificación de certificado / nombre de host TLS deshabilitada
sast-zipslipZip Slip — traversal de ruta en extracción de archivos
sast-dangerousapiSumideros de API peligrosos (eval / exec / reflexión / puentes nativos)
sast-xmlbombDoS por expansión de entidades XML (billion laughs / explosión cuadrática)

Exposición de datos y cadena de suministro

HabilidadClase de vulnerabilidad
sast-hardcodedsecretsClaves API / tokens / credenciales en código orientado al cliente
sast-piiFuga de PII y credenciales a registros / telemetría / páginas de error
sast-depsDependencias vulnerables conocidas (CVE en lockfiles)
sast-iacIaC inseguro (Dockerfile / Terraform / Kubernetes / GitHub Actions)
sast-errorhandlingLógica fail-open, fugas de stack-trace / secretos, modo de depuración
sast-excessivedataExposición excesiva de datos en respuestas API
sast-pipelineinjInyección en pipeline CI/CD (payloads de eventos no confiables)
sast-depconfusionConfusión de dependencias + ejecución de scripts en tiempo de instalación
sast-lockfileLockfile faltante / hashes de dependencias sin fijar
sast-cloudsdkUso incorrecto de SDK en la nube (bucket público, clave hardcodeada, IAM amplio)

Lógica de negocio y específicas de LLM

HabilidadClase de vulnerabilidad
sast-businesslogicManipulación de precios, bypass de flujo de trabajo, abuso de recompensas
sast-paymentlogicAbuso de pagos en comercio electrónico (carrera de precio / cupón / reembolso / saldo)
sast-promptinjectionTexto no confiable que llega a un prompt de LLM (OWASP LLM #1)
sast-llmoutputSalida de LLM no validada que llega a sumideros de código / HTML / SQL / shell (OWASP LLM #2)

Seguridad agéntica y MCP

La superficie de ataque de la era 2026 que la mayoría de los escáneres de firmas pasan por alto — manipulación de lenguaje natural, envenenamiento de herramientas MCP, configuración como ejecución e identidades de agente con privilegios excesivos. Estas habilidades usan un paso de verificación impulsado por LLM, no coincidencia de regex.

HabilidadClase de vulnerabilidad
sast-skillauditInstrucción oculta / sumidero de shell en configuración de habilidad o agente no confiable
sast-mcpsecEnvenenamiento de herramientas de servidor MCP + falta de autenticación de herramientas
sast-configrceConfiguración de repositorio que auto-ejecuta shell al abrir / hacer checkout del proyecto
sast-agentidentityIdentidad no humana (agente / CI) con privilegios excesivos

Tiempo de ejecución de LLM y agente

Comportamiento en tiempo de ejecución de aplicaciones LLM y de agente — autoridad de herramientas, aislamiento de recuperación, higiene de secretos en prompts, confianza en memoria y límites de costo. El enrutador de pila tecnológica los controla para que nunca se ejecuten en códigos base sin dependencias LLM/agente.

HabilidadClase de vulnerabilidad
sast-excessiveagencyAutoridad excesiva del agente (herramientas que cambian estado, sin humano en el bucle)
sast-toolcallingDespacho de herramientas LLM sin lista de permitidos / validación de argumentos
sast-ragleakFuga entre inquilinos RAG + inyección indirecta (filtro ACL de recuperación faltante)
sast-systempromptleakSecretos en prompts del sistema; prompt registrado o devuelto a los llamadores
sast-memorypoisonDatos no confiables persistidos en la memoria del agente y luego confiados
sast-llmdosTokens LLM / bucles de agente sin límite (denegación de billetera)

📦 Instalación

npx sast-skills install

El instalador muestra una selección múltiple de los 14 asistentes compatibles (más Todos los anteriores) y pregunta si instalar en el proyecto actual o en el directorio de inicio del usuario (project / global). Para omitir prompts, pasa una lista separada por comas de IDs de asistentes (o all):

npx sast-skills install --yes --assistant claude,cursor,copilot --scope project

Si tu proyecto ya contiene un CLAUDE.md o AGENTS.md, el instalador se niega a sobrescribirlo por defecto — haz una copia de seguridad o pasa --force.

Instalación manual (sin npx / npm) — clic para expandir

Usa esta ruta si no puedes ejecutar npx (proxy corporativo, registro npm inalcanzable, entorno sin conexión) o si quieres fijar el código fuente de este fork en lugar del paquete npm publicado. El instalador CLI solo hace dos cosas — colocar el archivo de entrada del orquestador en la raíz del proyecto y reflejar cada SKILL.md de habilidad en el directorio oculto correcto — por lo que un cp -R simple lo reproduce exactamente.

1. Obtener los archivos empaquetados

git clone https://github.com/mstfknn/sast-skills.git

Todo lo que necesitas está bajo sast-skills/sast-files/:

sast-files/
├── CLAUDE.md                       # Orchestrator entry for Claude Code
├── AGENTS.md                       # Orchestrator entry for Gemini CLI / Codex / OpenCode / Cursor
├── .claude/skills/sast-*/SKILL.md  # 68 skills in Claude Code format
└── .agents/skills/sast-*/SKILL.md  # Same 68 skills mirrored for AGENTS.md assistants

Los dos árboles de habilidades se mantienen sincronizados por npm run sync — el contenido es idéntico, solo difiere el nombre del directorio.

2a. Instalar para Claude Code

Establece SAST_SRC a la ruta del clon para que los comandos a continuación sigan siendo copiables y pegables:

export SAST_SRC=/absolute/path/to/sast-skills
cd /path/to/your-project

Alcance del proyecto (recomendado — versionado junto con tu repositorio):

cp "$SAST_SRC/sast-files/CLAUDE.md" ./CLAUDE.md
cp -R "$SAST_SRC/sast-files/.claude" ./

Si ya usas un CLAUDE.md a nivel de proyecto, no lo sobrescribas — Claude Code solo lee un CLAUDE.md por proyecto. Fusiona el contenido del orquestador (el flujo de cuatro fases) en tu archivo existente en su lugar.

Alcance global (habilidades disponibles en cada proyecto; el orquestador aún se copia por proyecto):

mkdir -p ~/.claude/skills
cp -R "$SAST_SRC/sast-files/.claude/skills/." ~/.claude/skills/
# Then in any project where you want the scan flow:
cp "$SAST_SRC/sast-files/CLAUDE.md" /path/to/your-project/CLAUDE.md

2b. Instalar para Gemini CLI (y otros asistentes AGENTS.md)

export SAST_SRC=/absolute/path/to/sast-skills
cd /path/to/your-project
cp "$SAST_SRC/sast-files/AGENTS.md" ./AGENTS.md
cp -R "$SAST_SRC/sast-files/.agents" ./

Gemini CLI lee GEMINI.md; el instalador lo escribe por ti cuando eliges Gemini.

3. Verificar la instalación

# Project scope (Claude Code)
ls CLAUDE.md && ls .claude/skills/ | head

# Project scope (Gemini / AGENTS.md)
ls AGENTS.md && ls .agents/skills/ | head

# Global scope (Claude Code)
ls ~/.claude/skills/ | head

Deberías ver los 31 directorios de habilidades sast-*. Abre el proyecto en tu asistente y escribe el prompt "Ejecutar escaneo de vulnerabilidades" — el orquestador dentro de CLAUDE.md / AGENTS.md impulsa las cuatro fases desde allí.

4. Mantener una instalación manual actualizada

cd "$SAST_SRC" && git pull
# Re-run the cp commands from Step 2a / 2b to refresh — they're idempotent.

Si conservas el clon, cd "$SAST_SRC" && git pull && <rerun cp> es el equivalente manual de npx sast-skills update.

Comandos CLI

ComandoQué hace
npx sast-skills installCopia CLAUDE.md / AGENTS.md y el árbol de habilidades en tu proyecto o $HOME
npx sast-skills updateActualiza una instalación existente con los archivos de habilidades incluidos actualmente
npx sast-skills uninstallElimina habilidades instaladas; se niega a eliminar un CLAUDE.md modificado sin --force
npx sast-skills doctorVerifica una instalación e informa OK / MISSING / MODIFIED por archivo; sale con código distinto de cero si hay problemas
npx sast-skills export --input sast/ --format sarif --output report.sarifAgrega sast/*-results.json en JSON, SARIF 2.1.0 o HTML
npx sast-skills export --input sast/ --format oscal --output sar.jsonGenera un documento assessment-results NIST OSCAL 1.2.3
npx sast-skills export --input sast/ --format oscal-poam --output poam.jsonGenera un plan-of-action-and-milestones NIST OSCAL 1.2.3
npx sast-skills export --input sast/ --triaged --format sarifPrefiere el sast/triaged.json triado sobre los resultados brutos por habilidad
npx sast-skills --versionImprime la versión CLI instalada

Banderas de instalación

BanderaPropósito
--yesNo interactivo; requerido cuando stdin no es un TTY
--assistant <ids>IDs de asistente separados por comas (p. ej., claude,cursor,copilot) o all
--scope <project|global>Instalar en ./.claude/skills/ o $HOME/.claude/skills/
--target <path>Destino de instalación explícito (anula --scope)
--forceSobrescribe un CLAUDE.md / AGENTS.md preexistente
--dry-runImprime el plan de archivos sin escribir

🚀 Ejecutar un escaneo

Después de instalar, abre el proyecto en tu asistente de IA y pregunta:

Ejecutar escaneo de vulnerabilidades

o

Encontrar vulnerabilidades en este código base

El orquestador toma el control. Ejecuta las cuatro fases automáticamente, respeta la idempotencia (las re-ejecuciones solo detectan lo que falta) y escribe todo en sast/ en la raíz de tu proyecto.

Archivos de salida

ArchivoDescripción
sast/architecture.mdPila tecnológica, arquitectura, puntos de entrada, flujos de datos
sast/*-results.mdHallazgos por clase de vulnerabilidad (legibles para humanos)
sast/*-results.jsonHallazgos canónicos legibles por máquina (alimentados a sast-skills export)
sast/final-report.mdInforme bruto consolidado ordenado por severidad
sast/final-report-triaged.mdInforme triado: falsos positivos eliminados, severidades ajustadas con evidencia
sast/triaged.jsonHallazgos triados canónicos (preferidos por sast-skills export --triaged)

Esquema de hallazgos

Cada habilidad escribe sast/<skill>-results.json como una lista de hallazgos simple:

{
  "findings": [
    {
      "id": "sast-sqli-0001",
      "skill": "sast-sqli",
      "severity": "critical|high|medium|low|info",
      "title": "SQL injection in /api/user",
      "description": "…",
      "location": { "file": "src/api/user.js", "line": 42, "column": 10 },
      "remediation": "…"
    }
  ]
}

sast-skills export agrega esos archivos en un documento envuelto en un sobre run — { "run": { "tool": "sast-skills", "version": "<cli-version>" }, "findings": [...] } — sellando la versión de la CLI que produjo el informe. El paso de triaje escribe sast/triaged.json en esa misma forma envuelta.

Los hallazgos triados agregan triage_status (confirmed|upgraded|downgraded|false_positive), triage_original_severity (cuando la severidad cambió) y triage_evidence con citas concretas del código base.

Cada campo anterior se traslada a la exportación OSCAL; consulta NIST OSCAL para el mapeo campo por campo.


🔌 Integraciones de CI

GitHub Code Scanning (SARIF)

Acción compuesta en .github/actions/scan/action.yml:

- uses: mstfknn/sast-skills/.github/actions/scan@main
  with:
    input: sast/
    output: sast-skills.sarif

Esto ejecuta sast-skills export --format sarif y sube el resultado a Code Scanning mediante github/codeql-action/upload-sarif@v3.

NIST OSCAL (evidencia de cumplimiento)

Para plataformas GRC, evidencia de auditoría e informes de línea base de control, exporta los mismos hallazgos como OSCAL — el Lenguaje de Evaluación de Controles de Seguridad Abiertos de NIST. Los documentos declaran oscal-version 1.2.3 y se validan contra los esquemas JSON publicados por NIST en CI.

# Security Assessment Results (SAR) — a point-in-time record of what was found
npx sast-skills export --input sast/ --triaged --format oscal --output sast-skills-sar.json

# Plan of Action and Milestones (POA&M) — the remediation backlog
npx sast-skills export --input sast/ --triaged --format oscal-poam --output sast-skills-poam.json

En GitHub Actions, los documentos OSCAL son artefactos de flujo de trabajo en lugar de cargas de Code Scanning — Code Scanning habla SARIF, las plataformas GRC hablan OSCAL, por lo que ambos se ejecutan en paralelo:

- uses: mstfknn/sast-skills/.github/actions/scan@main   # SARIF → Code Scanning
  with:
    input: sast/
    output: sast-skills.sarif

- name: Export OSCAL
  run: |
    npx sast-skills@latest export --input sast/ --triaged --format oscal      --output sast-skills-sar.json
    npx sast-skills@latest export --input sast/ --triaged --format oscal-poam --output sast-skills-poam.json

- uses: actions/upload-artifact@v4
  with:
    name: oscal
    path: sast-skills-*.json

Cómo se mapea un hallazgo. OSCAL separa la evidencia del riesgo y del veredicto de cumplimiento, por lo que cada hallazgo de sast-skills se expande en tres objetos vinculados:

sast-skillsOSCALNotas
title, description, locationobservationmethods: ["TEST"], href de evidencia path/to/file.js#L42
severityrisk.characterizations[].facets[]faceta severity
exploitabilityfaceta likelihoodomitida cuando el hallazgo no la incluye
confidencefaceta confidenceomitida cuando el hallazgo no la incluye
remediationrisk.remediations[]lifecycle: "recommendation"
chain_id, skill, triage_statusrisk.props[]campos para los que OSCAL no tiene un espacio de primera clase
skill → controlesfinding.targetstatement-id si-10_smt, estado not-satisfied

Mapeo de controles. Cada habilidad de detección se mapea a los controles de NIST SP 800-53 Rev 5 cuyo objetivo sus hallazgos ponen en duda — sast-sqli → si-10, sast-crypto → sc-13/sc-28, sast-missingauth → ac-3/ac-6/ia-2, y así sucesivamente. Esos IDs pueblan reviewed-controls y el target-id de cada hallazgo. La tabla completa vive en src/oscal-controls.js; una habilidad sin mapear cae en ra-5 (Monitoreo y Escaneo de Vulnerabilidades) en lugar de descartarse.

La semántica del triaje difiere según el modelo. En el SAR, un hallazgo triado como falso positivo permanece en el documento como un riesgo cerrado — evidencia de que el escáner lo consideró y lo resolvió. En el POA&M se omite por completo, porque un POA&M es una lista de trabajo aún pendiente.

Identificadores estables. Todos los UUID son RFC 4122 v5, derivados del contenido propio del hallazgo (habilidad, archivo, línea, título). Re-exportar un directorio sast/ sin cambios produce un documento byte-idéntico aparte de las marcas de tiempo de ejecución, por lo que la salida OSCAL es segura para confirmar y comparar entre escaneos.

Gancho de pre-commit

Copia hooks/pre-commit en .git/hooks/pre-commit para que sast-skills doctor controle cada confirmación.

Docker

docker build -t sast-skills .
docker run --rm -v "$PWD:/work" sast-skills export --input sast/ --format sarif --output report.sarif

El Dockerfile incluido es basado en node:20-alpine con sast-skills establecido como punto de entrada.


🩺 Verificar y solucionar problemas

# Is the install in the expected shape?
npx sast-skills doctor --target . --assistant claude

# Version check
npx sast-skills --version
npm view sast-skills version    # latest on the registry

# Upgrade
npx sast-skills update

doctor sale con 0 si cada archivo incluido en el destino coincide con la copia de la versión instalada, y con 1 si algún archivo está MISSING o MODIFIED. MODIFIED significa que el archivo divergió de la copia incluida — esperado si editas el archivo de entrada, de lo contrario es una señal para ejecutar update.


🤝 Contribuciones

Consulta CONTRIBUTING.md. Bucle de desarrollo:

npm install
npm test                                  # vitest suite (TDD-guard enabled; count shown in the tests badge)
npm run sync                              # mirror .claude/skills → .agents/skills
node scripts/scaffold-skill.js sast-foo   # stub a new skill in both trees
node scripts/register-skill.js sast-foo foo "Foo" "Foo injection description"
npm run lint:md                           # markdownlint

prepublishOnly ejecuta npm run sync && npm test — un espejo sucio o una prueba en rojo aborta npm publish.


📄 Licencia

MIT — consulta LICENSE.