Nach dem Audit Security-Audit

Nach dem Audit: Findings priorisieren und tatsächlich fixen

Carola Schulte
Carola Schulte 1. November 2025 19 min Lesezeit

Der Pentest-Report liegt auf dem Tisch. 47 Findings, davon 3 Critical, 12 High, 18 Medium, 14 Low. Die Security-Verantwortlichen (CISO oder vergleichbare Rolle) wollen einen Remediation-Plan bis Freitag. Das Dev-Team stöhnt. Und in drei Monaten findet der Re-Test dieselben Probleme. Warum passiert das – und wie verhindern Sie es?

Ein Audit ist kein Erfolg, wenn der Report fertig ist. Ein Audit ist ein Erfolg, wenn die Findings gefixt sind.

Dieser Artikel im Kontext: Im Juni-Artikel ging es um die Vorbereitung auf ein Audit. Hier geht es um das, was danach kommt – und wo die meisten Organisationen scheitern.

Warum Findings versanden

Ich habe Organisationen gesehen, die denselben Pentest-Report drei Jahre in Folge bekommen haben. Nicht weil sie inkompetent waren, sondern weil der Prozess nach dem Audit nicht funktioniert hat.

Die typischen Gründe:

  • Keine klare Ownership: „Das ist ein Security-Thema" – aber Security kann keine Code-Changes machen
  • Unrealistische Deadlines: „Alle Criticals in 2 Wochen" – bei einem Team, das im Sprint ist
  • CVSS-Blindheit: Alles nach Score priorisieren, ohne Business-Kontext
  • Kein Tracking: Findings verschwinden in Jira-Backlogs und werden nie wieder gesehen
  • Fehlende Eskalation: Wenn nichts passiert, passiert auch nichts
Reality-Check: Ein Finding ohne Owner, Deadline und Tracking ist kein Finding – es ist eine Notiz, die niemand lesen wird.

Der erste Tag nach dem Report

Sie haben den Report bekommen. Was jetzt?

Schritt 1: Findings verstehen, nicht nur zählen

Bevor Sie priorisieren, müssen Sie verstehen. Lesen Sie jeden Finding. Nicht die Executive Summary – die einzelnen Findings.

Für jedes Finding klären:

  • Was genau ist das Problem? (Nicht „SQL Injection", sondern „SQL Injection im Login-Formular über den username-Parameter")
  • Ist der Finding reproduzierbar? (Manchmal sind Pentest-Findings False Positives)
  • Welches System/welcher Code ist betroffen?
  • Gibt es bereits einen Fix in der Pipeline? (Manchmal wurde das Problem schon gefunden)
Praxis-Tipp: Planen Sie für die erste Durchsicht 15-30 Minuten pro Finding ein. Bei 50 Findings ist das ein voller Tag – aber ein Tag, der sich lohnt.

Schritt 2: Findings-Review mit dem Team

Holen Sie die relevanten Entwickler dazu. Nicht als Anklage („Ihr habt das verbockt"), sondern als Arbeitssitzung:

  • Stimmt der Finding? Verstehen wir, was der Auditor meint?
  • Wie aufwändig ist der Fix? (T-Shirt-Sizing: S/M/L/XL)
  • Gibt es Abhängigkeiten? (Muss erst X gefixt werden, bevor Y möglich ist?)
  • Wer kennt den Code am besten?

Das Ziel: Jeder Finding hat nach diesem Meeting einen vorläufigen Owner und eine Aufwandsschätzung.

Priorisierung: CVSS ist nicht genug

Der Auditor hat jedem Finding einen CVSS-Score gegeben. Critical, High, Medium, Low. Das ist ein Ausgangspunkt – aber kein Priorisierungsschema.

Warum CVSS allein nicht funktioniert

CVSS (Common Vulnerability Scoring System) bewertet die technische Schwere einer Schwachstelle. Was CVSS nicht berücksichtigt:

  • Business-Kontext: Eine SQL Injection im Admin-Panel (hinter VPN, 3 Benutzer) ist anders als eine im öffentlichen Login
  • Ausnutzbarkeit in Ihrer Umgebung: Gibt es kompensierende Kontrollen?
  • Daten-Sensitivität: Was kann ein Angreifer mit Zugriff erreichen?
  • Reputationsrisiko: Manche Schwachstellen sind PR-Desaster, andere nicht
Der klassische Fehler: „Wir fixen erst alle Criticals, dann alle Highs." Das klingt logisch, ignoriert aber, dass ein Medium-Finding in Ihrem Payment-System kritischer sein kann als ein Critical in einem internen Tool.

Ein pragmatisches Priorisierungsmodell

Kombinieren Sie CVSS mit Business-Kontext. Beispielhafte Gewichtung – anpassbar je nach Organisation und Risikoappetit:

Faktor Fragen Gewichtung
CVSS-Score Wie schwer ist die Schwachstelle technisch? 30%
Erreichbarkeit Internet-exponiert? Authentifizierung nötig? Hinter VPN? 25%
Daten-Impact PII? Zahlungsdaten? Geschäftsgeheimnisse? Öffentliche Daten? 25%
Fix-Aufwand Quick Win oder mehrwöchiges Refactoring? 10%
Exploit-Verfügbarkeit Gibt es öffentliche Exploits? Wird aktiv ausgenutzt? 10%

Priorisierungs-Matrix in der Praxis

# Beispiel: Finding-Priorisierung

FINDING: SQL Injection im Login-Formular
CVSS: 9.8 (Critical)
Erreichbarkeit: Internet-exponiert, keine Auth nötig
Daten-Impact: Zugriff auf User-Datenbank (PII, Passwort-Hashes)
Fix-Aufwand: S (Prepared Statements einführen)
Exploit: Trivial, Standard-Tools

→ PRIORITÄT: P0 (Sofort)

---

FINDING: XXE in XML-Import (Admin-Bereich)
CVSS: 9.1 (Critical)
Erreichbarkeit: Nur für Admins (5 Personen), hinter VPN
Daten-Impact: Potentiell Server-Dateien lesbar
Fix-Aufwand: S (XML-Parser konfigurieren)
Exploit: Benötigt Admin-Zugang

→ PRIORITÄT: P1 (Diese Woche)

---

FINDING: Reflected XSS in Suchergebnissen
CVSS: 6.1 (Medium)
Erreichbarkeit: Internet-exponiert
Daten-Impact: Session Hijacking möglich (User-Sessions)
Fix-Aufwand: S (Output Encoding)
Exploit: Einfach, aber Social Engineering nötig

→ PRIORITÄT: P1 (Diese Woche)

---

FINDING: Missing Security Headers
CVSS: 5.3 (Medium)
Erreichbarkeit: Alle Seiten
Daten-Impact: Indirekt (Clickjacking, MIME-Sniffing)
Fix-Aufwand: XS (Webserver-Config)
Exploit: Theoretisch, praktisch selten

→ PRIORITÄT: P2 (Diesen Monat)
Quick Wins first: Wenn ein Finding 10 Minuten Fix-Zeit hat, machen Sie es sofort – unabhängig vom Score. Security Headers, fehlende Rate Limiting, Debug-Endpoints. Das reduziert die Finding-Anzahl und zeigt Progress.

Remediation-Tracking: Das System

Priorisierung ist nutzlos ohne Tracking. Sie brauchen ein System, das:

  • Jeden Finding einem Owner zuordnet
  • Deadlines trackt
  • Status-Updates erzwingt
  • Eskalation ermöglicht

Option 1: Dediziertes Vulnerability-Management-Tool

Tools wie DefectDojo, Nucleus, Vulcan oder ThreadFix sind dafür gebaut. Vorteile:

  • Import von Audit-Reports (oft automatisch)
  • Deduplizierung (dasselbe Problem in mehreren Scans)
  • Trend-Tracking über Zeit
  • Integration mit CI/CD

Nachteil: Ein weiteres Tool. Wenn Ihr Team Jira lebt und atmet, wird ein separates Tool ignoriert.

Option 2: Jira/Linear mit Struktur

Wenn Sie Jira nutzen, können Sie Findings dort tracken – aber mit Disziplin:

# Jira-Ticket-Template für Security Findings

[SEC-XXX] SQL Injection in Login-Formular

## Finding
- **Quelle:** Pentest Report Q4/2025, Finding #17
- **CVSS:** 9.8 (Critical)
- **Priorität:** P0
- **Deadline:** 2025-11-08

## Beschreibung
[Exakte Beschreibung aus dem Report, ggf. mit Screenshot]

## Betroffene Komponente
- Repository: backend-auth
- Datei: src/auth/LoginController.java:142
- Endpoint: POST /api/v1/login

## Reproduktion
[Curl-Beispiel oder Burp-Request aus dem Report]

## Empfohlener Fix
[Aus dem Report oder eigene Einschätzung]

## Akzeptanzkriterien
- [ ] Fix implementiert
- [ ] Code Review durchgeführt
- [ ] Fix in Staging verifiziert
- [ ] Re-Test durch Security bestätigt

## Labels
security, pentest-2025-q4, priority-p0
Der Jira-Friedhof: Security-Tickets landen im Backlog und werden von Sprints verdrängt. Lösung: Separates Board nur für Security, mit eigenem WIP-Limit und direkter Management-Sichtbarkeit.

Governance-Regel: Security-Findings dürfen kein normales Backlog-Item sein – sie brauchen eigene Sichtbarkeit und WIP-Limits.

Status-Tracking

Definieren Sie klare Status:

Status Bedeutung Verantwortung
New Finding erfasst, noch nicht analysiert Security
Triaged Analysiert, priorisiert, Owner zugewiesen Security
In Progress Fix wird entwickelt Dev-Team
Ready for Retest Fix deployed, wartet auf Verifikation Dev-Team
Verified Re-Test bestätigt Fix Security/Auditor
Risk Accepted Bewusst akzeptiert (dokumentiert!) Management
False Positive Kein echtes Problem (dokumentiert warum) Security

Risk Acceptance: Wann Sie nicht fixen

Nicht jedes Finding muss sofort gefixt werden. Manchmal ist Risk Acceptance die richtige Entscheidung – aber nur wenn sie bewusst und dokumentiert ist.

Legitime Gründe für Risk Acceptance

  • System wird abgeschaltet: Das Legacy-System geht in 3 Monaten offline
  • Kompensierende Kontrollen: Andere Maßnahmen reduzieren das Risiko ausreichend
  • Unverhältnismäßiger Aufwand: Fix würde 6 Monate dauern, Risiko ist begrenzt
  • False Positive: Der Finding ist technisch korrekt, aber praktisch nicht ausnutzbar

Risk Acceptance dokumentieren

# Risk Acceptance Form

## Finding
XXE Vulnerability in Legacy XML Import (Finding #23)

## CVSS Score
9.1 (Critical)

## Risikobewertung nach Business-Kontext
- Nur für 5 Admin-Benutzer zugänglich
- Zugang erfordert VPN + MFA
- System wird am 31.01.2026 abgeschaltet
- Keine neuen Daten-Importe geplant

## Kompensierende Kontrollen
- Admin-Aktivitäten werden geloggt
- Admins wurden über Risiko informiert
- File Upload ist auf 1MB begrenzt

## Entscheidung
Risiko akzeptiert bis System-Abschaltung

## Verantwortlich
Name: [CISO/CTO Name]
Datum: 2025-11-05
Gültig bis: 2026-01-31

## Review
Automatischer Review am: 2026-01-15
Risk Acceptance ist keine Ausrede: Wenn Risk Acceptance zur Standardantwort wird, haben Sie kein Security-Problem – Sie haben ein Kultur-Problem. Risk Acceptance sollte die Ausnahme sein, nicht die Regel.

Pushback: Wenn der Finding falsch ist

Auditoren sind nicht unfehlbar. Manchmal ist ein Finding:

  • False Positive: Tool hat falsch erkannt
  • Missverstanden: Auditor hat Kontext nicht verstanden
  • Übertrieben: Severity zu hoch angesetzt
  • Bereits gefixt: Wurde zwischen Scan und Report behoben

Wie Sie pushbacken

Professionell, mit Evidenz:

## Finding #17: Outdated jQuery Version

### Auditor Statement
jQuery 3.4.1 is used, which has known vulnerabilities (CVE-2020-11022).
CVSS: 6.1 (Medium)

### Our Response
We acknowledge the finding. However, we believe the severity should
be reduced to Low (Informational) for the following reasons:

1. **CVE-2020-11022 requires specific conditions:**
   - Untrusted HTML must be passed to jQuery DOM manipulation methods
   - Our code review confirms we never pass user input to these methods
   - All user input is sanitized through DOMPurify before rendering

2. **Evidence:**
   - Code audit results: [Link to internal report]
   - Grep results showing no vulnerable patterns: [Attachment]

3. **Upgrade timeline:**
   - jQuery upgrade is planned for Q1/2026 as part of frontend refactoring
   - Earlier upgrade would require significant regression testing

### Requested Action
Re-classify as Low/Informational, with note that upgrade is planned.

### Supporting Documentation
- [Link to code review]
- [Link to DOMPurify configuration]
- [Link to roadmap showing jQuery upgrade]
Beziehung pflegen: Gute Auditoren schätzen fundierten Pushback. Es zeigt, dass Sie den Report ernst nehmen und Ihr System verstehen. Unprofessioneller Pushback („Das ist doch Quatsch") zerstört die Beziehung.

Deadlines: Realistisch planen

Die typische Management-Erwartung: „Alle Criticals in einer Woche." Die Realität: Das Team ist im Sprint, hat andere Deadlines, und der Fix ist komplexer als gedacht.

Realistische Timeframes

Priorität Typische Deadline Begründung
P0 24-72 Stunden Aktiv ausgenutzt oder trivial exploitbar, Internet-exponiert
P1 1-2 Wochen Critical/High mit hohem Business-Impact
P2 30 Tage High/Medium, begrenzte Ausnutzbarkeit
P3 90 Tage Medium/Low, Defense-in-Depth
P4 Next Release Low/Informational, Best Practice

Wenn Deadlines nicht halten

Deadlines werden gerissen. Das ist normal. Was nicht normal sein sollte:

  • Stille Deadline-Verletzungen ohne Kommunikation
  • Keine Eskalation bei Blockern
  • „Wir hatten keine Zeit" ohne vorherige Warnung

Etablieren Sie einen Eskalationspfad:

Deadline in Gefahr?
       ↓
Owner informiert Security (min. 3 Tage vorher)
       ↓
Gemeinsame Bewertung: Ist Verzögerung akzeptabel?
       ↓
  Ja → Neue Deadline + Begründung dokumentieren
  Nein → Eskalation an Management für Ressourcen/Priorisierung

Re-Test: Nicht vergessen

Ein Finding ist erst geschlossen, wenn der Fix verifiziert ist. Nicht wenn der Code gemerged wurde. Nicht wenn das Ticket auf „Done" steht.

Re-Test-Optionen

  • Auditor Re-Test: Der ursprüngliche Auditor prüft den Fix (oft im Audit-Vertrag enthalten)
  • Interner Re-Test: Ihr Security-Team verifiziert (schneller, aber weniger unabhängig)
  • Automatisierter Re-Test: CI/CD-Integration von Security-Scans (für bekannte Patterns)
Der häufige Fehler: „Der Entwickler sagt, es ist gefixt" ist kein Re-Test. Entwickler testen, ob ihr Code funktioniert – nicht ob er sicher ist. Re-Test muss unabhängig sein.

Re-Test dokumentieren

## Re-Test Report: Finding #17 (SQL Injection)

**Original Finding:** SQL Injection in Login-Formular
**Fix:** Prepared Statements implementiert (PR #4521)
**Re-Test Date:** 2025-11-12
**Tester:** [Name]

### Test Methodology
1. Original Payload aus Report getestet
2. Variationen mit SQLMap
3. Manual Testing mit Burp Suite

### Results
- Original Payload: ✅ Blocked
- SQLMap: ✅ No injection points found
- Manual Testing: ✅ Input properly sanitized

### Evidence
[Screenshots/Logs attached]

### Conclusion
Finding #17: VERIFIED FIXED

### Notes
- Error messages are now generic (no SQL errors exposed)
- Logging captures injection attempts

Continuous Improvement: Nicht nur fixen, lernen

Ein Audit sollte nicht nur Probleme aufdecken, sondern auch Muster. Nach dem Remediation-Zyklus:

Root Cause Analysis

Fragen Sie bei jedem Critical/High:

  • Wie ist das entstanden? (Zeitdruck? Wissenslücke? Fehlende Review-Prozesse?)
  • Warum wurde es nicht früher gefunden? (Fehlende Tests? Kein SAST? Code Review übersehen?)
  • Wie verhindern wir Wiederholung? (Training? Tooling? Prozessänderung?)

Muster erkennen

# Audit-Analyse Q4/2025

## Finding-Kategorien
- SQL Injection: 3 (alle im Legacy-Modul X)
- XSS: 7 (verteilt über Frontend)
- Missing Auth: 2 (API-Endpoints)
- Misconfig: 5 (Server-Hardening)

## Muster erkannt
1. Legacy-Modul X hat keine Input-Validierung → Refactoring nötig
2. Frontend-Team kennt Output-Encoding nicht → Training planen
3. Neue API-Endpoints vergessen Auth-Check → Code-Review-Checklist erweitern

## Maßnahmen
1. SAST-Rule für SQL Injection in CI/CD (verhindert neue Fälle)
2. Frontend-Security-Workshop buchen
3. API-Review-Template um Auth-Check erweitern
Trend-Tracking: Tracken Sie Findings über mehrere Audits. Weniger Findings im gleichen Bereich = Ihr Prozess funktioniert. Dieselben Findings = Sie behandeln Symptome, nicht Ursachen.

Kommunikation: Stakeholder mitnehmen

Security-Findings sind nicht nur ein Dev-Thema. Management will wissen: Wie schlimm ist es? Wird es besser?

Executive Summary Template

## Security Audit Remediation Status
Report: Pentest Q4/2025
Stand: 2025-11-15

### Übersicht
| Severity | Total | Fixed | In Progress | Open | Risk Accepted |
|----------|-------|-------|-------------|------|---------------|
| Critical | 3     | 2     | 1           | 0    | 0             |
| High     | 12    | 8     | 3           | 1    | 0             |
| Medium   | 18    | 10    | 5           | 2    | 1             |
| Low      | 14    | 5     | 2           | 4    | 3             |

### Critical/High Status Detail
1. SQL Injection (P0) - ✅ Fixed, verified 2025-11-10
2. XXE Vulnerability (P0) - ✅ Fixed, retest pending
3. Auth Bypass (P0) - 🔄 In Progress, ETA 2025-11-18
4. [weitere...]

### Blockers
- Finding #23 wartet auf Vendor-Patch (ETA unbekannt)
- Finding #31 benötigt Architektur-Entscheidung (Meeting 2025-11-20)

### Next Steps
- Re-Test für alle P0/P1 Findings: 2025-11-22
- Abschluss-Report: 2025-11-25

Kommunikationsrhythmus

  • Täglich: P0-Updates an CISO (wenn P0 offen)
  • Wöchentlich: Status-Update an Stakeholder
  • Nach Re-Test: Abschluss-Report mit Lessons Learned

Tooling: Was wirklich hilft

Vulnerability Management

  • DefectDojo (Open Source) – Finding-Aggregation, Deduplizierung, Tracking
  • Nucleus – Enterprise-Grade, gute Integrationen
  • Jira + Automation – Wenn alle sowieso in Jira arbeiten

Automatisierung für Re-Tests

  • Nuclei – Custom Templates für spezifische Findings
  • OWASP ZAP – Automatisierte Re-Scans
  • CI/CD-Integration – SAST/DAST bei jedem Commit
# Beispiel: Nuclei Template für Re-Test

id: sqli-login-retest
info:
  name: SQL Injection Login Form Retest
  author: internal-security
  severity: critical
  reference:
    - pentest-q4-2025-finding-17

requests:
  - method: POST
    path:
      - "{{BaseURL}}/api/v1/login"
    body: 'username=admin%27%20OR%201%3D1--&password=test'
    matchers:
      - type: word
        words:
          - "SQL syntax"
          - "mysql_fetch"
          - "ORA-"
        negative: true  # Should NOT match if fixed

Fazit

Ein Audit-Report ist kein Abschluss – er ist der Anfang der eigentlichen Arbeit. Der Unterschied zwischen Organisationen, die sicherer werden, und solchen, die dieselben Findings Jahr für Jahr bekommen:

  • Ownership: Jedes Finding hat einen Namen, nicht nur ein Team
  • Priorisierung: Business-Kontext schlägt CVSS-Scores
  • Tracking: Sichtbar, mit Eskalation, nicht im Backlog versteckt
  • Verifikation: Re-Test ist nicht optional
  • Lernen: Root Cause Analysis, nicht nur Symptombehandlung

Das Ziel ist nicht, den Audit zu bestehen. Das Ziel ist, sicherer zu werden. Der Audit ist nur das Messinstrument.

Nächster Schritt: Nehmen Sie Ihren letzten Audit-Report. Wie viele Findings sind noch offen? Haben alle einen Owner? Gibt es Deadlines? Wenn nicht – Sie wissen jetzt, wo Sie anfangen müssen.

Carola Schulte

Carola Schulte

Software-Architektin mit Erfahrung in Security-Audits – auf beiden Seiten des Reports.

Beratung anfragen

Remediation-Prozess optimieren?

Ich helfe Ihnen, einen funktionierenden Prozess für Security-Findings aufzusetzen – von der Triage bis zum Re-Test. Pragmatisch, nicht bürokratisch.

Beratung anfragen