Fix #38: Sicherheitsprüfung abarbeiten (v1.11.0) #39
+96
-1
@@ -26,6 +26,100 @@ Wiederherstellung*.
|
|||||||
|
|
||||||
_Noch nichts._
|
_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=<zufälliger Wert, npm run schluessel erzeugt einen>
|
||||||
|
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
|
## [1.10.2] – 2026-08-24
|
||||||
|
|
||||||
### Behoben
|
### 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.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.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
|
[1.10.0]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.9.0...v1.10.0
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "betreuungs-cockpit",
|
"name": "betreuungs-cockpit",
|
||||||
"version": "1.10.2",
|
"version": "1.11.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Arbeits- und Dokumentationswerkzeug fuer die ehrenamtliche rechtliche Betreuung",
|
"description": "Arbeits- und Dokumentationswerkzeug fuer die ehrenamtliche rechtliche Betreuung",
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/** Muss zur "version" in der package.json passen. */
|
/** 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:
|
* Kurzer Git-Stand, beim Bauen hineingereicht:
|
||||||
|
|||||||
Reference in New Issue
Block a user