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:
+66
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user