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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user