sec-fix
Erzeugt NUR auf ausdrücklichen Wunsch einen minimalen Sicherheitspatch für einen bestätigten Fund (Status validated oder triaged) - in einer Scratch-Kopie oder einem Worktree, nie im Original, als pat
Files7
View on GitHubSKILL.mdskills/dev/sec-fix/SKILL.md
GitHub<img src="banner.png" width="100%" alt="sec-fix banner">
sec-fix - minimaler Sicherheitspatch
Phase "fix" der ellmos-Security-Familie. Vertrag: sec-scan/references/contract.md (Verzeichnis §1, Lebenszyklus §2, Regeln §6). Hier nur die Anwendung.
Wann (und wann nicht)
- Nur auf ausdrücklichen Wunsch. Ein Scan oder eine Validierung löst nie automatisch einen Fix aus.
- Nur Funde mit Status
validatedodertriaged.candidatezuerst durchsec-validate;rejectedbleibt liegen. - Normaler Bug ohne Sicherheitsbezug:
bugfix-protocol. Ob ein vorhandener Patch taugt:sec-verify-fix. Strukturelle Ursache hinter mehreren Funden:sec-hardening.
Ablauf
- Fund und Umfang lesen:
findings.json(Fund,evidence,recommendation), betroffene Datei und die Aufrufer der Stelle. Die Ursache beheben, nicht das Symptom an einer Aufrufstelle; gibt es mehrere Aufrufer derselben unsicheren Funktion, den gemeinsamen Punkt patchen. - Lock prüfen (Vertrag §6 Regel 2):
lock_scan.py --check-dir <repo> --json; Exit 0 = frei, 1 = gesperrt, alles andere = unbekannt = stoppen; ohnelock_scan.pyauf dem Host stattdessenLOCK*.txtim Repo und in den Elternordnern suchen (keine = frei, sonst stoppen).LOCK.user.*nie anfassen. - Arbeitskopie: Scratch-Kopie oder
git worktreein einem Ordner außerhalb des Originals. Im Original wird nichts geschrieben. - Basis messen: Tests des Projekts einmal vor dem Patch laufen lassen und das Ergebnis festhalten (grün/rot, Anzahl). Gibt es keine Tests: sagen, nicht erfinden.
- Minimal patchen: kleinste Änderung, die den Source-to-Sink-Pfad schließt (Validierung, Parametrisierung, Allowlist, Escaping an der richtigen Stelle). Kein Refactoring, keine Stilkorrekturen, keine neuen Abhängigkeiten ohne Not. Ein Regressionstest für den Fund gehört in den Patch, wenn das Projekt Tests hat.
- Nachmessen: Tests erneut laufen lassen; Vorher/Nachher ehrlich berichten, auch rote Tests und Tests, die nicht liefen.
- Patch ablegen:
git diffder Arbeitskopie nachpatches/<id>.diffim Scan-Verzeichnis; mitgit apply --checkgegen den Zielstand prüfen (verändert nichts). - Finding aktualisieren:
status: fixed,fix.patchFile: patches/<id>.diff; dannpython scripts/secfind.py validate findings.json coverage.json(Skript liegt insec-scan).
Grenzen
- Kein Anwenden, kein Commit, kein Push (Regel 3). Das braucht einen direkten Nutzerauftrag.
- Geheimnis-Funde: Der alte Wert steht zwangsläufig in den
--Zeilen des Diffs. Patch nur lokal im Scan-Verzeichnis, nie in Ticket, Chat oder Bericht; das Geheimnis zuerst beim Anbieter rotieren (Regel 4). Offen: ob ein maskierter Diff sinnvoll anwendbar wäre - nicht erfinden. - Der Autor des Patches prüft ihn nicht selbst:
sec-verify-fixmit anderem Prüfer (Regel 7). - Kostenwarnung bei Fixes für viele Funde auf einmal (Regel 5); seriell abarbeiten.
Changelog
0.1.0 (2026-10-31)
- Erstfassung.