Skip to main content

AI Component Security Platform — static security analysis for AI components (CLI engine)

Project description

SkillTotal

AI Component Security Platform — open-source CLI engine.

SkillTotal statically analyzes AI-related components (skills, plugins, MCP servers, npm / Python packages, repositories) to surface supply-chain risks, dangerous capabilities, prompt-injection surfaces, and data-exfiltration paths before the component is installed or trusted.

It analyzes only the component itself — never your user, company, environment, deployment, or runtime context. Every score and finding is derived exclusively from the files inside the component.

Core principle: every confirmed finding carries evidence (file, line range, code snippet). Anything that cannot be evidenced is placed in needs_review, never in findings, and never affects the score.

Install

Requires Python 3.10+. Zero runtime dependencies. git is required only for scanning remote URLs.

Recommended for the CLI — pipx (isolated install; also works on Debian/Ubuntu where bare pip install is blocked by PEP 668):

pipx install skilltotal

Or into a virtual environment / as a library:

pip install skilltotal

From source (development):

pip install -e ".[dev]"

Usage

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

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

# 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 if any finding is high or critical
skilltotal scan ./component --fail-on-high

# 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

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

Baseline suppresses findings by a stable fingerprint of (rule id, file, code snippet) — independent of line numbers, so it survives edits. Suppressed findings are removed before scoring and do not affect the risk score.

python -m skilltotal ... works identically to the skilltotal console script.

Exit codes

Code Meaning
0 Success
1 Usage / collection error (e.g. path missing, clone failed)
2 --fail-on-high set and a finding of severity ≥ high was produced

What it detects

Category Examples
Shell execution subprocess.*, os.system, child_process.exec
Filesystem access open, read_text/write_text, fs.readFile/writeFile
Sensitive paths ~/.ssh, ~/.aws, .env, id_rsa, credentials, secrets
Network egress requests, urllib, aiohttp, fetch, axios
Install-time execution npm preinstall/postinstall/prepare, setup.py hooks
Dynamic code execution eval, exec, compile, new Function, vm.runInNewContext
Obfuscation decode-and-execute chains, base64 blobs, hex escaping, minification
MCP risks manifests, dangerous tools (shell/fs/network/credential), server commands
Prompt surface "ignore previous instructions", "reveal system prompt", exfiltration phrasing

Output

A normalized report containing the component identity, a risk score (0–100) and risk level (low / medium / high / critical), detected capabilities (each evidence-backed), findings, needs_review, and metadata. See docs/report-schema.md and docs/scoring.md.

Architecture

The package under skilltotal/ (except cli.py) is a pure, side-effect-free library so the same engine can power the future web app and enterprise SaaS. See docs/architecture.md.

Development

pip install -e ".[dev]"
pytest

Accuracy notes

  • Python is analyzed via an AST (resolves import aliases, tells open(p,'w') from a read, ignores API names that only appear in strings/comments). Node.js/config use regex.
  • Test code (__tests__/, *.test.*, tests/, conftest.py, …) is demoted to needs_review — it is not executed by consumers, so it does not affect the score.
  • Ambiguous signals (bare secrets/credentials words, lone base64 blobs, "before answering" phrasing, minified files) go to needs_review, never to findings.
  • Hidden Unicode (ASCII-smuggling tag characters, Trojan-Source bidi overrides, zero-width chars) is detected and decoded — a real evasion used to smuggle instructions past human review. See tests/manual_eval/ for calibration against real-world attacks.
  • Shell execution covers subprocess/os.system, asyncio.create_subprocess_*, Node child_process, and common process-spawning libraries (Python sh/plumbum/pexpect/ invoke/fabric; Node zx/execa/cross-spawn/shelljs/tinyexec/node-pty).
  • MCP dangerous tools are classified by name/description both in JSON manifests and when defined in code (server.tool("run_command", …), @mcp.tool over def read_file).
  • Limitations: detection is at the call/import level. Capability via an unrecognized higher-level library (e.g. a git library that writes files internally, a browser library) may not be flagged as a raw filesystem/shell call. Capabilities indicate presence, not proven misuse.

Open source vs SkillTotal Cloud

SkillTotal is open core. This engine (analysis + all detection rules + CLI) is open source and complete on its own — run it locally or in CI, free, offline, with zero runtime dependencies. It tells you what a component does, with evidence.

Paid features are delivered only via SkillTotal Cloud (the website) and explain why it matters: LLM interpretation and prioritization of findings, dynamic sandbox execution, hosting, scan history, and monitoring. They are server-side services on top of this engine — their code is not part of this repository. See docs/open-core.md.

License

Apache-2.0. See also NOTICE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

skilltotal-0.4.0.tar.gz (58.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

skilltotal-0.4.0-py3-none-any.whl (56.2 kB view details)

Uploaded Python 3

File details

Details for the file skilltotal-0.4.0.tar.gz.

File metadata

  • Download URL: skilltotal-0.4.0.tar.gz
  • Upload date:
  • Size: 58.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for skilltotal-0.4.0.tar.gz
Algorithm Hash digest
SHA256 3aa12ab355a0c573744513d0dbca1e30baf080855fd71666feb2083ce4b75136
MD5 e2b46c9fc89685fc1b2dcd61a0baab4a
BLAKE2b-256 1cfe1e4e3f7b430a6f05b0b41e0f81c4d4897df95e1be0ffe8f10345de7de3a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for skilltotal-0.4.0.tar.gz:

Publisher: release.yml on pezhik/skilltotal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file skilltotal-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: skilltotal-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 56.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for skilltotal-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 59d665f73f3721a08aaf1920c3fa4f9f6301e2888442c06d38b357171340d9b6
MD5 f1c97bd235903e186f7dd515ef84453d
BLAKE2b-256 ed5b202a1b6a9977f31720f407542bb5467935c4818989ea28d5c8b0bb2d17b9

See more details on using hashes here.

Provenance

The following attestation bundles were made for skilltotal-0.4.0-py3-none-any.whl:

Publisher: release.yml on pezhik/skilltotal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page