fix: Ohne Anmeldung liessen sich beliebige Dateien vom Server lesen
Die Auslieferung des Frontends nahm den Pfad roh aus der Adresse: "Path /
'../../x'" verlaesst den Ordner klaglos, und die Route liegt VOR jeder
Anmeldepruefung. Gegen die eigene Instanz nachgestellt – roh und
prozentkodiert kam beides Mal die Datei heraus:
GET /../../GEHEIM.txt -> "geheim"
GET /../../backend/app/config.py -> der Quelltext
Damit war alles lesbar, was der Dienst lesen darf: Quelltext, Konfiguration,
und mit der passenden Zahl von Ebenen die Datenbank samt verschluesseltem
Postfach-Passwort und Bank-Schluessel. Der Pfad wird jetzt aufgeloest und
muss im Auslieferungs-Ordner liegen.
Zweitens prueft der Postfach-Abruf jetzt das Zertifikat. Ohne eigenen
SSL-Kontext tut imaplib das NICHT – die Verschluesselung schuetzt dann vor
niemandem, der sich dazwischenhaengt, und das Postfach-Passwort geht mit.
Gilt fuer beide Wege, SSL und STARTTLS.
Drittens warnt der Start, wenn das Sitzungs-Cookie ohne "Secure" ausgeliefert
wird. Die Vorgabe bleibt bewusst aus: Sie umzustellen sperrt jeden aus, der
Certain im Heimnetz ueber HTTP aufruft – und ein Ausgesperrter saehe die
Ursache nirgends.
Die Befunde stammen aus dem /security-review dieser Sitzung und waren seither
offen. Sie wiegen schwerer, seit die Anwendung fuer die Bankanbindung unter
einer oeffentlichen HTTPS-Adresse erreichbar sein muss.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -17,6 +17,7 @@ import email
|
||||
import email.policy
|
||||
import email.utils
|
||||
import imaplib
|
||||
import ssl
|
||||
import logging
|
||||
from datetime import date, datetime, timedelta, timezone
|
||||
|
||||
@@ -49,12 +50,17 @@ def _verbinden(quelle: MailSource) -> imaplib.IMAP4:
|
||||
try:
|
||||
if art == "ssl":
|
||||
# TLS ab der ersten Zeile – der Normalfall auf Port 993.
|
||||
verbindung = imaplib.IMAP4_SSL(quelle.host, quelle.port)
|
||||
# MIT eigenem Kontext: Ohne einen prueft imaplib das Zertifikat
|
||||
# nicht, und die Verschluesselung schuetzt dann vor niemandem, der
|
||||
# sich dazwischenhaengt – das Postfach-Passwort geht mit.
|
||||
verbindung = imaplib.IMAP4_SSL(quelle.host, quelle.port,
|
||||
ssl_context=ssl.create_default_context())
|
||||
else:
|
||||
verbindung = imaplib.IMAP4(quelle.host, quelle.port)
|
||||
if art == "starttls":
|
||||
# Erst im Klartext verbinden, dann verschlüsseln (Port 143).
|
||||
verbindung.starttls()
|
||||
# Erst im Klartext verbinden, dann verschlüsseln (Port 143) –
|
||||
# ebenfalls mit geprüftem Zertifikat, aus demselben Grund.
|
||||
verbindung.starttls(ssl.create_default_context())
|
||||
except OSError as e:
|
||||
raise MailFehler(f"Keine Verbindung zu {quelle.host}:{quelle.port} – {e}") from e
|
||||
except imaplib.IMAP4.error as e:
|
||||
|
||||
Reference in New Issue
Block a user