Security: Path Traversal im Image-Endpoint erlaubt beliebigen Dateizugriff #64

Open
opened 2026-03-30 20:18:02 +00:00 by David · 0 comments
Collaborator

Beschreibung

Der Endpoint GET /api/tickets/{id}/images/{idx} in backend/api/tickets.py:321-341 validiert den Dateipfad nicht. Durch manipulierte Bildpfade in der Datenbank kann ein Angreifer beliebige Dateien vom Server lesen (z.B. ../../etc/passwd, .env).

Hintergrund

Die Bildpfade werden beim Odoo-Polling gespeichert und beim Abruf direkt an FileResponse übergeben, ohne zu prüfen ob der Pfad innerhalb des erlaubten Verzeichnisses liegt.

Akzeptanzkriterien

  • Dateipfad wird gegen ein erlaubtes Basisverzeichnis validiert (z.B. REPOS_CACHE_DIR)
  • Path Traversal via ../ wird erkannt und mit 403 abgelehnt
  • Symlink-Angriffe werden verhindert (os.path.realpath() Prüfung)
  • Test: Versuch mit ../../../etc/passwd gibt 403 zurück

Technische Hinweise

  • Betroffene Datei: backend/api/tickets.py:321-341
  • Ansatz: os.path.realpath() + Prefix-Check gegen erlaubtes Verzeichnis
  • Migration nötig: nein

Aufwand: S

## Beschreibung Der Endpoint `GET /api/tickets/{id}/images/{idx}` in `backend/api/tickets.py:321-341` validiert den Dateipfad nicht. Durch manipulierte Bildpfade in der Datenbank kann ein Angreifer beliebige Dateien vom Server lesen (z.B. `../../etc/passwd`, `.env`). ## Hintergrund Die Bildpfade werden beim Odoo-Polling gespeichert und beim Abruf direkt an `FileResponse` übergeben, ohne zu prüfen ob der Pfad innerhalb des erlaubten Verzeichnisses liegt. ## Akzeptanzkriterien - [ ] Dateipfad wird gegen ein erlaubtes Basisverzeichnis validiert (z.B. `REPOS_CACHE_DIR`) - [ ] Path Traversal via `../` wird erkannt und mit 403 abgelehnt - [ ] Symlink-Angriffe werden verhindert (`os.path.realpath()` Prüfung) - [ ] Test: Versuch mit `../../../etc/passwd` gibt 403 zurück ## Technische Hinweise - Betroffene Datei: `backend/api/tickets.py:321-341` - Ansatz: `os.path.realpath()` + Prefix-Check gegen erlaubtes Verzeichnis - Migration nötig: nein ## Aufwand: S
Sign in to join this conversation.
No description provided.