--- # Gitea: Beim Anlegen des Issues Titel und Labels manuell übernehmen (YAML wird von Gitea nicht automatisch geparst – dient als Meta-Hinweis). title: "[Security/P0] X-Profile-Id / get_pid ermöglicht IDOR über alle Datendomänen" labels: security, backend, priority-critical --- ## Kontext Code-Audit 2026-04-04 (`/.claude/docs/audit/20260404_code_audit/CODE_AUDIT_REPORT_2026-04-04.md`). ## Problem Die Funktion `get_pid` in `backend/routers/profiles.py` gibt bei gesetztem Header `X-Profile-Id` diesen Wert **unverändert** zurück, **ohne** Abgleich mit `session['profile_id']` oder Admin-Rolle. Damit kann jede authentifizierte Session mit gültigem Token Daten eines **beliebigen** Profils über alle Endpunkte ansprechen, die `get_pid(x_profile_id)` nutzen (u. a. Gewicht, Aktivität, Ernährung, Fotos-Upload/Liste, Vitals, Insights, Schlaf, Ruhetage, Export). ## Reproduktion (konzeptionell) 1. Als Nutzer A einloggen, Token erhalten. 2. Profil-ID von Nutzer B ermitteln (z. B. über `GET /api/profiles` – siehe separates Issue). 3. Request gegen geschützten Endpoint mit Header `X-Profile-Id: ` und Token von A. ## Erwartetes Verhalten - Standard: `profile_id` **ausschließlich** aus der Session. - Optional: `X-Profile-Id` nur für **Admins** und mit expliziter Prüfung `require_admin` + dokumentierter Use-Case (Multi-User-Admin-UI). ## Akzeptanzkriterien - [ ] Alle betroffenen Router verwenden session-basierte Profil-IDs oder einen validierten Admin-Override. - [ ] Regressionstests oder manuelle Checkliste für mindestens einen Endpoint pro Router-Gruppe. - [ ] Kurze Doku in `.claude/rules` oder technischer Doc, ob `X-Profile-Id` noch existiert und wann. ## Betroffene Dateien (Ausgangspunkt) - `backend/routers/profiles.py` (`get_pid`) - Alle Importe von `get_pid` (z. B. `weight`, `activity`, `nutrition`, `photos`, `insights`, `vitals_baseline`, `blood_pressure`, `rest_days`, `sleep`, …)