
Sicherheitsscanner für Agenten-Fähigkeiten
Ein Best-Effort-Sicherheitsscanner für AI Agent Skills, der Prompt-Injection, Datenexfiltration und bösartige Codemuster erkennt. Er kombiniert musterbasierte Erkennung (YAML + YARA), LLM-as-a-judge und verhaltensbasierte Datenflussanalyse, um die Erkennungsabdeckung wahrscheinlicher Bedrohungen zu maximieren und gleichzeitig Fehlalarme zu minimieren.
Wichtig: Dieser Scanner bietet Best-Effort-Erkennung, keine umfassende oder vollständige Abdeckung. Ein Scan, der keine Befunde liefert, garantiert nicht, dass ein Skill frei von allen Bedrohungen ist. Siehe Umfang und Einschränkungen unten.
Unterstützt die Formate OpenAI Codex Skills und Cursor Agent Skills gemäß der Agent-Skills-Spezifikation. Mit --lenient werden auch nicht standardkonforme Formate gescannt, wie Claude Code .claude/commands/*.md und flache Markdown-Skill-Repositories.
Treten Sie dem Cisco-AI-Discord bei, um zu diskutieren, Feedback zu teilen oder sich mit dem Team zu vernetzen.
Skill Scanner ist ein Erkennungstool. Es identifiziert bekannte und wahrscheinliche Risikomuster, bescheinigt aber keine Sicherheit.
Wichtigste Einschränkungen:
Voraussetzungen: Python 3.10+ und uv (empfohlen) oder pip
# Using uv (recommended)
uv pip install cisco-ai-skill-scanner
# Using pip
pip install cisco-ai-skill-scanner
# AWS Bedrock support
pip install cisco-ai-skill-scanner[bedrock]
# Google AI Studio / Gemini support
pip install cisco-ai-skill-scanner[google]
# Google Vertex AI support
pip install cisco-ai-skill-scanner[vertex]
# Azure OpenAI support
pip install cisco-ai-skill-scanner[azure]
# All cloud providers
pip install cisco-ai-skill-scanner[all]
# For LLM analyzer and Meta-analyzer
export SKILL_SCANNER_LLM_API_KEY="your_api_key"
export SKILL_SCANNER_LLM_MODEL="claude-3-5-sonnet-20241022"
# For VirusTotal binary scanning
export VIRUSTOTAL_API_KEY="your_virustotal_api_key"
# For Cisco AI Defense
export AI_DEFENSE_API_KEY="your_aidefense_api_key"
Nicht sicher, welche Flags Sie verwenden sollen? Führen Sie skill-scanner ohne Argumente aus, um den interaktiven Assistenten zu starten:
skill-scanner
Der Assistent führt Sie durch die Auswahl von Scan-Ziel, Analysatoren, Policy und Ausgabeformat und zeigt dann den zusammengestellten Befehl, bevor er ihn ausführt. Ideal, um die CLI kennenzulernen.
# Scan a single skill (core analyzers: static + bytecode + pipeline)
skill-scanner scan /path/to/skill
# Scan with behavioral analyzer (dataflow analysis)
skill-scanner scan /path/to/skill --use-behavioral
# Scan with all engines
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense
# Scan with meta-analyzer for false positive filtering
skill-scanner scan /path/to/skill --use-llm --enable-meta
# Scan with trigger analyzer for vague description checks
skill-scanner scan /path/to/skill --use-trigger
# Run LLM analyzer multiple times and keep majority-agreed findings
skill-scanner scan /path/to/skill --use-llm --llm-consensus-runs 3
# Scan multiple skills recursively
skill-scanner scan-all /path/to/skills --recursive --use-behavioral
# Scan multiple skills with cross-skill overlap detection
skill-scanner scan-all /path/to/skills --recursive --check-overlap
# Scan a GitHub repository (owner/repo shorthand or full URL)
skill-scanner scan-repo owner/repo
skill-scanner scan-repo https://github.com/owner/repo --use-llm
# Lenient mode: tolerate malformed skills instead of failing
skill-scanner scan /path/to/skill --lenient
skill-scanner scan-all /path/to/skills --recursive --lenient
# Lenient mode with non-standard skill formats (no SKILL.md required)
skill-scanner scan .claude/commands/deploy --lenient
skill-scanner scan-all .claude/commands --recursive --lenient
# Use a custom metadata filename instead of SKILL.md
skill-scanner scan /path/to/skill --skill-file README.md
# CI/CD: Fail build if threats found
skill-scanner scan-all ./skills --fail-on-severity high --format sarif --output results.sarif
# Generate interactive HTML report with attack correlation groups
skill-scanner scan /path/to/skill --use-llm --enable-meta --format html --output report.html
# Use custom YARA rules
skill-scanner scan /path/to/skill --custom-rules /path/to/my-rules/
# Use custom taxonomy + threat mapping profiles (JSON/YAML)
skill-scanner scan /path/to/skill --taxonomy /path/to/taxonomy.json --threat-mapping /path/to/threat_mapping.json
# VirusTotal hash scan with optional unknown-file uploads
skill-scanner scan /path/to/skill --use-virustotal --vt-upload-files
# Use a scan policy preset (strict, balanced, permissive)
skill-scanner scan /path/to/skill --policy strict
# Use a custom org policy file
skill-scanner scan /path/to/skill --policy my_org_policy.yaml
# Generate a policy file to customise
skill-scanner generate-policy -o my_org_policy.yaml
# Interactive policy configurator (TUI)
skill-scanner configure-policy
Hinweis zum LLM-Anbieter: --llm-provider akzeptiert derzeit anthropic oder openai. Für Bedrock, Vertex, Azure, Gemini und andere LiteLLM-Backends konfigurieren Sie anbieterspezifische Modellzeichenfolgen und Umgebungsvariablen (siehe LLM-Analysator-Dokumentation).
from skill_scanner import SkillScanner
from skill_scanner.core.analyzers import BehavioralAnalyzer
# Create scanner with analyzers
scanner = SkillScanner(analyzers=[
BehavioralAnalyzer(),
])
# Scan a skill
result = scanner.scan_skill("/path/to/skill")
print(f"Findings: {len(result.findings)}")
print(f"Max severity: {result.max_severity}")
# Note: is_safe indicates no HIGH/CRITICAL findings were detected.
# It does not guarantee the skill is free of all risk.
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
Hinweis: „No findings“ bedeutet, dass der Scanner keine bekannten Bedrohungsmuster erkannt hat – es ist keine Garantie dafür, dass der Skill frei von jeglichem Risiko ist. Siehe Umfang und Einschränkungen.
Scannen Sie Skills bei jedem Push oder PR automatisch mit dem wiederverwendbaren Workflow:
# .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
Die Ergebnisse erscheinen als Inline-Anmerkungen in PRs über GitHub Code Scanning. Weitere Informationen zur LLM-Integration, Secret-Konfiguration und Einrichtung des Branch-Schutzes finden Sie in der vollständigen Anleitung.
Scannen Sie Skills vor jedem Commit mit dem pre-commit-Framework:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/cisco-ai-defense/skill-scanner
rev: v1.0.0 # use the latest release tag
hooks:
- id: skill-scanner
Oder installieren Sie den integrierten Hook direkt:
skill-scanner-pre-commit install
Der Hook erkennt automatisch, welche Skill-Verzeichnisse Änderungen in der Staging-Area enthalten, und scannt nur diese, sodass die Commit-Zeiten kurz bleiben. Verwenden Sie --all, um alles zu scannen.
Wir freuen uns über Beiträge! Richtlinien finden Sie in CONTRIBUTING.md.
Apache 2.0 – Details siehe LICENSE.
Copyright 2026 Cisco Systems, Inc. und verbundene Unternehmen
| Anleitung | Beschreibung |
|---|
| Schnellstart | In 5 Minuten starten |
| Architektur | Systemdesign und Komponenten |
| Bedrohungs-Taxonomie | Vollständige AITech-Bedrohungs-Taxonomie mit Beispielen |
| LLM-Analysator | LLM-Konfiguration und -Nutzung |
| Meta-Analysator | Fehlalarm-Filterung und Priorisierung |
| Verhaltens-Analysator | Details zur Datenflussanalyse |
| Scan-Policy | Benutzerdefinierte Policys, Voreinstellungen und Tuning-Anleitung |
| Policy-Kurzreferenz | Kompakte Referenz für Policy-Abschnitte und Stellschrauben |
| Regel-Erstellung | So fügen Sie Signatur-, YARA- und Python-Regeln hinzu |
| GitHub Actions | Wiederverwendbarer Workflow für die CI/CD-Integration |
| API-Referenz | REST-API-Dokumentation |
| Entwicklungsanleitung | Beiträge und Entwicklungseinrichtung |
| Analysator | Erkennungsmethode | Umfang | Anforderungen |
|---|
| Static | YAML + YARA-Muster | Alle Dateien | Keine |
| Bytecode | .pyc-Integritätsprüfung | Python-Bytecode | Keine |
| Pipeline | Command-Taint-Analyse | Shell-Pipelines | Keine |
| Behavioral | AST-Datenflussanalyse | Python-Dateien | Keine |
| LLM | Semantische Analyse | SKILL.md + Skripte | API-Schlüssel |
| Meta | Fehlalarm-Filterung | Alle Befunde | API-Schlüssel |
| VirusTotal | Hash-basierte Malware-Erkennung | Binärdateien | API-Schlüssel |
| AI Defense | Cloud-basierte KI | Textinhalte | API-Schlüssel |
| Option | Beschreibung |
|---|
--policy | Scan-Policy: Name einer Voreinstellung (strict, balanced, permissive) oder Pfad zu einer benutzerdefinierten YAML-Datei |
--use-behavioral | Verhaltens-Analysator aktivieren (Datenflussanalyse) |
--use-llm | LLM-Analysator aktivieren (erfordert API-Schlüssel) |
--llm-provider | LLM-Anbieter für das CLI-Routing: anthropic oder openai |
--llm-consensus-runs N | LLM-Analyse N-mal ausführen und Befunde mit Mehrheitszustimmung behalten |
--llm-max-tokens N | Maximale Anzahl an Ausgabetokens für LLM-Antworten (Standard: 8192) |
--use-virustotal | VirusTotal-Binärscanner aktivieren |
--vt-api-key KEY | VirusTotal-API-Schlüssel direkt angeben (optional) |
--vt-upload-files | Unbekannte Binärdateien an VirusTotal hochladen (optional) |
--use-aidefense | Cisco-AI-Defense-Analysator aktivieren |
--aidefense-api-url URL | AI-Defense-API-URL überschreiben (optional) |
--use-trigger | Trigger-Spezifitäts-Analysator aktivieren |
--enable-meta | Meta-Analysator für Fehlalarm-Filterung aktivieren |
--verbose | Policy-Fingerabdrücke pro Befund, Kookkurrenz-Metadaten einbeziehen und Fehlalarme des Meta-Analysators beibehalten |
--format | Ausgabe: summary, json, markdown, table, sarif, html. Das Format html erzeugt einen eigenständigen interaktiven Bericht mit aufklappbaren Korrelationsgruppen, erweiterbaren Code-Snippets und Taint-Flussdiagrammen für Pipelines |
--detailed | Detaillierte Befunde in die Markdown-Ausgabe aufnehmen |
--compact | Kompakte JSON-Ausgabe |
--output PATH | Standard-Ausgabedateipfad (wird durch --output-<fmt> überschrieben) |
--fail-on-findings | Mit Fehler beenden, wenn HIGH/CRITICAL gefunden wurde (Kurzform für --fail-on-severity high) |
--fail-on-severity LEVEL | Mit Fehler beenden, wenn Befunde auf oder über LEVEL vorliegen (critical, high, medium, low, info) |
--custom-rules PATH | Benutzerdefinierte YARA-Regeln aus einem Verzeichnis verwenden |
--taxonomy PATH | Benutzerdefiniertes Taxonomie-Profil (JSON/YAML) für diesen Lauf laden |
--threat-mapping PATH | Benutzerdefiniertes Bedrohungszuordnungsprofil des Scanners (JSON) für diesen Lauf laden |
--lenient | Fehlerhafte Skills tolerieren (ungültige Felder umwandeln, Standardwerte ergänzen), statt abzubrechen. Wenn SKILL.md fehlt, wird auf das Scannen von .md-Dateien im Verzeichnis zurückgegriffen |
--skill-file FILENAME | Benutzerdefinierter Dateiname für Metadaten anstelle von SKILL.md (z. B. README.md) |
--check-overlap | (scan-all) Überlappungsprüfung der Skill-Beschreibungen aktivieren |
| Befehl | Beschreibung |
|---|
| (kein Befehl) | Interaktiven Scan-Assistenten starten (wenn er in einem Terminal ausgeführt wird) |
interactive | Interaktiven Scan-Assistenten starten (explizit) |
scan | Ein einzelnes Skill-Verzeichnis scannen |
scan-all | Mehrere Skills scannen (mit --recursive, --check-overlap) |
generate-policy | Eine Scan-Policy-YAML zur Anpassung erzeugen |
configure-policy | Interaktive TUI zum Erstellen/Bearbeiten einer benutzerdefinierten Scan-Policy (--input wird unterstützt) |
list-analyzers | Verfügbare Analysatoren anzeigen |
validate-rules | Regelsignaturen validieren (--rules-file wird unterstützt) |