[Security] IDOR: Job- und ZIP-IDs nicht an Session gebunden #14

Closed
opened 2026-05-27 12:21:05 +02:00 by ferdi2go · 1 comment
Owner

Problem

server.py:294-311, server.py:466-476, server.py:478-497

Job-Status- und Download-Endpoints pruefen nur die Existenz der ID, nicht den Besitzer:

@app.get("/export/download/{zip_id}")
def export_download(zip_id: str):
    zip_path = _zip_store.get(zip_id)

Jeder authentifizierte Nutzer (mit APP_PASSWORD="" sogar jeder) kann beliebige UUIDs abrufen.

Fix

Beim Anlegen Owner-Token speichern und im Status/Download vergleichen:

_jobs[job_id] = {"status": "running", "owner": token, ...}
_zip_store[zip_id] = {"path": ..., "owner": token}
## Problem `server.py:294-311`, `server.py:466-476`, `server.py:478-497` Job-Status- und Download-Endpoints pruefen nur die Existenz der ID, nicht den Besitzer: ```python @app.get("/export/download/{zip_id}") def export_download(zip_id: str): zip_path = _zip_store.get(zip_id) ``` Jeder authentifizierte Nutzer (mit `APP_PASSWORD=""` sogar jeder) kann beliebige UUIDs abrufen. ## Fix Beim Anlegen Owner-Token speichern und im Status/Download vergleichen: ```python _jobs[job_id] = {"status": "running", "owner": token, ...} _zip_store[zip_id] = {"path": ..., "owner": token} ```
ferdi2go added the securitypriority: high labels 2026-05-27 12:21:05 +02:00
Author
Owner

Fix umgesetzt in server.py:

  • Helper _request_token(request) extrahiert Bearer-Token (oder noauth bei deaktiviertem APP_PASSWORD)
  • _check_owner(owner, request) -> 403 bei Mismatch
  • /analyze, /export speichern owner im Job-Dict
  • /analyze/status, /export/status, /export/download pruefen Owner
  • _zip_store jetzt {zip_id: {path, owner}} statt nackter Pfad

Manueller Test mit zwei verschiedenen Tokens: 403 fuer fremden Job, 200 fuer eigenen.

Fix umgesetzt in `server.py`: - Helper `_request_token(request)` extrahiert Bearer-Token (oder `noauth` bei deaktiviertem APP_PASSWORD) - `_check_owner(owner, request)` -> 403 bei Mismatch - `/analyze`, `/export` speichern `owner` im Job-Dict - `/analyze/status`, `/export/status`, `/export/download` pruefen Owner - `_zip_store` jetzt `{zip_id: {path, owner}}` statt nackter Pfad Manueller Test mit zwei verschiedenen Tokens: 403 fuer fremden Job, 200 fuer eigenen.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ferdi2go/OnlyFrames#14