sec-triage
Überführt vorhandene Funde (Scanner-Berichte, SARIF, GitHub Code Scanning, Dependabot, Tickets) in das findings.json-Format der ellmos-Security-Familie, entdoppelt sie per id, legt Severity und Priori
SKILL.mdskills/dev/sec-triage/SKILL.md
GitHub<img src="banner.png" width="100%" alt="sec-triage banner">
sec-triage
Phase 4 der ellmos-Security-Familie. Vertrag: sec-scan/references/contract.md (Dateien 1, Lebenszyklus 2, Severity 3, id 4, Regeln 6). Validator: sec-scan/scripts/secfind.py. Nur statische Evidenz: keine Neuentdeckung (sec-scan), keine Laufzeitvalidierung (sec-validate).
Eingang
Vorhandene Funde: SARIF-Dateien oder Berichte von Scannern, GitHub Code Scanning und Dependabot (Export per gh oder aus der Weboberfläche, Egress beachten), Tickets, Audit-Listen. Liegt schon ein findings.json vor, wird es fortgeschrieben, sonst neu angelegt (Scan-Verzeichnis nach Vertrag 1). Preflight wie sec-scan Schritt 2 (Eigentum, Lock-Prüfung fail-closed).
Ablauf
- Abbilden: je Quellfund ein Eintrag.
ruleauf dotted lowercase normalisieren (py.sql-injection; die Original-Regelkennung indescriptionmit Quelle),cweaus den Tags der Quelle,locationaus dem Alert,severityzunächst wie die Quelle sie angibt,status: candidate. - Evidenz sichern: Code-Ausschnitt aus dem Alert, sonst die Stelle in der angegebenen Datei lesen und zitieren. Lässt sich keine Evidenz belegen (Datei fehlt, Zeile verschoben, Alert ohne Code), den Fund nicht mit erfundener Evidenz aufnehmen, sondern in
coverage.limitsals nicht importiert mit Grund listen. Geheimniswerte maskieren (Vertrag 4). Für Abhängigkeits-Alerts:rulez. B.dep.vulnerable-dependency,location= Manifest-/Lockfile-Zeile,evidence= diese Zeile; Advisory-ID und betroffene Version indescription. - Entdoppeln:
idperpython sec-scan/scripts/secfind.py id RULE PATH -bilden. Gleicheid(auch aus mehreren Quellen) werden zu einem Fund zusammengeführt, die Quellen indescriptionaufgelistet; bei abweichender Severity die höhere übernehmen und das vermerken. - Richtlinie lesen:
SECURITY.md(Severity-Definitionen, Fristen, unterstützte Versionen, Meldeweg) und ggf. Projekt-Entscheidungen. Fehlt sie, gilt Vertrag 3 und das wird im Ergebnis genannt. - Severity und Priorität festlegen: Severity gegen die Richtlinie prüfen und begründet anpassen; Priorität aus Severity, Exposition und Fristen ableiten und in
priorityeintragen (P0-P4, P0 am dringendsten; Stufen der Richtlinie darauf abbilden), die Begründung indescription. - Status:
triagedverlangt laut ValidatorvalidatedBy.verdict == confirmed. Bereits validierte Funde (validated) werdentriaged. Importierte, noch nicht validierte Funde bleibencandidatemit gesetzter Severity/Priorität und gehen ansec-validate. Ausschluss nur, wenn die Richtlinie ihn ausdrücklich deckt (z. B. nicht unterstützte Version):rejectedmitrejectedReason. - Tickets: nur wenn der Nutzer oder die Richtlinie es verlangt:
ticket_writer.py(nie Ids von Hand) oder GitHub Issue/Draft-Advisory; Schwachstellen in öffentlichen Repos als privater Advisory-Entwurf, nicht als öffentliches Issue. Referenz inticketeintragen. Keine Geheimniswerte in Tickets (Vertrag 6.4). - Coverage: ein reiner Import scannt nichts.
scanned: [],notScannedmit Eintrag "Import ohne eigenen Scan, Repo nicht gelesen" (damitcomplete: false),limitsmit Quellen, Importstand und nicht importierten Funden.provider.name= Quelle (z. B.github-code-scanning),model=n/a,engine= Quellwerkzeug. - Prüfen:
python sec-scan/scripts/secfind.py validate findings.json coverage.json, Exitcode zeigen. Dannsec-validatefür Kandidaten,sec-reportfür den Bericht.
Changelog
0.1.0 (2026-10-31)
- Erstfassung: Import, Entdoppelung per id, Richtlinien-Triage.