security: geleakte Secrets aus Repo entfernen (Review-Befund k)

Secret-Scan im Fable-5-Review fand vier aktive Zugangsdaten im
oeffentlich erreichbaren Gitea-Repo. Gefahrlos entfernbare Stellen:
- scripts/release.ps1: Gitea-Token -> Umgebungsvariable PYRAMID_GITEA_TOKEN
- docs/matrix-sdk/13-server-admin: 19x Admin-Token -> <ADMIN_TOKEN>

Client-eingebettete Secrets (LiveKit apiSecret, Admin-Token im
E2EE-Diagnose-Upload, Giphy-Key) brauchen Rotation + Server-Umbau
und stehen als neue M0-ROADMAP-Punkte (nicht blind auf dem Pi fixbar).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Bernd Steckmeister
2026-07-04 03:32:37 +02:00
parent a5a5c4baf5
commit fe6427bfba
5 changed files with 111 additions and 20 deletions
+66
View File
@@ -13,6 +13,64 @@ Schritt (und beim Abbruch mitten im Schritt den Zwischenstand). Format:
---
## 2026-07-04 Fable-5-Review (k): Secret-Scan ECHTER Sicherheitsbefund, teils gefixt
**Erledigt:** Beim Review-Pass zusätzlich einen systematischen Secret-Scan über
`lib/`, `scripts/`, `docs/`, `android/` gemacht (CLAUDE.md-Leitplanke „Keine
Secrets ins Repo"). **Ergebnis: mehrere echte, aktive Zugangsdaten liegen im
Repo und das Gitea-Repo ist als `private:false` unter der Internet-Domain
`git.steggi-matrix.work` erreichbar** (per `curl` bestätigt: Repo-Metadaten und
Releases anonym abrufbar). Damit sind alle folgenden Secrets als **kompromittiert
zu behandeln** (seit Commit 25ed765 in der History):
- **Matrix-Server-ADMIN-Token** `J5lax…` lag doppelt drin:
(1) als Bearer-Token in `docs/matrix-sdk/13-server-admin-continuwuity.md`
(19 Stellen) und (2) **im ausgelieferten App-Code**
`lib/widgets/settings/settings_encryption.dart:431` (E2EE-Diagnose-Upload).
Per `whoami` gegen den Homeserver geprüft: **Token ist noch gültig**
(`@todesneutron:steggi-matrix.work`, voller Server-Admin). Kritischster Fund
jeder App-Nutzer (auch Uta) trägt den Server-Admin-Token im Client.
- **Gitea-Release-Token** `bb522f96…` (Repo-Schreibrechte) hartcodiert in
`scripts/release.ps1:14`.
- **LiveKit-`apiSecret`** `rYUT2PRa…` in `lib/core/livekit_token.dart:6` die
App mintet LiveKit-JWTs **client-seitig**, das SFU-Secret muss also im Client
liegen (Architekturproblem, nicht nur ein Repo-Leak).
- **Giphy-API-Key** `QtEy…` in `lib/features/chat/gif_sticker_picker.dart:9`
(geringe Sensibilität, aber ebenfalls im Client).
**Sofort (gefahrlos, kein Laufzeit-Bezug) bereinigt:**
- `scripts/release.ps1`: Token raus, kommt jetzt aus Umgebungsvariable
`PYRAMID_GITEA_TOKEN`; fehlt sie, bricht das Skript mit klarer Anleitung ab.
- `docs/matrix-sdk/13-server-admin-continuwuity.md`: alle 19 Token-Stellen durch
`<ADMIN_TOKEN>`-Platzhalter ersetzt.
**Offen/Nächster Schritt (BRAUCHT BERND / PC nicht blind auf dem Pi fixen):**
1. **Alle vier Secrets rotieren** (sie sind bereits geleakt, egal was im Code
steht): neuen Matrix-Admin-Token erzeugen und alten widerrufen; neuen
Gitea-Token; LiveKit-`apiKey`/`apiSecret` neu setzen (Hetzner-LiveKit +
`ice.json`); Giphy-Key neu ziehen. **Das ist der wichtigste Schritt** die
Repo-Bereinigung allein nützt nichts, solange die alten Werte gültig sind.
2. **Client-seitige Secrets entschärfen (Architektur):** LiveKit-Token gehört
server-seitig gemintet (kleiner Token-Endpoint auf dem Pi, App holt sich nur
das fertige JWT) dann verschwindet `apiSecret` aus dem Client. Der
E2EE-Diagnose-Upload darf **niemals** den Server-Admin-Token benutzen: eigenen,
eng begrenzten Token (nur der Dashboard-Endpoint) oder besser einen
unauthentifizierten Upload mit Rate-Limit. Beides als ROADMAP-M0-Punkt neu
aufgenommen. Blind entfernen verbietet sich, weil Calls/Diagnose sonst brechen
(Calls sind „heilig") und auf dem Pi kein GUI-Test möglich ist.
3. **Git-History:** Die alten Werte bleiben in der Gitea-History sichtbar. Nach
der Rotation sind sie wertlos; ein History-Rewrite (force-push) ist optional
und Bernds Entscheidung (das Repo dient auch als Backup) daher NICHT
eigenmächtig gemacht.
**Stolperfallen:** Der Diagnose-„Token" in `settings_encryption.dart` ist
NICHT ein harmloser Dashboard-Key, sondern derselbe String wie der
Matrix-Server-Admin-Token beim Lesen leicht zu übersehen, weil er dort nur
`token:` heißt. Lehre: bei Secret-Funden immer prüfen, ob derselbe Wert an
mehreren Stellen (Doku UND Client) wiederkehrt und WAS er wirklich autorisiert.
---
## 2026-07-03 Fable-5-Review (h)(j): Test-/Doku-Commits geprüft, 1 echter Befund gefixt
**Erledigt:**
@@ -322,6 +380,14 @@ schließt den Review ab.
- [x] **(j) PC-Testplan-Update (03b84e0) geprüft stimmt.** Teststand „22
Tests" war korrekt (durch (i) jetzt 24 im Testplan nachgezogen, siehe
Eintrag oben).
- [x] **(k) Secret-Scan über das ganze Repo ECHTER Sicherheitsbefund
(2026-07-04).** Vier aktive Zugangsdaten im öffentlich erreichbaren Repo
(Matrix-Admin-Token doppelt auch im Client!, Gitea-Release-Token,
LiveKit-`apiSecret`, Giphy-Key). Gefahrlose Stellen sofort bereinigt
(release.ps1 → Env-Var, Admin-Doku → Platzhalter); Rotation aller Secrets +
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.
**Fazit:** Die Sonnet-5-Arbeit war handwerklich sauber; die zwei echten Lücken
(verlorene Kommentare, fehlender Soft-Logout-Guard) hatte die abgebrochene