SkillSpector Web
Eine schlanke Web-Oberfläche für NVIDIA SkillSpector – prüft AI-Agent-Skills (Claude Code, Codex, MCP) auf Sicherheitsrisiken wie Prompt-Injection, Daten-Exfiltration, Supply-Chain-Probleme oder gefährlichen Code, bevor sie installiert werden.
Live: (hier deine Subdomain eintragen, z. B. https://skillspector.obraasch.de/)
Was macht das Tool?
- Du gibst die URL eines Git-Repositorys (oder eine ZIP-Datei) mit einem AI-Agent-Skill an.
- Im Hintergrund läuft
skillspector scan– reine statische Analyse (Regex, Python-AST, YARA-Signaturen), optional ergänzt durch eine LLM-Bewertung der Dateiinhalte. - Du bekommst einen Risk Score (0–100) mit Einstufung
SAFE/CAUTION/DO_NOT_INSTALLsowie eine Liste der gefundenen Probleme.
Der gescannte Skill wird dabei zu keinem Zeitpunkt ausgeführt.
Nutzung
Formular öffnen → Git-URL eintragen oder ZIP hochladen → "Scan starten". Fertig. Kein Account nötig (sofern der Betreiber den öffentlichen Modus aktiviert hat, siehe unten).
Selbst betreiben: Setup mit Gitea + Portainer
1. Repository klonen/forken
Dieses Repository enthält alles, was für ein eigenständiges Deployment
nötig ist: Dockerfile, requirements.txt, app.py, docker-compose.yml.
2. Stack in Portainer anlegen
-
Stacks → Add stack → Build method: Repository
- Repository URL: die URL dieses Repos
- Reference:
refs/heads/main - Compose path:
docker-compose.yml
-
Environment variables im Portainer-UI setzen (niemals ins Repo committen):
Variable Zweck Beispiel REQUIRE_AUTHtrue= privat mit Login,false= öffentlich ohne LoginfalseWEBUI_USER/WEBUI_PASSWORDNur relevant wenn REQUIRE_AUTH=true– HOST_PORTHost-Port, falls der Standard (8010) belegt ist 8011MAX_SCANS_PER_HOUR_PER_IPRate-Limit pro IP 10MAX_CONCURRENT_SCANSWie viele Scans gleichzeitig laufen dürfen 2ENABLE_LLM_OPTIONSchaltet die LLM-Checkbox für Nutzer frei falseOPENROUTER_API_KEYNur wenn ENABLE_LLM_OPTION=truesk-or-...OPENROUTER_MODELModell-Slug bei OpenRouter anthropic/claude-sonnet-4.5 -
Deploy the stack.
3. Port-Konflikt beheben ("bind: address already in use")
Diese Fehlermeldung heißt: Ein anderer Container/Prozess auf deinem Server belegt den Port bereits. Zwei Wege:
- Anderen Port wählen (empfohlen): Umgebungsvariable
HOST_PORTin Portainer setzen, z. B.8010,8011… Der Compose-Datei ist das schon vorbereitet (127.0.0.1:${HOST_PORT:-8010}:8000). - Belegenden Prozess finden: auf dem Server
sudo ss -tlnp | grep 8000(oderdocker ps– oft ist es ein anderer Stack, der ebenfalls Port 8000 nutzt).
4. Automatische Updates
Im Dockerfile ist SkillSpector ohne Versions-Pin installiert
(git+https://github.com/NVIDIA/skillspector.git). Jeder Image-Rebuild holt
also automatisch die aktuellste Version. Damit das regelmäßig passiert:
-
Stack öffnen → GitOps updates aktivieren
-
Mechanismus Polling, Intervall z. B.
24h -
Force redeployment und Re-pull image aktivieren
→ Portainer baut das Image alle 24 h neu, auch ohne Änderung an diesem Repo, und zieht damit automatisch die neueste SkillSpector-Version.
Falls deine Portainer-Version das nicht anbietet: den Stack gelegentlich manuell über "Pull and redeploy" neu bauen.
LLM-Analyse über OpenRouter einrichten
SkillSpector unterstützt LLM-Analyse über jeden OpenAI-kompatiblen Endpunkt. OpenRouter ist genau das – daher funktioniert es mit:
SKILLSPECTOR_PROVIDER=openai
OPENAI_API_KEY=<dein-openrouter-key>
OPENAI_BASE_URL=https://openrouter.ai/api/v1
SKILLSPECTOR_MODEL=anthropic/claude-sonnet-4.5 # oder ein anderes Modell-Slug
Das ist im docker-compose.yml bereits vorbereitet (OPENROUTER_API_KEY /
OPENROUTER_MODEL setzen, ENABLE_LLM_OPTION=true). Zwei Dinge zu beachten:
- Kosten/Abuse: Ohne
ENABLE_LLM_OPTION=trueist die LLM-Checkbox für Nutzer gar nicht sichtbar – dein OpenRouter-Guthaben ist also standardmäßig nicht angreifbar, selbst im öffentlichen Modus. Das Rate-Limit (MAX_SCANS_PER_HOUR_PER_IP) begrenzt zusätzlich, wie oft ein einzelner Nutzer die LLM-Analyse überhaupt anstoßen kann. - Nicht jedes Modell liefert zuverlässig strukturierte JSON-Antworten.
Falls die LLM-Analyse mit einem Fehler abbricht, zuerst ein bekanntes,
instruction-following-starkes Modell testen (z. B. ein aktuelles
Claude- oder GPT-Modell über OpenRouter); im Zweifel bleibt
--no-llm(Standard) immer als zuverlässiger Fallback.
Sicherheitsarchitektur
Container-Ebene (schützt deinen Server):
- Kein Docker-Socket-Mount – der Container kann weder andere Container noch den Host steuern.
read_only: true– Root-Dateisystem unveränderlich, nur/tmpund das Scan-Verzeichnis sind flüchtiger RAM-Speicher (tmpfs).cap_drop: ALLundno-new-privileges– keine erweiterten Linux-Rechte.- Ressourcenlimits (
mem_limit,cpus) – ein hängender oder böswilliger Scan kann den restlichen Server nicht belasten. - Port nur auf
127.0.0.1gebunden – öffentliche Erreichbarkeit ausschließlich über deinen Reverse Proxy (TLS, eigene Subdomain).
Anwendungs-Ebene (schützt vor Missbrauch durch Fremdnutzer, relevant seit öffentlichem Betrieb):
- SSRF-Schutz: Ziel-URLs werden aufgelöst und abgelehnt, wenn sie auf private/interne/Loopback-Adressen zeigen (verhindert, dass jemand über das Formular dein internes Netzwerk abscannt).
- Rate-Limiting: maximal
MAX_SCANS_PER_HOUR_PER_IPScans pro IP und Stunde. - Concurrency-Limit: maximal
MAX_CONCURRENT_SCANSScans gleichzeitig, weitere Anfragen werden abgewiesen statt den Server zu überlasten. - Zeitlimit je Scan (
SCAN_TIMEOUT_SECONDS). - LLM-Analyse ist ein bewusstes Opt-in des Betreibers, nicht der Nutzer.
- SkillSpector führt den gescannten Skill nie aus – nur statische Analyse plus optionale LLM-Bewertung von Dateiinhalten.
- Jeder Scan läuft in einem eigenen, danach gelöschten Temp-Ordner. Nichts wird dauerhaft gespeichert.
Rechtliches für den öffentlichen Betrieb
Ein öffentlich erreichbares Angebot in Deutschland braucht ein Impressum
(§ 5 DDG) und eine Datenschutzerklärung. Falls du dieses Tool wie deine
anderen Werkzeuge über software.obraasch.de einbindest, kannst du die dort
vorhandenen Vorlagen (impressum.html, datenschutz.html aus dem
Software-Uebersicht-Repo)
weiterverwenden und um einen Hinweis ergänzen, dass bei aktivierter
LLM-Analyse Nutzereingaben an einen externen Anbieter (OpenRouter bzw. das
dort gewählte Modell) übertragen werden. Die WebUI selbst weist Nutzer direkt
im Formular darauf hin.
Diese Angaben sind nach bestem Wissen erstellt, ersetzen aber keine Rechtsberatung.
Lizenz
Dieser Web-Wrapper (Dockerfile, app.py, requirements.txt,
docker-compose.yml, diese README) steht unter der MIT-Lizenz, siehe
LICENSE.
Er installiert beim Bauen des Images das externe Paket SkillSpector
(NVIDIA, Apache License 2.0) – siehe THIRD_PARTY_NOTICES.md.
SkillSpector selbst ist nicht Teil dieses Repositories und bleibt vollständig
unter der Lizenz des Originalprojekts.
Haftungsausschluss
Diese Software wird "wie sie ist" bereitgestellt, ohne jegliche Garantie. Ein niedriger Risk Score ist keine Sicherheitsgarantie – SkillSpector ist ein Hilfsmittel zur Risikoeinschätzung, keine vollständige Sicherheitsprüfung. Für gescannte Inhalte, die von Nutzern eingereicht werden, wird keine Verantwortung übernommen.