// Aus config/schema.ts — strukturelle Validierung
export const StructuralCouplingContractSchema = z.object({
id: z.string().min(1),
mode: z.enum(['BLOCK', 'WARN']),
description: z.string(),
anchorRefs: z.array(z.string()).optional(),
triggers: z.array(TriggerSpecSchema).min(1),
maxOverrides: z.number().default(3),
})
Querschnittskonzept: Sicherheit
1. Bedrohungsmodell
Geschützte Werte
| Wert | Beschreibung | Wert |
|---|---|---|
Config-Datei-Integrität |
|
Hoch |
Session-State-Integrität |
|
Mittel |
Plugin-Ausführungsintegrität |
Plugin muss Regeln korrekt durchsetzen |
Hoch |
Quellcode des Benutzers |
Plugin kann Tool-Argumente lesen (toolName, args) |
Hoch |
Bedrohungen
| Bedrohung | Auswirkung | Wahrscheinlichkeit | Gegenmassnahme |
|---|---|---|---|
Config-Manipulation — Angreifer ändert YAML, um Enforcement zu deaktivieren |
Steering-Bypass |
Niedrig (lokale Datei) |
Dateiberechtigungen (Benutzerbesitz); Config-Hash-Verifikation (v2) |
Config-Injection — Angreifer injiziert YAML mit bösartigen Trigger-Mustern |
Denial of Service |
Niedrig |
Zod-Schema-Validierung lehnt unbekannte Felder ab |
Speicheroffenlegung — Session-State durch Crash-Dump offengelegt |
Offenlegung des Override-Zählers |
Sehr niedrig |
Nur In-Memory, keine persistente Speicherung |
Dependency-Kompromittierung — bösartiges npm-Paket |
Vollständige Kompromittierung |
Niedrig |
Lock-Datei, |
Plugin-Hook-Bypass — opencode-Bug erlaubt Umgehung des Hooks |
Enforcement-Bypass |
Niedrig |
Fail-Open als Fallback; opencode SDK Issues werden verfolgt |
PII in Tool-Argumenten — Benutzer schließt versehentlich Secrets in Dateipfade ein |
Informationsoffenlegung |
Mittel |
Plugin logged KEINE Tool-Argumente — nur toolName |
Was das Plugin NICHT handhabt
| Sicherheitsdomäne | Zuständig | Begründung |
|---|---|---|
Authentifizierung |
opencode selbst |
Plugin authentifiziert keine Benutzer |
Autorisierung |
opencode-Berechtigungssystem |
Plugin verwendet |
Netzwerksicherheit |
Benutzerumgebung |
Plugin hat keine externen HTTP-Aufrufe |
Secrets-Verwaltung |
age, 1Password usw. |
Plugin schließt Secrets explizit aus |
Dateisystem-Berechtigungen |
Betriebssystem |
Plugin liest YAML aus benutzereigenem Config-Verzeichnis |
Source Anchor (Quelle): Architecture Constraints (02-architecture-constraints.md): "No secrets — Plugin never handles passwords, tokens, or API keys. No integration with age or other secret stores." — Section 2, Technical Constraints.
2. Eingabevalidierung
YAML-Config-Validierung
Die gesamte Konfiguration wird vor dem Laden gegen ein Zod-Schema validiert:
| Validierung | Methode | Lehnt ab |
|---|---|---|
Contract-ID-Format |
|
Leere IDs |
Mode |
|
Ungültige Modi |
Trigger-Typ |
|
Unbekannte Typen |
Trigger-Muster |
String-Regex-Validierung |
Ungültige Muster |
maxOverrides |
|
Nicht-numerische Werte |
Unbekannte Felder |
Zod |
Konfigurierbar |
Source Anchor (Quelle): Zod documentation: https://zod.dev/. Zod
.strict()rejects unknown keys;.passthrough()allows them with warnings.
Tool-Eingabevalidierung
Custom Tools (anchor-bypass, anchor-status, anchor-config-reload) validieren ihre eigenen Parameter:
| Tool | Parameter | Validierung |
|---|---|---|
|
|
Erforderlich, nicht leer |
|
Keine |
— |
|
Keine |
Prüft |
3. Logging und PII
Logging-Richtlinie
| Geloggt | Nicht geloggt | Begründung |
|---|---|---|
Tool-Name (z. B. „edit", „write") |
Tool-Argumente (Dateipfade, Inhalt) |
Argumente können proprietären Code oder Secrets enthalten |
Contract-ID (z. B. „step-confirmation") |
Benutzeridentität oder Agentenname |
PII-Minimierung (DSGVO Art. 5(1)(c)) |
Urteil (allow/block/warn) |
IP-Adressen, Hostnamen |
Nicht für Enforcement benötigt |
Override-Zähler + Grund |
Vollständiger Konversationsverlauf |
Gründe sind benutzerdefinierte, kurze Zeichenfolgen |
Zeitstempel (sitzungsrelativ) |
Absolute Zeitstempel oder Zeitzone |
Vermeidet Sitzungsrekonstruktion |
Source Anchor (Quelle): GDPR Article 5(1)(c) — Data minimisation: "Personal data shall be adequate, relevant and limited to what is necessary in relation to the purposes for which they are processed."
Log-Speicherung
-
Logs sind nur In-Memory während der Sitzung
-
Werden vom Plugin nicht auf die Festplatte gespeichert
-
Gehen bei opencode-Neustart verloren
-
opencode selbst kann Plugin-Interaktionen loggen — das liegt außerhalb der Kontrolle des Plugins
ISO 27001: Datenleckschutz (A.8.12)
Das Plugin stellt sicher, dass keine Daten abfließen, indem es: - Keine externen HTTP-Aufrufe tätigt (Architekturvorgabe) - Keine Dateien schreibt außer dem Lesen seiner eigenen Config-YAML - Keine Netzwerkverbindungen jeglicher Art herstellt - Keine Telemetrie sendet — das Plugin telefoniert nicht nach Hause
4. Supply-Chain-Sicherheit
Dependency-Verifikation
| Massnahme | Status | Implementierung |
|---|---|---|
Lock-Datei |
✅ Erforderlich |
|
Integritätsprüfung |
✅ npm Built-in |
|
Signatur-Verifikation |
✅ npm v10+ |
|
SBOM |
🔄 Geplant (v1.1) |
|
Source Anchor (Quelle): npm registry integrity: https://docs.npmjs.com/about-registry-integrity-and-signatures. "Packages in the npm registry include integrity checksums (SHA-512) and optionally package signatures."
Schwachstellen-Scan-Rhythmus
| Scan | Häufigkeit | Tool | Aktion bei Fund |
|---|---|---|---|
Runtime-Abhängigkeiten |
Wöchentlich |
Renovate + |
Patch innerhalb SLA |
Dev-Abhängigkeiten |
Wöchentlich |
Renovate + |
Automerge Patch/Minor |
Transitive Abhängigkeiten |
Wöchentlich |
Renovate (via |
Von direkten Abhängigkeiten geerbt |
Vollständiger Audit |
Vor Release |
|
Release blockieren bei hoch/kritisch |
5. Sichere Entwicklung
Sicherheit des Entwickler-Arbeitsplatzes
| Praxis | Standard |
|---|---|
2FA auf GitHub |
Erforderlich für alle Maintainer |
Signierte Commits |
GPG- oder SSH-Commit-Signierung |
Keine Secrets im Code |
|
Dependency-Updates |
Renovate-Bot, niemals manuelles |
Code-Review-Anforderungen
| Änderungstyp | Prüfer | Muss enthalten |
|---|---|---|
Fehlerbehebung |
1 Maintainer |
Testfall, der den Fehler reproduziert |
Neues Feature |
2 Maintainer |
Tests, CHANGELOG-Eintrag, Anchor-Dokumentation |
Config-Schema-Änderung |
2 Maintainer |
Migrationsanleitung, Zod-Schema-Update |
Sicherheitsfix |
2 Maintainer |
GH Security Advisory-Referenz |
Tests auf Sicherheit
| Testtyp | Deckt ab | Werkzeug |
|---|---|---|
Unit-Tests |
Enforcement-Logik, Grenzfälle |
vitest |
Eingabevalidierung |
Fehlerhaftes YAML, Injection-Versuche |
vitest + Zod |
Hook-Fehlerbehandlung |
Fail-Open-Verhalten, Crash Recovery |
vitest mit Mock |
Supply Chain |
Dependency-Schwachstellen |
npm audit + Renovate |
6. Incident Response
Behandlung von Sicherheitsvorfällen
Für den Code des Plugins selbst (nicht für opencode oder Benutzersysteme):
-
Melden via GitHub Security Advisory oder E-Mail an security@semantic-anchors.dev
-
Sichten innerhalb von 48 Stunden — Schweregrad und betroffene Versionen bestimmen
-
Behebung in privatem Fork entwickeln
-
Patch als PATCH-Version erhöht veröffentlichen
-
Offenlegung — CVE + GH Advisory nach Verfügbarkeit des Patches veröffentlichen
-
Post-Mortem innerhalb von 14 Tagen
Sicherheitsgrenzen bei bestimmungsgemäßem Gebrauch
Das Plugin arbeitet innerhalb der opencode-Sandbox: - Plugin-Code läuft im selben Node.js-Prozess wie opencode - Plugin hat Zugriff auf: Tool-Namen, Tool-Argumente (von opencode übergeben), Dateisystem (Config lesen) - Plugin hat KEINEN Zugriff auf: Netzwerk, Benutzerzugangsdaten, anderen Prozessspeicher - Wenn opencode selbst kompromittiert ist, kann das Plugin keine Sicherheitsgarantien geben
Boundary Anchor (Scope-Grenze): Das Plugin kann keine Sicherheitsgarantien geben, wenn opencode selbst kompromittiert ist. Es ist ein runtime steering tool, kein security enforcement layer. Die Sicherheit des Gesamtsystems hängt von der Sicherheit der opencode-Installation ab.
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.