MFA-enforcement ontbrak in route-handlers (alleen requireRole/assertCanWrite was MFA-aware) #98

Closed
opened 2026-05-26 18:23:32 +00:00 by jesse-a · 1 comment
Owner

Severity: HIGH

Mijn ronde-1 MFA-fix updateerde requireRole() en assertCanWrite() in src/lib/auth.ts om server-side TOTP af te dwingen. Maar veel route-handlers (app/api/**/route.ts en app/(app)/**/route.ts) doen direct getSession() zonder session.totpEnabled-check. Een ingelogde manager/admin zonder afgeronde TOTP-setup kon dus via directe API-calls toch acties uitvoeren.

Concrete kwetsbare routes:

  • api/search/route.ts
  • api/ai/{customer-summary,quote-draft,ocr-expense}/route.ts
  • api/kvk/search/route.ts
  • api/travel/quote/route.ts
  • api/attachments/[id]/route.ts
  • api/wordpress/[id]/stats-report/route.ts
  • (app)/data/{export,ubl}/route.ts
  • (app)/expenses/{export,[id]/receipt}/route.ts
  • (app)/boekhouding/externe-facturen/[id]/file/route.ts
  • (app)/{invoices,quotes,contracts}/[id]/{pdf,file}/route.ts

Fix: nieuwe helper requireApiSession({minRole?}) in src/lib/auth.ts voor route-handlers. Doet session + role + MFA-check, retourneert NextResponse-error i.p.v. te redirecten. 16 routes overgezet. Elke route kreeg een passende rol-eis: MANAGER voor write/AI, ADMIN voor bulk-exports, any-met-MFA voor read-only PDF/file-downloads.

Files: src/lib/auth.ts + 16 route-files

**Severity: HIGH** Mijn ronde-1 MFA-fix updateerde `requireRole()` en `assertCanWrite()` in `src/lib/auth.ts` om server-side TOTP af te dwingen. Maar veel route-handlers (`app/api/**/route.ts` en `app/(app)/**/route.ts`) doen direct `getSession()` zonder `session.totpEnabled`-check. Een ingelogde manager/admin zonder afgeronde TOTP-setup kon dus via directe API-calls toch acties uitvoeren. Concrete kwetsbare routes: - `api/search/route.ts` - `api/ai/{customer-summary,quote-draft,ocr-expense}/route.ts` - `api/kvk/search/route.ts` - `api/travel/quote/route.ts` - `api/attachments/[id]/route.ts` - `api/wordpress/[id]/stats-report/route.ts` - `(app)/data/{export,ubl}/route.ts` - `(app)/expenses/{export,[id]/receipt}/route.ts` - `(app)/boekhouding/externe-facturen/[id]/file/route.ts` - `(app)/{invoices,quotes,contracts}/[id]/{pdf,file}/route.ts` **Fix**: nieuwe helper `requireApiSession({minRole?})` in `src/lib/auth.ts` voor route-handlers. Doet session + role + MFA-check, retourneert NextResponse-error i.p.v. te redirecten. 16 routes overgezet. Elke route kreeg een passende rol-eis: MANAGER voor write/AI, ADMIN voor bulk-exports, any-met-MFA voor read-only PDF/file-downloads. **Files**: src/lib/auth.ts + 16 route-files
Author
Owner

Opgelost in commit 8e18add.

Opgelost in commit 8e18add.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
jesse-a/OpenCRM#98
No description provided.