Public Security Audit Report — mcp-papierkram (DRAFT)

Status: INTERNAL DRAFT — nicht public-tauglich.

Erster Pilot-Audit unter intern/projekte/public-mcp-audits/. Geschrieben in dem Format, das spaeter (nach Pattern-Phase) als Public-Report publik gemacht wird. Vollform inkl. Code-Snippets + Repro-Schritte folgt in der Public-Version.

Summary

mcp-papierkram ist ein Python/FastMCP-basierter MCP-Server fuer die Papierkram.de-Buchhaltungs-API. Audit-Lauf am 2026-05-18 im Daily-Modus (Konfidenz-Gate 8/10) hat keine kritischen oder High-Severity-Findings ergeben. Drei Medium-Findings betreffen Supply-Chain-Hygiene und Default-Konfiguration. Alle drei sind in 1-2 Stunden behebbar.

SeverityCount
Critical0
High0
Medium3
Low0

Scope

  • Target: agentic-ventures/mcps (Mono-Repo), Path mcp-papierkram/
  • Commit: 0ce2d60 auf branch feat/360dialog-provider
  • Stack: Python 3.11, FastMCP, httpx 0.28.1, pydantic 2.13.4
  • Surface: 96 MCP-Tools (62 Write, 34 Read), kein eigener HTTP-Server-Code (FastMCP-default), kein Custom-Frontend, keine eigene Persistenz
  • Modus: Daily 8/10 (schnell) — vor jedem Public-Audit folgt ein Voll-Audit im tief-Modus

Methodik

13-Phasen-Audit nach internem security-audit-Skill (adaptiert von gstack/cso). Code-Trace bei jedem Finding, keine Live-Calls gegen Papierkram-API.

Findings

MED-1: uv.lock fehlt + Dependencies range-pinned

Supply-Chain-Hygiene-Gap. pyproject.toml definiert nur untere Schranken (mcp>=1.2.0, httpx>=0.27.0, pydantic>=2.0), und kein uv.lock ist im Repo getrackt. Bei jedem fresh-install kann sich die transitive Versions-Topologie aendern, ein kompromittiertes Mid-Stream-Release einer Dependency wuerde transparent eingezogen.

Auswirkung: Supply-Chain-Vulnerability ohne Audit-Trail. Real-World-Pendant: torchtriton-Vorfall 2022.

Fix: uv lock, git add uv.lock, im hosted Docker-Build uv sync --frozen.

MED-2: Raw-Escape-Hatch-Tools default aktiviert

Vier generische Raw-Tools (raw_get, raw_post, raw_put, raw_delete) werden default registriert (PAPIERKRAM_EXPOSE_RAW=true). Sie geben Schreib-Zugriff auf jeden Papierkram-API-Pfad, ohne dass das Tool-Schema einschraenkt.

mcp-vf-hosted (der hosted Wrapper) setzt den Flag explizit auf false — Defense-in-Depth ist da. Aber wer den MCP eigenstaendig ohne den Wrapper deployed, hat die Raw-Tools live. Default-sicher waere false.

Auswirkung: Tool-Surface ist breiter als noetig im Standalone-Deploy. Bei Prompt-Injection erleichtert Raw-Surface Eskalation gegenueber dedizierten Tools (z.B. fingierter API-Pfad).

Fix: Default-Wert flippen. Local-Debug-User setzen den Flag explizit.

MED-3: HTTP-Bind ohne Auth-Sanity-Check

MCP_HTTP_HOST kann von Env auf 0.0.0.0 gesetzt werden, ohne dass FastMCP eine eigene Auth-Schicht erzwingt. Wer den Port versehentlich public exposed (ECS-Service ohne Sidecar, VM ohne UFW), gibt 96 Tools einschliesslich ~62 Write-Tools auf den eigenen Papierkram-Account frei.

Auswirkung: Misconfiguration-Risiko bei Self-Hosting. Kein Bug am MCP selbst, aber kein Safety-Net.

Fix: Warn-Log + (optional) Hard-Refusal bei Non-Localhost-Bind ohne konfigurierten Auth-Provider.

Was nicht gefunden wurde

  • Keine Secrets in Source-Tree oder Git-History.
  • Keine Command-Injection / SQL-Injection / Eval-Patterns.
  • Keine TLS-Verify-Bypasses.
  • Keine unsanitized LLM-Output-Routes (kein HTML-Sink im MCP).
  • Keine Prompt-Injection-Vektoren in Tool-Beschreibungen (statische Docstrings).
  • Keine schweren CVEs in den eingezogenen Direct-Deps (Stand 2026-05-18).

Was nicht in Scope war

  • Live-API-Tests gegen Papierkram (Audit-Skill-Regel: NIE).
  • Cloud-Hosting-Layer (mcp-vf-hosted CDK + Fargate Setup) — separates Audit.
  • Multi-Tenant-Isolation (mcp-papierkram ist Single-Tenant per Design).
  • Performance / Cost.

Empfehlungen

  1. F1-F3 im naechsten Wartungsfenster (~1.5h Aufwand) beheben.
  2. Vor einem Public-Audit-Release ein tief-Modus-Lauf, der auch die TENTATIVE-Findings (data: dict ohne strict Schema, PDF-Size-Cap) bewertet.
  3. Audit quarterly wiederholen.

Anhaenge


Internal note (loescht sich bevor public): Diese Datei ist Draft. Vor jeglichem public-Push:

  1. F1-F3 fixen oder Embargo-Hinweis ergaenzen (Phase 2 Pattern-File legt fest, wie).
  2. Repo-URL des Targets entscheiden (private mono-repo bleibt private — Public-Auditreport referenziert moeglicherweise nur Commit-SHA + tool-Liste, nicht Source-Path).
  3. Report-Template-Format finalisieren (Trail-of-Bits-Style? Cure53? Eigenes?).