Easy!Appointments: Kontoübernahme über manipulierte Passwort-Reset-Links

Ein anonymer Angreifer setzt den Host im Passwort-Reset-Link eines fremden Kontos auf seinen Server und übernimmt nach einem Klick des Opfers das Konto.

Advisory-ID: TP-2026-112
Produkt: Easy!Appointments (Open-Source-Webanwendung zur Online-Terminbuchung)
Schwachstellentyp: Schwacher Mechanismus zur Passwortwiederherstellung (CWE-640)
CVE: nicht beantragt
CVSS 3.1: 7.5 (Hoch) · CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H
Betroffene Versionen: <= 1.6.0
Hersteller-Advisory: GHSA-c5rh-f2vc-2qvj
Status: Kein Fix verfügbar, Hersteller-Advisory veröffentlicht
Gemeldet: 17. Juli 2026

Zusammenfassung

Easy!Appointments ist eine Webanwendung zur Terminbuchung mit Rollen für Administratoren, Anbieter, Sekretariat und Kunden. Die Funktion zum Zurücksetzen des Passworts baut den Link in der Reset-Mail aus dem Host-Header der Anfrage statt aus der konfigurierten Basis-URL. Ein anonymer Angreifer stößt den Reset für ein fremdes Konto mit einem eigenen Host-Header an, und die echte Mail an das Opfer verweist mit gültigem Token auf seinen Server. Öffnet das Opfer den Link, erhält der Angreifer das Token, setzt ein neues Passwort und übernimmt das Konto, beim Administrator die gesamte Instanz.

Ursache

application/config/config.php:25 liest den Hostnamen aus $_SERVER['HTTP_HOST'], und application/config/config.php:33 setzt daraus base_url für jede Web-Anfrage, während die konfigurierte Konstante Config::BASE_URL nur für CLI-Aufrufe gilt. Recovery::perform() (application/controllers/Recovery.php:56) erzeugt den Reset-Link mit site_url() auf Basis dieser URL (application/controllers/Recovery.php:127). Der Link geht über Email_messages::send_password_reset_link() an die hinterlegte Adresse des Kontos (application/libraries/Email_messages.php:222). Das Token selbst ist stark, bin2hex(random_bytes(32)) mit SHA-256-Ablage (application/libraries/Accounts.php:225-228), die Schwäche liegt allein im Host des Links. Der anonyme Endpunkt verlangt nur Benutzername und E-Mail-Adresse des Kontos (application/controllers/Recovery.php:98-117), und keine Allowlist vertrauenswürdiger Hosts prüft den Host-Header vor dem Versand.

Proof of Concept

Schematisch:

POST /index.php/recovery/perform HTTP/1.1
Host: <angreifer-host>
Content-Type: application/x-www-form-urlencoded

username=<benutzername>&email=<e-mail-adresse>&<csrf-feld>=<csrf-token>

-> Reset-Mail an das Opfer verweist auf http://<angreifer-host>/.../recovery/reset?token=<token>

Die Anwendung übernimmt den gefälschten Host in den Link, und der Klick des Opfers liefert das Token an den Server des Angreifers. Mit diesem Token setzt der Angreifer über den regulären Reset-Ablauf ein neues Passwort.

Auswirkung

  • Übernahme beliebiger Konten, deren Benutzername und E-Mail-Adresse bekannt sind, nach einem Klick des Opfers auf den Link in einer echten Mail der Anwendung.
  • Volle Administratorrechte beim Standard-Administratorkonto, mit Zugriff auf alle Termine, Kundendaten und die Systemkonfiguration.
  • Keine Spuren eines Einbruchs in der Mail selbst, da Absender und Inhalt von der Anwendung stammen.

Referenzen

Ein Patch des Herstellers steht noch aus. Fix-Release und eine gegebenenfalls vergebene CVE-Kennung werden hier nach Bereitstellung ergänzt.

Steckt so etwas in Ihrer Software?

Diese Schwachstelle hat unser Team im Rahmen seiner Arbeit gefunden. Lassen Sie Ihre Anwendungen von denselben Spezialisten prüfen, mit einem Penetrationstest von turingpoint.