Audit-Log: Pfad-Matching im finish-Handler gefixt (Pentest R165-01)

Die Entrauschung aus de0d6bd war live wirkungslos - aber nicht wegen eines
Deploy-Miss, sondern weil der Code nie erreicht wurde: auditMiddleware liest
req.path erst im res.on('finish')-Handler. Express strippt beim Router-Dispatch
den Mount-Prefix aus req.url und stellt ihn nur beim next()-Durchlauf wieder
her - ein terminaler Handler (res.json()) ruft nie next(), also bleibt req.path
router-relativ (/refresh statt /api/auth/refresh). Saemtliche
path.includes('/auth/...')-Checks liefen ins Leere -> Fallback POST->CREATE mit
Default-Sensitivitaet CRITICAL.

Betraf nicht nur den neuen TOKEN_REFRESH: LOGIN/LOGOUT/LOGIN_FAILED waren im
Audit-Stream seit jeher generisch (pre-existing), ebenso das endpoint-Feld.
Der SecurityEvent-Stream war nie betroffen (eigene emit-Calls), daher lief das
Alerting korrekt.

Fix: vollen Pfad einmal synchron beim Eintritt festhalten (req.originalUrl,
wird von Express nie mutiert) und downstream ausschliesslich diesen nutzen -
determineAction, generateHumanLabel, extractDataSubjectId, manuallyLoggedPaths
und endpoint. TOKEN_REFRESH zusaetzlich in die "immer loggen"-Ausnahme.

Verifiziert (E2E mit echter Middleware gegen Dev-DB): TOKEN_REFRESH/LOW,
TOKEN_REFRESH/HIGH, LOGIN/CRITICAL, LOGIN_FAILED/CRITICAL, LOGOUT/CRITICAL,
alle mit vollem endpoint-Pfad. tsc gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-19 08:11:44 +02:00
co-authored by Claude Opus 5
parent d599eb3702
commit ad520e20a7
2 changed files with 50 additions and 13 deletions
+26
View File
@@ -97,6 +97,32 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🐛 Audit-Log: Pfad-Matching kaputt Auth-Actions generisch (Pentest R165-01)** (2026-08-18)
- Pentester meldete: Entrauschung (`de0d6bd`) live **nicht wirksam** jeder
`/refresh` weiter `CREATE / CRITICAL / „Anmeldung erstellt“`. Zusatzbefund:
auch `/login` und `/logout` liefen als generisches `CREATE`.
- **Kein Deploy-Miss** (Alerting aus `d599eb3` lief ja live), sondern **toter
Code**: `auditMiddleware` liest `req.path` erst im `res.on('finish')`-Handler.
Express strippt beim Router-Dispatch den Mount-Prefix aus `req.url` und stellt
ihn nur beim `next()`-Durchlauf wieder her ein terminaler Handler
(`res.json()`) ruft nie `next()`, also bleibt `req.path` router-relativ
(`/refresh` statt `/api/auth/refresh`). Alle `path.includes('/auth/...')`-Checks
liefen ins Leere → Fallback POST→CREATE + Default-Sensitivität CRITICAL.
Empirisch nachgestellt (Mini-Express: ENTRY `/api/auth/refresh` → FINISH `/refresh`).
- Betraf **nicht nur** den neuen `TOKEN_REFRESH`: `LOGIN`/`LOGOUT`/`LOGIN_FAILED`
waren im Audit-Stream **seit jeher** kaputt (pre-existing), ebenso das
`endpoint`-Feld (router-relativ statt voll). Der SecurityEvent-Stream war nie
betroffen (eigene `emit()`-Calls) daher funktionierte das Alerting korrekt.
- Fix: vollen Pfad **einmal synchron beim Eintritt** festhalten
(`req.originalUrl.split('?')[0]`, wird von Express nie mutiert) und downstream
ausschließlich diesen nutzen in `determineAction`, `generateHumanLabel`,
`extractDataSubjectId`, `manuallyLoggedPaths` und `endpoint`. `TOKEN_REFRESH`
zusätzlich in die „immer loggen“-Ausnahme aufgenommen.
- Verifiziert (E2E mit echter Middleware gegen Dev-DB, 5 Requests):
`TOKEN_REFRESH/LOW` (Erfolg), `TOKEN_REFRESH/HIGH` (Fehlschlag),
`LOGIN/CRITICAL`, `LOGIN_FAILED/CRITICAL`, `LOGOUT/CRITICAL`, alle mit vollem
`endpoint`-Pfad und korrekten Labels. `tsc` grün.
- [x] **🛡️ Refresh-Fehlschlag: Detection-Gap geschlossen (Pentest R164-01)** (2026-08-18)
- Folgefund zum Entrauschen: `determineAction` gab `/auth/refresh` bedingungslos
`TOKEN_REFRESH`/LOW → ein **fehlgeschlagener** Refresh (Replay/Brute-Force auf