SkillTotal

Escáner de seguridad para servidores MCP, habilidades de agentes y paquetes npm/PyPI que reporta envenenamiento de herramientas y rutas de exfiltración con evidencia de archivo:línea.

Documentación

SkillTotal

PyPI Python License CI OpenSSF Scorecard

Escanea paquetes antes de que Claude Code los instale. SkillTotal es un escáner de seguridad estático para lo que los agentes de codificación instalan: paquetes npm y PyPI, servidores MCP, habilidades de agentes y repositorios git. Se ejecuta en tu máquina, nunca ejecuta el código que lee y nunca llama a un LLM. Cada hallazgo cita el archivo y la línea de donde proviene.

Inicio rápido

pipx install skilltotal

Luego, dentro de Claude Code:

/plugin marketplace add pezhik/skilltotal
/plugin install skilltotal@skilltotal
/reload-plugins

A partir de entonces, cuando el agente ejecute npx, npm install, pip install, uvx o claude mcp add, el plugin primero escanea el paquete que el comando nombra. Si el paquete tiene indicadores maliciosos, el comando se deniega y se le dice al agente qué se encontró y dónde:

SkillTotal blocked this install: it found malicious indicators. npm:some-pkg@1.0.3:
Decode-and-execute (obfuscated execution) at `scripts/setup.js:4`. Run
`skilltotal scan npm:some-pkg@1.0.3` to see every finding with its file:line evidence.

Sin el plugin, escanea cualquier cosa desde una terminal:

skilltotal scan npm:some-package         # or pypi:name, a git URL, a local folder or an archive
skilltotal guard npm:some-mcp-server     # exit code 2 if it should not be installed

Pruébalo en línea (sin instalación, sin cuenta): www.skilltotal.ai ejecuta el mismo motor.

SkillTotal analiza solo el componente en sí, no al usuario, empresa, entorno, despliegue o contexto de ejecución que lo rodea. Cada puntuación y hallazgo proviene de los archivos dentro del componente.

Principio central: cada hallazgo confirmado lleva evidencia (archivo, rango de líneas, fragmento de código). Cualquier cosa que no pueda vincularse a evidencia va a needs_review en lugar de findings y nunca afecta la puntuación.

Por qué SkillTotal

  • Comprueba paquetes antes de que tu agente los instale. El plugin de Claude Code lee cada comando npx, npm install, pip install o claude mcp add que el agente está a punto de ejecutar. Bloquea paquetes con indicadores maliciosos, y te pregunta primero sobre paquetes de riesgo alto o crítico y cualquier cosa que no haya podido comprobar. Configúralo.
  • Se ejecuta en tu máquina. No necesita cuenta ni token de API y no sube nada. Usa la red solo para obtener el paquete o repositorio que le pediste escanear.
  • Seguro para apuntar a componentes no confiables. El motor los lee y nunca los ejecuta. (El análisis dinámico en un sandbox aislado está planificado como un servicio de pago separado).
  • Cero dependencias en tiempo de ejecución. Usa solo la biblioteca estándar de Python, por lo que es fácil de auditar, integrar o ejecutar sin conexión a la red.
  • Determinista. La detección es mediante coincidencia de regex y AST sin LLM, por lo que la misma entrada siempre produce los mismos hallazgos y puntuación.
  • Anclado en evidencia, con pocos falsos positivos. Cada hallazgo apunta a un archivo:línea exacto.
  • Alineado con estándares. Cada componente obtiene una huella de rasgos de comportamiento mapeada al modelo de amenazas agéntico de Cloud Security Alliance (CSA), las capas del modelo de amenazas MAESTRO y las tácticas de MITRE ATLAS. Tres de los rasgos registran cómo el componente autentica sus llamadas a herramientas (una credencial estática incrustada, OAuth/OIDC delegado o una identidad con privilegios mínimos), lo que muestra el radio de explosión de un compromiso, no solo si existe un secreto.
  • Gratis y de código abierto (Apache-2.0). El informe estático completo es gratis, para siempre.

Medido, no afirmado

Las afirmaciones de detección son baratas, por lo que los números detrás de ellas se publican con los datos y el código que los produjeron.

  • El registro MCP, escaneado: 15,341 de los 17,535 componentes distintos en el registro oficial (87.5%), escaneados con conjuntos de reglas 56 a 59 y finalizados con el motor 0.49.0 el 2026-09-19. La mayoría del resto ya no era accesible o excedía un límite de tiempo o tamaño, y cada exclusión se cuenta. De los componentes escaneados, el 88.2% expone herramientas a un agente, el 64.8% puede alcanzar la red y el 21.1% puede ejecutar comandos de shell, sin embargo el 99.3% de ellos puntúa riesgo bajo, porque una capacidad por sí sola puntúa cero. JSON sin procesar · el arnés.
  • Eficacia de detección: recall y precisión en un corpus etiquetado que construimos y publicamos (64 muestras maliciosas y 46 benignas), regenerado en cada versión y aplicado por CI como un mínimo. Una puntuación perfecta en nuestro propio corpus protege contra regresiones; no es una afirmación sobre cada ataque en la naturaleza.

Ambos son reproducibles: misma entrada, mismo motor, misma salida. Nada se ejecuta y no interviene ningún LLM.

Instalación

Requiere Python 3.10+. Cero dependencias en tiempo de ejecución. git se requiere solo para escanear URLs remotas.

Para la CLI, se recomienda pipx. Se instala en un entorno aislado y también funciona en Debian/Ubuntu y Homebrew Python, donde PEP 668 bloquea un pip install simple:

pipx install skilltotal

Para instalar en un entorno virtual, o para usarlo como biblioteca:

pip install skilltotal

También puedes ejecutarlo con npx. El paquete npm solo inicia este motor, por lo que necesita uv, pipx, o Python 3.11+ con skilltotal instalado:

npx -y skilltotal scan https://github.com/owner/repo

Desde el código fuente (desarrollo):

pip install -e ".[dev]"

Plugin de Claude Code

Los agentes de codificación instalan paquetes en medio de una tarea, y el aviso de permiso, si lo hay, muestra solo el comando. El plugin comprueba cada paquete en tu máquina, con el mismo motor que la CLI, antes de que se ejecute el comando de instalación. Su hook reconoce npx, bunx, pnpm dlx, npm/pnpm/yarn/bun agregar o instalar, pip, uv, uvx, pipx, claude mcp add y claude mcp add-json. Lee un comando como lo haría el shell, por lo que también encuentra instalaciones detrás de sudo, env, bash -c '...', cmd /c y $(...), en grupos como (npm i y) y en cadenas como cd x && npm i y. En Windows, Claude Code ejecuta la mayoría de los comandos a través de su herramienta PowerShell, y el hook también sigue & { ... }, iex '...', Start-Process npm -ArgumentList ... y powershell -EncodedCommand.

Qué sucede con la instalación:

  • Indicadores maliciosos: el comando se deniega, y se le dice al agente el hallazgo y su archivo:línea.
  • Riesgo alto o crítico: Claude Code te pide aprobar la instalación y muestra el hallazgo principal.
  • Cualquier cosa que SkillTotal no pudo comprobar: Claude Code te pregunta. Esto cubre un paquete de un registro o índice personalizado (--registry, --index-url, --extra-index-url), una URL de archivo directa, una referencia git que el escaneo no puede reproducir exactamente, una comprobación que falló o no terminó dentro de los 20 segundos que comparten todas las comprobaciones de un comando, el sexto y posteriores paquetes en un comando, un nombre a una o dos letras de un paquete popular, y un script de instalación que SkillTotal no pudo leer. SkillTotal nunca deniega una instalación debido a su propio fallo.
  • Limpio: el paquete se instala como de costumbre, y el agente recibe una nota de una línea con la versión que se comprobó y su puntuación.

Los paquetes de GitHub (github:owner/repo#v1.2.0, git+https://github.com/...@ref) se escanean en la referencia que se instalará. Un veredicto se reutiliza para el mismo artefacto (una versión exacta de npm o un archivo de PyPI durante una semana, un repositorio git durante una hora), por lo que llamadas repetidas a npx tsc o npx prettier no provocan un nuevo escaneo. Cuando cambia la versión del motor, todo se escanea de nuevo. Para paquetes grandes, establece SKILLTOTAL_HOOK_BUDGET (en segundos, hasta 100) para esperar más de 20 segundos. En una ejecución sin supervisión (claude -p), Claude Code convierte una pregunta que nadie puede responder en una denegación, por lo que un paquete que el hook no pudo comprobar no se instala allí; da más tiempo a los paquetes grandes con la misma variable. El plugin también agrega un comando /skilltotal:scan <target> y registra el servidor MCP descrito a continuación.

El plugin llama a la CLI, así que instala la CLI donde Claude Code pueda encontrarla: skilltotal --version debería funcionar en la terminal desde la que inicias Claude Code. Si la CLI falta o no se inicia, los comandos de instalación se ejecutan sin comprobación y nada se bloquea. Claude Code entonces muestra una advertencia en cada uno, para que puedas distinguir una configuración rota de una comprobación limpia.

El hook se carga junto con los plugins, así que ejecuta /reload-plugins (o reinicia Claude Code) después de /plugin install. Para verlo funcionar sin tocar un paquete real, pide al agente que ejecute npm install --registry https://registry.example.invalid left-pad. Claude Code debería detenerse y preguntarte, con la razón de SkillTotal. Nada se instala a menos que lo apruebes.

Lo que el plugin no comprueba

  • Dependencias. Escanea el paquete que un comando nombra, no los paquetes que trae.
  • Instalaciones que no nombran ningún paquete. npm install, npm ci, pip install -r requirements.txt y uv sync instalan desde un archivo de bloqueo o un archivo de requisitos, que el hook no lee.
  • Comandos que construyen el nombre del paquete en tiempo de ejecución, y scripts que el agente descarga y ejecuta. El hook ve solo lo que el comando especifica.
  • Paquetes minificados. Se enumeran en el informe pero no se analizan. Los scripts que npm ejecuta en la instalación son la excepción: se analizan incluso cuando están minificados.
  • Ruedas específicas de plataforma. Para una versión de PyPI que las incluye, SkillTotal escanea la distribución de código fuente; la rueda que pip elige para tu máquina puede diferir de ella. Una versión cuya única rueda es Python puro se escanea como esa rueda.
  • Comportamiento en código Go, Rust, Java, Ruby y PHP. Los secretos, rutas sensibles y Unicode oculto se siguen comprobando allí.

Es una barrera estática, no un sandbox. Para código en el que no confíes, ejecuta el agente en un contenedor.

Uso

# Human-readable report
skilltotal scan ./path/to/component

# Scan a remote repository (shallow git clone)
skilltotal scan https://github.com/owner/repo

# Scan a project archive or a single file (e.g. an AI-generated project downloaded as a ZIP)
skilltotal scan ./my-project.zip
skilltotal scan ./app.tar.gz
skilltotal scan ./suspicious.py

# Scan a package from a registry (latest, or a pinned version)
skilltotal scan npm:left-pad
skilltotal scan npm:left-pad@1.3.0
skilltotal scan pypi:requests
skilltotal scan pypi:requests==2.31.0

# JSON to stdout
skilltotal scan ./component --json

# SARIF 2.1.0 (GitHub Code Scanning / IDE)
skilltotal scan ./component --sarif --output report.sarif

# Write the report to a file (SARIF if --sarif, else JSON)
skilltotal scan ./component --output report.json

# CI gate: exit code 2 by severity level or by risk score
skilltotal scan ./component --fail-on-high             # alias for --fail-on high
skilltotal scan ./component --fail-on medium
skilltotal scan ./component --fail-on-score 50

# Skip paths (repeatable; combined with the config file's `exclude`)
skilltotal scan ./component --exclude "vendor/*" --exclude "*.min.js"

# Opt-in provenance for npm:/pypi: sources (registry metadata -> needs_review, never scored)
skilltotal scan npm:some-lib --provenance

# Baseline: snapshot current findings, then suppress them on later scans
skilltotal scan ./component --write-baseline .skilltotal-baseline.json
skilltotal scan ./component --baseline .skilltotal-baseline.json --fail-on-high

# Diff two versions of a component: what changed between them?
# Each side is any scannable source (path/archive/git/npm:/pypi:) or a saved --json report.
skilltotal diff npm:some-lib@1.2.3 npm:some-lib@1.2.4
skilltotal diff ./old-checkout ./new-checkout --json
skilltotal diff old-report.json new-report.json
# CI gate: fail (exit 2) if the new version INTRODUCES a high/critical finding
skilltotal diff npm:some-lib@1.2.3 npm:some-lib@1.2.4 --fail-on-new high

# Pre-install guard: allow/block decision (exit 2 on block) you can chain before installing
skilltotal guard npm:some-mcp-server && claude mcp add some-mcp-server -- npx some-mcp-server
skilltotal guard --installed            # check every AI component already on this machine
skilltotal guard npm:x --block-on malicious   # block only on malicious indicators

# Inventory: discover AI components already installed on this machine and scan them
# (reads agent configs for Claude Desktop/Code, Cursor, Windsurf, VS Code, Gemini, and
#  local skills; derives an npm:/pypi:/local source per MCP server and runs the engine)
skilltotal inventory
skilltotal inventory --json
skilltotal inventory --no-scan          # list only, do not scan
skilltotal inventory --project .        # also include this project's agent configs
skilltotal inventory --sbom             # AI-BOM: CycloneDX 1.6 JSON of your agent stack,
                                        # scan verdicts attached as component properties

# List every detection rule
skilltotal rules list
skilltotal rules list --json

Baseline suprime hallazgos mediante una huella estable de (rule id, file, code snippet) — independiente de los números de línea, por lo que sobrevive a ediciones. Los hallazgos suprimidos se eliminan antes de la puntuación y no afectan la puntuación de riesgo.

Diff informa hallazgos nuevos / resueltos / cambiados, adiciones y eliminaciones a nivel de evidencia (emparejados por la misma huella independiente de línea que la baseline, por lo que los cambios puros de línea no son ruido), cambios de capacidad y el delta de puntuación de riesgo. --fail-on-new LEVEL se activa solo con el riesgo que la nueva versión introduce — los hallazgos aceptados existentes nunca lo activan, por lo que se adapta a revisiones de actualización ("¿es 1.2.4 más riesgoso que el 1.2.3 que ya validamos?") sin un archivo de baseline.

Guard es la respuesta en el momento de la instalación a "¿debería confiar en este componente ahora?". Los indicadores maliciosos siempre bloquean; el riesgo puntuado en/por encima de --block-on bloquea; las capacidades solas nunca bloquean — un servidor MCP legítimo con acceso a shell/red pasa, por lo que el guard permanece lo suficientemente silencioso como para dejarlo habilitado en todas partes (a diferencia de una puerta --fail-on high cruda, que se activaría con la mayoría de los hallazgos honestos de capacidades del ecosistema).

Provenance (--provenance, opt-in) agrega señales de metadatos de registro para fuentes npm: / pypi:: publicado recientemente, obsoleto / retirado, sin versiones recientes, sin enlace de repositorio. Los metadatos son contexto sobre un componente, no contenido del componente — por lo que estas señales van a needs_review y nunca afectan la puntuación o el veredicto, y el escaneo predeterminado sigue siendo solo del componente.

Configuración de proyecto (opcional) — confirma un .skilltotal.toml en lugar de repetir banderas (las banderas de CLI lo anulan):

fail_on = "high"           # low | medium | high | critical
fail_on_score = 50         # or gate on the 0-100 risk score
exclude = ["vendor/*", "*.min.js"]
ignore = ["ST-NET-PY"]     # rule ids to drop
baseline = ".skilltotal-baseline.json"

# Per-rule policy: reviewable gate decisions that live in the repo, not in a dashboard.
[policy]
"ST-SHELL-PIPE-EXEC" = "block"   # gate trips (exit 2) whenever this rule fires,
                                 # even with no fail_on configured
"ST-DYN-PY" = "warn"             # explicit accept-but-show: reported, still counts toward
                                 # the risk score, but exempt from the fail_on severity gate
"ST-SENS-WORD" = "ignore"        # suppressed entirely (same effect as `ignore`)

Para suprimir un hallazgo individual, coloca un comentario # skilltotal:ignore (o # skilltotal:ignore[ST-ID]) en su línea. Los marcadores en línea cuentan solo cuando escaneas un directorio local (tu propio código, como en CI). En un paquete o repositorio que SkillTotal descarga, se ignoran, por lo que un paquete no puede silenciar sus propios hallazgos.

python -m skilltotal ... funciona de manera idéntica al script de consola skilltotal.

Códigos de salida

CódigoSignificado
0Éxito
1Error de uso o recopilación (por ejemplo, un valor de bandera desconocido, una ruta faltante o un clon fallido)
2Una puerta configurada se activó (severidad --fail-on/--fail-on-high, --fail-on-score o diff --fail-on-new), o guard bloqueó el componente

Semántica de la compuerta: --fail-on/--fail-on-high se activan según la severidad de cualquier hallazgo individual, no según el risk_score agregado. Un componente puede reportar risk_level: low (puntuación 0) y aun así fallar la compuerta si tiene un hallazgo de alta severidad, incluida una capacidad como acceso a shell o red, que se reporta pero nunca se puntúa como maliciosa. Para usar la puntuación como criterio, use --fail-on-score; para aceptar hallazgos conocidos, use una línea base, una # skilltotal:ignore[ST-ID] en línea, o una acción por regla [policy] (block / warn / ignore).

CI / GitHub Action

Ejecute SkillTotal en CI y muestre los hallazgos en la pestaña Security → Code scanning de su repositorio.

# .github/workflows/skilltotal.yml
name: SkillTotal
on: [push, pull_request]
permissions:
  contents: read
  security-events: write   # required to upload SARIF to Code Scanning
  pull-requests: write     # required only for comment-on-pr (optional)
jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: pezhik/skilltotal@v0.62.0
        with:
          source: .             # a path, a git URL, or an npm:/pypi:<name> spec
          fail-on: high         # fail the build on a high/critical finding (or 'none')
          comment-on-pr: 'true' # post a sticky summary comment on pull requests (optional)

La acción ejecuta el motor incluido con la etiqueta que fije, por lo que no se descarga nada desde PyPI. Escanea source, sube SARIF (para que los hallazgos aparezcan en línea en las solicitudes de extracción y en Code Scanning) y falla el trabajo ante un hallazgo alto/crítico a menos que fail-on: none. Con comment-on-pr: 'true', publica un único comentario resumen en la solicitud de extracción (nivel de riesgo, puntuación, hallazgos, capacidades) y lo actualiza en su lugar en ejecuciones posteriores. El comentario está desactivado por defecto y requiere pull-requests: write. Fije la acción a una etiqueta publicada (consulte Releases), y configure la entrada version: solo para ejecutar una versión diferente del motor desde PyPI. Sin la acción, el mismo escaneo es skilltotal scan . --sarif --output skilltotal.sarif --fail-on-high.

Uso como hook de pre-commit

Ejecute SkillTotal en cada commit mediante pre-commit:

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/pezhik/skilltotal
    rev: v0.62.0
    hooks:
      - id: skilltotal
        args: [".", "--fail-on-high"]   # scan the repo; block the commit on a high/critical finding

Luego pre-commit install. El hook instala la CLI en su propio entorno y escanea el repositorio en el commit; ajuste el escaneo con las mismas banderas que la CLI (p. ej., --exclude, --fail-on).

Uso como servidor MCP

Permita que su agente verifique un componente antes de instalarlo. skilltotal mcp ejecuta el motor como un servidor MCP stdio (solo stdlib, aún cero dependencias) — regístrelo en Claude Code/Desktop, Cursor, Windsurf o cualquier cliente MCP:

{ "mcpServers": { "skilltotal": { "command": "skilltotal", "args": ["mcp"] } } }

Si no lo ha instalado localmente, use "command": "npx", "args": ["-y", "skilltotal", "mcp"] en su lugar. Esto requiere uv, pipx o Python 3.11+ con skilltotal.

Herramientas expuestas: scan_component (informe completo para una ruta / URL de git / fuente npm: / pypi:), diff_components (revisión de actualización: qué cambió entre dos versiones) y list_rules. Los escaneos se ejecutan localmente con el mismo motor estático que nunca ejecuta código — el código del componente no se sube a ningún lugar.

Añadir una insignia de estado

Escanee un componente en skilltotal.ai y cada informe ofrece un fragmento "Add this badge" — un pequeño SVG que siempre refleja el último escaneo del componente y enlaza de vuelta al informe completo. Colóquelo en su README para que los visitantes vean el riesgo de un vistazo:

[![SkillTotal](https://www.skilltotal.ai/…/badge?source=npm:your-package)](https://www.skilltotal.ai)

Copie el markdown exacto y listo para pegar desde la página del informe — completa la URL de la insignia por usted.

Metodología

SkillTotal realiza análisis de seguridad estático de componentes de IA — servidores MCP, habilidades/plugins de agentes, paquetes npm y PyPI, y proyectos/repositorios generados por IA. El motor combina análisis de capacidades, detección de patrones peligrosos, análisis de privilegios, análisis de cadena de suministro (en tiempo de instalación), análisis de superficie de prompts y correlación de flujo de datos (p. ej., acceso a secretos combinado con salida de red). Los hallazgos se asignan a categorías de riesgo y contribuyen a una puntuación de riesgo de 0–100; las capacidades se reportan pero nunca inflan la puntuación — capacidad ≠ riesgo. Nada se ejecuta y no se llama a ningún LLM, por lo que los resultados son deterministas y reproducibles.

Qué detecta

CategoríaEjemplos
Ejecución de shellsubprocess.*, os.system, child_process.exec
Acceso al sistema de archivosopen, read_text/write_text, fs.readFile/writeFile
Rutas sensibles~/.ssh, ~/.aws, .env, id_rsa, credentials, secrets
Salida de redrequests, urllib, aiohttp, fetch, axios
Ejecución en tiempo de instalaciónnpm preinstall/postinstall/prepare, hooks setup.py
Ejecución dinámica de códigoeval, exec, compile, new Function, vm.runInNewContext
Ofuscacióncadenas de decodificar-y-ejecutar, blobs base64, escape hexadecimal, minificación
Riesgos MCPmanifiestos, herramientas peligrosas (shell/fs/red/credenciales), comandos de servidor
Superficie de prompts"ignora instrucciones anteriores", "revela el prompt del sistema", redacción de exfiltración

Cobertura por tipo de componente

Leyenda: ✅ analizado por defecto para este tipo de componente · ⚠️ el motor detecta esto, pero esa superficie es poco común para este tipo — por lo que solo se marca cuando el componente realmente lo contiene (p. ej., texto de inyección de prompts dentro de un paquete npm/PyPI) · ❌ no aplicable a este tipo · 🚧 planificado (SkillTotal Cloud).

Las columnas son los tipos de componentes que SkillTotal escanea. Proyecto de IA = un repositorio o carpeta escaneada — una habilidad/plugin de agente, un código base generado por IA o un conjunto de prompts/configuraciones — que no es un paquete npm/PyPI publicado.

CategoríaMCPnpmPyPIProyecto de IA
Inyección de prompts / anulación de instrucciones✅⚠️⚠️✅
Envenenamiento de herramientas (metadatos de herramientas MCP)✅❌❌⚠️
Capacidades peligrosas (shell / fs / red)✅✅✅⚠️
Exfiltración de datos (acceso a secretos + salida)✅✅✅⚠️
Robo de secretos / acceso a rutas sensibles✅✅✅⚠️
Ejecución dinámica de código✅✅✅⚠️
Ofuscación (decodificar-y-ejecutar)✅✅✅✅
Contrabando de Unicode oculto✅✅✅✅
Secretos incrustados (claves/tokens codificados)✅✅✅✅
Hooks de instalación / cadena de suministro⚠️✅✅❌
Herramientas con privilegios excesivos / autoaprobadas✅❌❌⚠️
Análisis de comportamiento en tiempo de ejecución🚧🚧🚧🚧
Análisis en sandbox🚧🚧🚧🚧

Hallazgos típicos

  • Una herramienta MCP puede ejecutar comandos de shell arbitrarios
  • Un paquete descarga y ejecuta código desde una URL externa
  • Acceso a ubicaciones de credenciales (~/.aws, ~/.ssh, .env) detectado
  • Ejecución dinámica de código (eval / exec) detectada
  • Redacción de inyección de prompts / anulación de instrucciones en una descripción de herramienta o habilidad
  • Acceso a datos sensibles combinado con salida de red externa
  • Claves API o tokens codificados
  • Un servidor MCP con herramientas autoaprobadas o con privilegios excesivos
  • Entrada no confiable (entorno, sys.argv, un cuerpo de solicitud/respuesta) que fluye hacia exec o un shell — una ruta de inyección comprobada, no solo una API peligrosa de forma aislada
  • Una habilidad de agente hace más de lo que sus allowed-tools declarados permiten (capacidad no declarada / violación de privilegio mínimo)

Fuera de alcance

SkillTotal analiza estáticamente los archivos propios de un único componente. No ejecuta código, observa el comportamiento en tiempo de ejecución ni evalúa su entorno, implementación o infraestructura. No es un sustituto de:

  • una prueba de penetración
  • una revisión de seguridad de aplicaciones (app-sec)
  • una revisión de arquitectura / diseño
  • una evaluación de seguridad en la nube o de infraestructura
  • una auditoría de tiempo de ejecución de Kubernetes / contenedores
  • una revisión de lógica de negocio
  • una revisión manual de código

El análisis de comportamiento en tiempo de ejecución y en sandbox está planificado para SkillTotal Cloud (de pago).

Salida

Un informe normalizado que contiene la identidad del componente, una puntuación de riesgo (0–100) y nivel de riesgo (bajo / medio / alto / crítico), capacidades detectadas (cada una respaldada por evidencia), una huella de rasgos de comportamiento (con un mapeo cruzado CSA / MAESTRO / MITRE ATLAS), hallazgos, needs_review y metadatos. Consulte docs/report-schema.md y docs/scoring.md.

Cada hallazgo también lleva sus ids de categoría OWASP Agentic Skills Top 10 (owasp), emitidos tanto en el informe JSON como en SARIF (taxonomies/relationships nativos); docs/owasp-agentic-skills-mapping.md explica la cobertura (AST01–AST05) y las brechas honestas. Para servidores MCP, docs/mcp-owasp-mapping.md mapea las verificaciones de SkillTotal a la OWASP MCP Security Cheat Sheet (y nombra los controles de tiempo de ejecución que un motor estático no puede cubrir).

El array traits del informe es una huella de comportamiento — una proyección de nivel superior sobre los hallazgos (p. ej., execution_authority, embedded_credential, untrusted_perception y la combinación emergente exfil_correlation) — cada uno mapeado al modelo basado en rasgos de Cloud Security Alliance, una capa de modelo de amenazas MAESTRO y una táctica MITRE ATLAS donde hay un ajuste honesto. Es descriptivo y nunca afecta la puntuación; consulte docs/trait-crosswalk.md.

Arquitectura

El paquete bajo skilltotal/ (excepto cli.py) es una biblioteca pura y sin efectos secundarios, por lo que el mismo motor impulsa la aplicación web en www.skilltotal.ai. Consulte docs/architecture.md.

Desarrollo

pip install -e ".[dev]"
pytest

Notas de precisión

  • Python se analiza mediante un AST (resuelve alias de importación, distingue open(p,'w') de una lectura, ignora nombres de API que solo aparecen en cadenas/comentarios). Node.js/config usan regex.
  • Idiomas: la ejecución de shell, el acceso a red, el acceso a archivos y el código dinámico se detectan en Python y JavaScript/TypeScript. Los archivos Go, Rust, Java, Ruby y PHP aún reciben las verificaciones de secretos, rutas sensibles y Unicode oculto, pero su comportamiento aún no se analiza. Si un componente incluye código en esos idiomas, el informe añade una nota needs_review, y un veredicto bajo dice "Analizado parcialmente" en lugar de "No se encontraron riesgos significativos".
  • Código de prueba (__tests__/, *.test.*, tests/, conftest.py, …) se degrada a needs_review — no lo ejecutan los consumidores, por lo que no afecta la puntuación.
  • Señales ambiguas (palabras sueltas secrets/credentials, blobs base64 aislados, redacción "antes de responder", archivos minificados) van a needs_review, nunca a findings.
  • Unicode oculto (caracteres de etiqueta de contrabando ASCII, anulaciones bidi Trojan-Source, caracteres de ancho cero) se detecta y decodifica — una evasión real utilizada para contrabandear instrucciones más allá de la revisión humana. Consulte tests/manual_eval/ para la calibración contra ataques del mundo real.
  • La ejecución de shell cubre subprocess/os.system, asyncio.create_subprocess_*, Node child_process y bibliotecas comunes de creación de procesos (Python sh/plumbum/pexpect/ invoke/fabric; Node zx/execa/cross-spawn/shelljs/tinyexec/node-pty).
  • Las herramientas peligrosas de MCP se clasifican por nombre/descripción tanto en manifiestos JSON como cuando se definen en código (server.tool("run_command", …), @mcp.tool sobre def read_file).
  • Limitaciones: la detección está a nivel de llamada/importación. La capacidad mediante una biblioteca de nivel superior no reconocida (p. ej., una biblioteca de git que escribe archivos internamente, una biblioteca de navegador) puede no marcarse como una llamada bruta de sistema de archivos/shell. Las capacidades indican presencia, no uso indebido comprobado.

Código abierto vs SkillTotal Cloud

SkillTotal es open core. Este motor (el análisis, todas las reglas de detección y la CLI) es de código abierto y completo por sí solo: puede ejecutarlo localmente o en CI, de forma gratuita, con cero dependencias de tiempo de ejecución. Le dice qué hace un componente, con evidencia.

Las funciones de pago están planificadas para SkillTotal Cloud (el sitio web) y explicarán por qué importa: interpretación y priorización de hallazgos con LLM, ejecución dinámica en sandbox, historial de escaneos y monitoreo. Se ejecutarán como servicios del lado del servidor sobre este motor, y su código no forma parte de este repositorio. Consulte docs/open-core.md.

Licencia

Apache-2.0. Consulte también NOTICE.