From 406f7854b7b2376746cac5efefaa5277e2f69ac0 Mon Sep 17 00:00:00 2001 From: Florian Wilde Date: Mon, 24 Aug 2026 10:06:13 +0200 Subject: [PATCH] chore: Version 1.11.0 --- CHANGELOG.md | 97 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 2 +- src/lib/version.ts | 2 +- 3 files changed, 98 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85c4020..0752505 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,100 @@ Wiederherstellung*. _Noch nichts._ +## [1.11.0] – 2026-08-24 + +Diese Fassung geht aus einer Sicherheitsprüfung hervor. Sie ändert nichts +an der Bedienung, schließt aber mehrere Lücken — darunter drei, bei denen +im Code eine Zusage stand, die so nicht galt. + +### Vor dem Update: zwei neue Zeilen in der `.env` + +```bash +ERSTEINRICHTUNG_GEHEIMNIS= +VERTRAUE_PROXY=true +``` + +Beide sind nicht zwingend, aber beide haben Folgen, wenn sie fehlen: + +- Ohne `ERSTEINRICHTUNG_GEHEIMNIS` läuft alles weiter — nur der **erste** + Zugang ließe sich nicht mehr anlegen. Auf einer bestehenden Installation + ist das genau richtig; bei einer Neuinstallation brauchst du den Wert. +- Ohne `VERTRAUE_PROXY=true` zählt die Anmeldesperre nur noch nach + E-Mail-Adresse, nicht mehr zusätzlich nach Anschluss. Beim ersten Mal + steht eine erklärende Zeile im Log. + +### Nach dem Update, nur mit Objektspeicher + +Bereits abgelegte Dateien liegen weiter unverschlüsselt, bis sie einmal +umgeschrieben werden. Lesen funktioniert durchgehend, der Lauf lässt sich +jederzeit abbrechen und wiederholen: + +```bash +npm run speicher:verschluesseln # erst schauen +npm run speicher:verschluesseln -- --anwenden +``` + +Wer beim Dateitreiber bleibt, muss nichts tun — dort wurde immer schon +verschlüsselt. + +### Behoben + +- **Der zweite Faktor war eine Anzeige, keine Grenze.** „TOTP ist Pflicht" + galt nur für Seiten. Server Actions und Downloads liefen daran vorbei: + Wer sich mit Passwort angemeldet, die Einrichtung aber nie abgeschlossen + hatte, kam an die Daten. Die Prüfung sitzt jetzt an der Stelle, durch die + alles muss. + +- **Ein Dokumenten-Download fragte nur nach der Anmeldung.** Dieselbe + Lücke, an einer Stelle, die bei der ersten Durchsicht übersehen wurde. + +- **Die Anmeldesperre sperrte dauerhaft aus.** Jeder Versuch während einer + laufenden Sperre verlängerte sie um die volle Dauer. Wer alle zehn + Minuten ein falsches Passwort an eine fremde Adresse schickte, sperrte + deren Inhaber aus — ohne das Passwort zu kennen. Nebenbei wuchs die + Tabelle mit jedem Versuch. + +- **Ein Code aus der Authenticator-App galt mehrfach.** Bis zu 90 Sekunden + lang ließ sich derselbe Code erneut einlösen — abgelesen, abgefangen + oder aus dem Browserverlauf. Jetzt gilt jeder genau einmal. + +- **Passkeys ließen sich ohne Rückfrage anlegen und entfernen.** An einem + unbeaufsichtigten Rechner waren das zwei Klicks zu einem dauerhaften + eigenen Zugang, der auch einen Passwortwechsel überlebt hätte. Jetzt + fragt die Anwendung vorher nach Passwort und Code — wie beim Export. + +- **Die Ersteinrichtung stand offen.** Zwischen dem ersten Start und dem + Anlegen des Zugangs konnte jeder, der die Seite fand, Administrator + werden. Zwei gleichzeitige Anfragen legten außerdem beide einen Zugang + an. + +- **Dateien im Objektspeicher lagen mit dem Schlüssel des Anbieters da.** + Gegen eine verlorene Festplatte im Rechenzentrum half das, gegen den + Anbieter und gegen gestohlene Zugangsdaten zum Speicher nicht. Jetzt + liegt derselbe Umschlag darum wie bei der Ablage auf dem eigenen Server, + mit einem Schlüssel, der die Anwendung nie verlässt. + +- **Ein präpariertes PDF konnte den Server umbringen.** Beim Auslesen des + eingebetteten Texts gab es keine Obergrenze: Wenige Kilobyte Füllung + blähen sich beim Auspacken auf Gigabyte auf. Ebenso beim Umwandeln in + Bilder — die Seitengröße steht im Dokument, und bei fester Auflösung + ergab eine künstlich große Seite ein Bild von mehreren Gigabyte. + +- **32 Schwachstellen in mitgelieferten Paketen, davon 5 kritische.** + Jetzt keine. + +### Geändert + +- **Downloads laufen jetzt immer über die Anwendung**, auch mit + Objektspeicher. Das ist die Folge der Verschlüsselung — entschlüsseln + kann nur die Anwendung. Nebeneffekt: Jeder Abruf prüft die Berechtigung + und wird protokolliert. Ein weitergeleiteter Link allein öffnet nichts + mehr. + +- **`docs/SICHERHEIT.md`** ist neu: Bedrohungsmodell, der Durchgang entlang + der OWASP Top 10 — und ein Abschnitt darüber, was ausdrücklich **nicht** + geschützt ist. + ## [1.10.2] – 2026-08-24 ### Behoben @@ -1171,7 +1265,8 @@ Was davon wann angegangen wird, steht in [`docs/ROADMAP.md`](docs/ROADMAP.md). --- -[Unveröffentlicht]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.10.2...HEAD +[Unveröffentlicht]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.11.0...HEAD +[1.11.0]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.10.2...v1.11.0 [1.10.2]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.10.1...v1.10.2 [1.10.1]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.10.0...v1.10.1 [1.10.0]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.9.0...v1.10.0 diff --git a/package.json b/package.json index 5f0cf8d..2164108 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "betreuungs-cockpit", - "version": "1.10.2", + "version": "1.11.0", "private": true, "description": "Arbeits- und Dokumentationswerkzeug fuer die ehrenamtliche rechtliche Betreuung", "engines": { diff --git a/src/lib/version.ts b/src/lib/version.ts index d393081..710fae4 100644 --- a/src/lib/version.ts +++ b/src/lib/version.ts @@ -17,7 +17,7 @@ */ /** Muss zur "version" in der package.json passen. */ -export const VERSION = '1.10.2' +export const VERSION = '1.11.0' /** * Kurzer Git-Stand, beim Bauen hineingereicht: