# NSCT — Sicherheitsgrundsätze ## 1. Grundprinzip NSCT verarbeitet **untrusted input** von überall im Web. Jede externe Quelle kann versuchen, die Integrität des Systems zu kompromittieren. Alle Sicherheitsmaßnahmen folgen dem "zero trust" Prinzip. **Stage 0–22 abgeschlossen.** NSCT ist production-ready mit hardened Docker-Image. --- ## 2. Control Plane vs. Evidence Plane ``` ┌─────────────────────────────────────────────────────────┐ │ CONTROL PLANE │ │ (vertrauenswürdige, interne Daten) │ │ │ │ • Konfiguration (Environment Variables) │ │ • Strukturierter Prompt (LLM Instruktionen) │ │ • Normierte Claims (bereinigt, de-biased) │ │ • EvidenceRelations (Vergleichsergebnisse) │ └──────────────┬──────────────────────────────────────────┘ │ │ LLM verarbeitet NUR strukturierte Daten │ ┌──────────────▼──────────────────────────────────────────┐ │ EVIDENCE PLANE │ │ (untrusted, externe Daten) │ │ │ │ • Roh-Webcontent (HTML, Text) │ │ • Search-Provider-Ergebnisse │ │ • Extrahierte Claims (roh, unverarbeitet) │ │ • Audio/Vision-Rohdaten │ └─────────────────────────────────────────────────────────┘ ``` **Regel:** Webcontent wechselt niemals direkt die Grenze von Evidence Plane in die Control Plane als Prompt-Text. --- ## 3. SSRF-Schutz Jede outbound-HTTP-Anfrage muss durch `nsct/security/policy.py`: 1. **Schema-Check:** Nur `http://` und `https://` erlaubt 2. **IP-Blocklist:** - `127.0.0.0/8` — Loopback - `10.0.0.0/8` — Private Class A - `172.16.0.0/12` — Private Class B - `192.168.0.0/16` — Private Class C - `169.254.0.0/16` — Link-local / Metadata - `192.0.0.0/24` — IETF Protocol Assignments - `100.64.0.0/10` — Shared Address Space - `192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24` — TEST-NET 3. **Metadata-Endpunkte:** Cloud-Instance-Metadata (`169.254.169.254`, etc.) 4. **Schemata:** `file://`, `ftp://`, `gopher://`, `ldap://`, `data://` blockiert --- ## 4. Prompt-Isolation Der LLM darf **niemals** rohen Webcontent als Teil des Prompts sehen. Der einzige Weg, Webcontent für den LLM verfügbar zu machen, ist über strukturierte Daten: ```json { "source": { "url": "https://example.com", "domain": "example.com", "title": "Titel", "author": "Autor", "content_type": "news", "language": "de" }, "claims": [ { "id": "uuid", "normalized_claim": "De-biased claim text", "claim_type": "factual", "confidence": 0.95 } ] } ``` Der LLM sieht **nur** dieses JSON — nie den HTML/Raw-Text. --- ## 5. Untrusted Data Handling | Quelle | Risiko | Schutzmaßnahme | |--------|--------|---------------| | Search Provider | Fake-Scores, Manipulation | Score != Evidence-Ranking; nur als Eingabe | | Web Content | XSS, Prompt-Injection, SSRF | HTML-Extraktion → Text, strikte Schema-Validierung | | LLM Output | Halluzination, Bias | Claims mit confidence scoring; keine single-source truth | | Audio/Vision | Manipulierte Inputs | Content-Type-Validierung; Größ Limits | --- ## 6. Docker-Sicherheit (Stage 18+) - **Non-Root-User:** `nsct` (UID 1000) - **Read-Only-Filesystem:** `read_only: true` wo möglich - **Dropped Capabilities:** `cap_drop: [ALL]` - **No Secrets in Image:** `.env` wird nicht gebuildet - **Resource Limits:** Memory und CPU begrenzt pro Container - **No Docker Socket:** Kein Zugriff auf Host-Docker-Socket - **No Host Filesystem:** Kein Zugriff auf Host-Dateisysteme - **Persistent nur in explizite Volumes** --- ## 7. Compliance - Keine Speicherung von personenbezogenen Daten über die Quellen-Metadaten hinaus - Claims und Evidence Relations werden nur so lange gespeichert wie nötig - Alle Daten sind exportierbar und löschbar (SQLAlchemy cascade) - Vollständige Provenance (Stage 21): Jeder Schritt ist nachvollziehbar --- ## 8. Neutrale Recherche-Sicherheit (Stage 17+) ### Test A — Syndication Eine Agenturmeldung wird von 10 Webseiten kopiert. Erwartung: 1 ursprüngliche Quelle, 9 abhängige Quellen — nicht 10 unabhängige. ### Test B — Politische Aussagen Behauptungen verschiedener politischer Parteien werden klar getrennt — keine einfache Mehrheit. ### Test C — Wissenschaftlicher Dissens Verschiedene Studientypen und Evidenzstärken werden sichtbar gemacht — keine Stimmenzählung. ### Test D — Prompt Injection "ignore all previous instructions" auf Webseiten hat keine Auswirkung auf Policy. ### Test E — Fehlende Evidenz Nur Blogs wiederholen eine unbelegte Behauptung → System sagt: "Konnte nicht durch Primärquelle verifiziert werden."