- .gitignore: .claude/docs, rules, commands tracken; settings.local weiter ignorieren - DOCUMENTATION.md: verbindliche Ablage functional/technical/working/issues - .claude/README.md: Agent-Einstieg; GITEA_ISSUES_INDEX aus MCP (Stand 2026-04-08) - Arbeitspapiere von docs/ nach .claude/docs/working/ verschoben - docs/MEMBERSHIP_SYSTEM.md als Stub; kanonisch technical/MEMBERSHIP_SYSTEM.md - CLAUDE.md Pflichtlektüre und Links angepasst; docs/README.md vereinfacht Made-with: Cursor
1.9 KiB
1.9 KiB
| title | labels |
|---|---|
| [Security/P0] X-Profile-Id / get_pid ermöglicht IDOR über alle Datendomänen | 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)
- Als Nutzer A einloggen, Token erhalten.
- Profil-ID von Nutzer B ermitteln (z. B. über
GET /api/profiles– siehe separates Issue). - Request gegen geschützten Endpoint mit Header
X-Profile-Id: <uuid-von-B>und Token von A.
Erwartetes Verhalten
- Standard:
profile_idausschließlich aus der Session. - Optional:
X-Profile-Idnur für Admins und mit expliziter Prüfungrequire_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/rulesoder technischer Doc, obX-Profile-Idnoch 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, …)