security: Diagnose-Endpoint gegen Disk-Fill haerten (Review-Befund l)

Fable-5-Review (l)+(m): /api/e2ee-diagnostics auf dem Pi las den Body ohne
Groessenlimit und haengte ihn unbegrenzt ans Log – bei oeffentlich bekanntem
DIAG_TOKEN ein Disk-Fill-DoS-Risiko. server.py: 256-KB-Body-Limit (413) +
20-MB-Log-Kappung, headless verifiziert (200/403/413). LiveKit-Plan (m)
gegen Code + Pi-Konfig gegengeprueft, stimmt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bernd Steckmeister
2026-07-04 04:32:38 +02:00
parent 88af6c016c
commit ba97f942d6
2 changed files with 48 additions and 0 deletions
+4
View File
@@ -1232,3 +1232,7 @@
2026-07-04 04:06 [Edit] /home/steggi/pyramid/ROADMAP.md
2026-07-04 04:06 [Edit] /home/steggi/pyramid/PROGRESS.md
2026-07-04 04:07 [Edit] /home/steggi/.claude-pyramid/projects/-home-steggi-pyramid/memory/pyramid-arbeitsstand.md
2026-07-04 04:30 [Edit] /home/steggi/matrix/server.py
2026-07-04 04:30 [Edit] /home/steggi/matrix/server.py
2026-07-04 04:31 [Edit] /home/steggi/pyramid/PROGRESS.md
2026-07-04 04:32 [Edit] /home/steggi/pyramid/PROGRESS.md
+44
View File
@@ -13,6 +13,33 @@ Schritt (und beim Abbruch mitten im Schritt den Zwischenstand). Format:
---
## 2026-07-04 Fable-5-Review (l)+(m): Diagnose-Endpoint hatte kein Größenlimit (gefixt)
**Erledigt:** Review-Pass über die zwei seit (k) dazugekommenen Arbeiten als
Punkte (l) und (m) im Fable-5-Review-Abschnitt abgehakt (Details dort). Bei (l)
ein **echter Befund** am Server-Gegenpart des Admin-Token-Fixes: Der neue
`DIAG_TOKEN` steht bewusst im öffentlichen Repo (eng begrenzt, nur Log-Anhängen)
aber `/api/e2ee-diagnostics` in `/home/steggi/matrix/server.py` las den
Request-Body **ohne Größenlimit** und hängte ihn unbegrenzt an die Log-Datei an.
Jeder Fremde hätte damit die Pi-Platte volllaufen lassen können (Disk-Fill-DoS
auf dem Host, der auch den Homeserver trägt). Gefixt in `server.py`:
Body-Limit 256 KB pro Upload (413 bei Überschreitung) + harte Obergrenze 20 MB
für die Log-Datei (ältere Hälfte fliegt raus). Headless verifiziert nach
Dienst-Neustart (kill, `Restart=always`): stats.html 200, gültiger Upload 200
und im Log gelandet, falscher Token 403, 300-KB-Body 413; Kappungslogik isoliert
getestet (100 Zeilen → 50, neueste überleben). Test-Einträge wieder entfernt.
**Offen/Nächster Schritt:** Weiter mit dem obersten offenen ROADMAP-Punkt
(M0 LiveKit-Token): Server-Route nach `docs/LIVEKIT_TOKEN_MIGRATION.md` bauen
rein additiv, Client bleibt unangetastet (heiliger Call-Pfad wartet auf PC/Gerät).
**Stolperfallen:** Ein „eng begrenzter" Token im öffentlichen Repo ist nur dann
wirklich harmlos, wenn das Endpoint dahinter auch Missbrauch begrenzt
(Größe/Menge) „keine Admin-Rechte" allein reicht nicht. Bei künftigen
Endpoints mit öffentlich bekanntem Token immer an Body-/Speicher-Limits denken.
---
## 2026-07-04 LiveKit-Token-Minting: Migrationsplan geschrieben (Prep, kein Code)
**Erledigt:** Für den offenen M0-Punkt „LiveKit-Token server-seitig minten"
@@ -455,6 +482,23 @@ schließt den Review ab.
server-seitiges LiveKit-Token-Minting + nicht-Admin-Diagnose-Token als neue
M0-Punkte aufgenommen (brauchen Bernd/Server-Zugriff). Details im
PROGRESS-Eintrag 2026-07-04 oben.
- [x] **(l) Admin-Token-Entkopplung (925aafb) geprüft Client-Seite korrekt,
am Server-Gegenpart 1 echter Befund gefunden und gefixt (2026-07-04).**
Client-Diff verifiziert: neuer `pyr-diag-…`-Token stimmt mit `DIAG_TOKEN` in
`server.py` überein, `grep J5lax lib/ scripts/` unabhängig nachgeprüft (leer;
einziges verbliebenes Client-Secret ist das LiveKit-`apiSecret`, eigener
M0-Punkt). Befund: `/api/e2ee-diagnostics` hatte **kein Body-/Log-Größenlimit**
bei öffentlich bekanntem Token → Disk-Fill-DoS möglich. Gefixt + headless
verifiziert (200/403/413, Kappung), Details im PROGRESS-Eintrag 2026-07-04.
- [x] **(m) LiveKit-Migrationsplan (78e4174) gegen Code + Pi-Konfig geprüft
Behauptungen stimmen.** `livekit_token.dart:6` enthält das `apiSecret`,
Aufrufstelle `livekit_call_manager.dart:154` mit `ttlSeconds: 21600`, Grants
im Plan identisch mit dem Dart-Code (roomJoin/room/canPublish/canSubscribe/
canPublishData, metadata = Anzeigename, iss = LKMatrixPi, sub = identity),
`livekit.yaml` `keys:` wie beschrieben, Continuwuity antwortet auf
`127.0.0.1:6167` (whoami-Basis). Python-Snippet (stdlib-HS256) fachlich
korrekt (base64url ohne Padding, kompaktes JSON, HMAC-SHA256). Anmerkung:
Der Plan setzt zusätzlich `nbf`/`name` LiveKit akzeptiert beides, harmlos.
**Fazit:** Die Sonnet-5-Arbeit war handwerklich sauber; die zwei echten Lücken
(verlorene Kommentare, fehlender Soft-Logout-Guard) hatte die abgebrochene