
Verantwortungsvolle Offenlegung einer ungepatchten Sicherheitslücke in FluentCRM von WPManageNinja
Update 2023-06-12: Sie benötigen den Snippet nicht mehr. WPManageNinja hat die Sicherheitslücke zwei Stunden nach der öffentlichen Offenlegung gepatcht (93 Tage nach der Meldung).
Update 2024-01-27: Das verwandte Problem mit ewigen Hash-Werten ist nun vollständig behoben.
tl;dr Angreifer können Kontaktdaten in FluentCRM einsehen und bearbeiten. WPManageNinja hat die Sicherheitslücke innerhalb des 90-tägigen Zeitfensters für verantwortungsvolle Offenlegung nicht behoben. Ich stelle einen Minderungs-Snippet zur Verfügung, um die Ausnutzung der Sicherheitslücke zu verhindern, während auf einen offiziellen Patch gewartet wird.
Heute veröffentliche ich Informationen über eine Sicherheitslücke, die ich im beliebten WordPress-Plugin FluentCRM von WPManageNinja gefunden habe. Die Schwachstelle CVE-2023-1430 wird durch die unzureichende Verwendung eines E-Mail-Adress-Hashs als Autorisierungskontrolle durch FluentCRM verursacht. Ich habe die Sicherheitslücke gemäß der Richtlinie zur Offenlegung von Sicherheitslücken von Google Zero verantwortungsvoll offengelegt. WPManageNinja hat weder innerhalb des 90-Tage-Fensters einen Patch bereitgestellt noch eine Zeitverlängerung beantragt.
In diesem Bericht bezieht sich Kontakt auf ein FluentCRM-Kontaktobjekt, während Benutzer sich auf ein WordPress-Benutzerobjekt bezieht. Ein Kontakt kann mit einem Benutzer verknüpft sein, ist aber nicht erforderlich. Details zur Ausnutzung der Sicherheitslücke werden bis zur Verfügbarkeit eines offiziellen Patches zurückgehalten. Sicherheitsexperten können mich für den vollständigen Bericht kontaktieren ([email protected]).
Auf Websites, die FluentCRM ausführen, kann ein Angreifer den Namen, die E-Mail-Adresse und die Listeneinstellungen eines Kontakts einsehen und bearbeiten, indem er die E-Mail-Adresse des Kontakts kennt. Da der Name des Kontakts häufig über Merge-Tags in Newslettern enthalten ist, kann ein Angreifer den Namen des Kontakts durch anstößige Sprache ersetzen, was dazu führt, dass der Websitebetreiber vulgäre Newsletter versendet. Wenn der Website-Administrator den Shortcode von FluentCRM zum Verwalten von Präferenzen aktiviert und auf einer öffentlichen Webseite platziert hat, kann ein Angreifer alle offengelegten persönlichen Informationen einsehen und bearbeiten, d.h. Titel, Telefonnummer, Geburtsdatum und Adresse (abhängig von der FluentCRM-Konfiguration).
FluentCRM ist auf mehr als 30.000 Websites installiert. Website-Administratoren von FluentCRM-Seiten können die Ausnutzung der Sicherheitslücke verhindern, indem sie meinen Minderungs-Snippet in die functions.php-Datei ihres Child-Themes einfügen.
Der Snippet behebt die Sicherheitslücke nicht. Er ersetzt den anfälligen Inhalt auf der Abmeldeseite (unsubscribe.php) und der Seite zum Verwalten von Präferenzen (manage_subscription.php) von FluentCRM durch eine Fehlermeldung, die den Kontakt auffordert, sich stattdessen per E-Mail zu melden. Die E-Mail-Adresse in der Fehlermeldung ist die Admin-E-Mail-Adresse der Website (kann im Snippet geändert werden). Der Minderungs-Snippet stellt außerdem sicher, dass nicht eingeloggte Besucher den anfälligen Shortcode von FluentCRM zum Verwalten von Präferenzen (fluentcrm_pref) nicht rendern können. Ein nicht eingeloggter Besucher sieht stattdessen eine Fehlermeldung, die ihn auffordert, sich einzuloggen. Alle Zeichenfolgen sind mit der bereitgestellten POT-Datei übersetzbar.
Ich empfehle Websitebesitzern, entweder die von mir bereitgestellte Minderung oder eine eigene entsprechende Minderung zu implementieren. Websitebesitzer sollten außerdem die Integrität ihrer FluentCRM-Kontaktdaten überprüfen und, wenn möglich, ihre Logs auf potenzielle Datenlecks prüfen. Die Überprüfung der Logs ist besonders wichtig für die folgenden Websites:
Der für die Website benannte Datenschutzbeauftragte muss potenzielle Datenlecks personenbezogener Daten gemäß den Gesetzen und Vorschriften der betroffenen Rechtsordnungen behandeln.
Wenn FluentCRM so konfiguriert ist, dass die Einstellungen eines Kontakts mit dem entsprechenden Benutzer synchronisiert werden, kann ein Angreifer den Namen des Benutzers ändern. Glücklicherweise synchronisiert FluentCRM keine E-Mail-Adressen von Kontakten zu Benutzern. Wenn FluentCRM dies tun würde, würde diese Sicherheitslücke eine vollständige Übernahme der Website ermöglichen. Ein Angreifer hätte privilegierten Zugriff erlangen können, indem er die E-Mail-Adresse des Site-Administrators ändert und dann das Passwort des Administrators zurücksetzt.
Andere Lösungen können jedoch alle Metadaten von Kontakten zu Benutzern synchronisieren, z. B. WP Fusion und die API von FluentCRM. WP Fusion ist wahrscheinlich das beliebteste Drittanbieter-Plugin zum Synchronisieren von Kontakt-Metadaten zwischen einem CRM (z. B. FluentCRM) und WordPress. Glücklicherweise ist die aktuelle Version von WP Fusion nicht in Metadatenänderungen eingebunden, die von den anfälligen Formularen initiiert werden. Ich habe die Entwickler von WP Fusion informiert, und sie werden diese Einschränkung erst beheben, wenn WPManageNinja die Sicherheitslücke behoben hat.
Die API von FluentCRM kann auch zum Aktualisieren von Kontakt- und Benutzerdaten verwendet werden. Websitebesitzer, die die API von FluentCRM zum Aktualisieren von E-Mail-Adressen von Benutzern verwenden, müssen diese Aktualisierung deaktivieren, wenn sie von der Seite oder dem Shortcode von FluentCRM zum Verwalten von Präferenzen initiiert wird (oder meinen Minderungs-Snippet hinzufügen, um sicherzustellen, dass keine Einstellungen von den anfälligen Formularen aktualisiert werden können).
FluentCRM ermöglicht es Kontakten, sich von öffentlichen Webseiten abzumelden und ihre Präferenzen zu verwalten. Links zu diesen Seiten sind in jedem Newsletter enthalten. Änderungen, die auf diesen Seiten vorgenommen werden, werden durch MD5-Hashes der E-Mail-Adressen der Kontakte autorisiert, die als URL-Parameter übergeben werden. Der MD5-Hash einer E-Mail-Adresse ist kein Geheimnis und kann von jedem berechnet werden. Ein Angreifer kann die falsche Verwendung von Hashes ausnutzen, um bestimmte Kontakte abzumelden oder Kontakte mit bekannten E-Mail-Adressen massenhaft abzumelden.
Während die Abmeldeseite ausschließlich auf den MD5-Hash für die Autorisierung angewiesen ist, erfordert die Seite zum Verwalten von Präferenzen einen zusätzlichen URL-Parameter namens ce_id. In diesem Fall bezieht sich die ce_id auf die ID des Kontakts in der Tabelle fc_subscribers. Diese ID ist eine aufsteigende ganze Zahl. Der ce_id-Wert ist daher leicht zu finden, indem alle möglichen Werte getestet werden (der Suchraum ist die Anzahl der jemals registrierten Kontakte der Website). Admin-Benutzer haben wahrscheinlich niedrige Werte.
Von der Seite zum Verwalten von Präferenzen aus kann ein Angreifer auch den secure_hash-Wert des Kontakts extrahieren. Durch Aktualisieren der E-Mail-Adresse des Kontakts wird der „secure_hash“-Wert des Kontakts in einem Cookie namens fc_hash_secure gespeichert. Mit diesem Cookie kann der Angreifer alle Kontaktinformationen anzeigen, die durch den Shortcode des Präferenzformulars von FluentCRM verfügbar gemacht werden.
Der zuvor erwähnte „secure_hash“ ist ein Wert, auf den FluentCRM (in einigen Situationen) anstelle oder als Alternative zum MD5-E-Mail-Adress-Hash zurückgreift. Seit der Veröffentlichung von FluentCRM 2.8.0 verlässt sich die Abmeldeseite ausschließlich auf den secure_hash-Wert für die Autorisierung. Die Seite zum Verwalten von Präferenzen akzeptiert sowohl den neuen secure_hash-Wert als auch den alten MD5-E-Mail-Adress-Hash für die Autorisierung.
Während der secure_hash-Wert nicht aus der E-Mail-Adresse abgeleitet werden kann, entspricht die Verwendung durch FluentCRM nicht guten Sicherheitspraktiken. Der secure_hash-Wert wird einmal pro Kontakt generiert. Er wird nie aktualisiert und läuft nie ab. Dies ist problematisch, da der secure_hash-Wert in jedem Newsletter enthalten ist. Wenn ein Angreifer Zugriff auf das Postfach eines Kontakts erhält, kann der Angreifer die Einstellungen des Kontakts auf unbestimmte Zeit ändern. Wenn der betroffene Kontakt mit einem Benutzer mit Administratorrechten verknüpft ist und Änderungen der E-Mail-Adresse von FluentCRM zu WordPress synchronisiert werden, enthält jeder einzelne an diesen Kontakt gesendete Newsletter ein nie verfallendes Token zur Übernahme der Website.
Ich habe dieses verwandte Problem am 15.03.2023 an WPManageNinja gemeldet. Zwei Monate später (15.05.2023) antwortete WPManageNinja, dass ihre Sicherheitsberater das statische secure_hash-Problem nicht als Problem betrachteten. Die Sicherheitsberater von WPManageNinja sagten, es sei „in Ordnung, diese Art von einmalig generierten Token zur Identifizierung des Kontakts zu verwenden“ und dass es „API-Token von SaaS-Diensten ähnelt, die nicht an andere Kontakte übermittelt werden, sondern nur an den tatsächlichen Kontakt gesendet werden, der die E-Mail-Adresse besitzt“.
WPManageNinja war aufgeschlossen und sagte mir, ich solle Bescheid geben, wenn ich es immer noch für ein Sicherheitsproblem hielt, was ich tat. Ich erklärte, warum die secure_hash-Werte nicht mit API-Token verglichen werden können. (API-Token können nur über TLS-Verbindungen gesendet werden, und der Zugriff auf API-Token kann eingeschränkt werden. Dies ist bei Klartextwerten in E-Mails nicht der Fall. Vor allem können API-Token widerrufen werden, während es für einen Kontakt keine Möglichkeit gibt, einen secure_hash-Wert zu widerrufen.)
Später am selben Tag bedankte sich WPManageNinja bei mir und sagte, sie erwägen, die E-Mail-Datensatz-ID mit dem Hash zu kombinieren. Das wird das Problem lösen, wenn es in Verbindung mit der automatischen Widerrufung entweder alter (zeitbasierter Ablauf) oder vorheriger (zählerbasierter Ablauf) secure_hash-Werte implementiert wird. Diese Funktion wurde noch nicht implementiert, aber ich betrachte die Verwendung statischer Hash-Werte nicht als Teil dieser CVE.
Im ersten Quartal 2023 begannen wir mit der Migration von unserem vorherigen Newsletter-Tool (Sendy) zu FluentCRM. Ich fand die Sicherheitslücke während der Integration von FluentCRM in die Nikka Systems Academy (Project Opal). Da wir das Abonnementverwaltungssystem von FluentCRM durch unser eigenes benutzerdefiniertes Plugin ersetzt haben, haben die anfälligen Formulare von FluentCRM niemals unsere Website oder die Daten unserer Kunden beeinträchtigt.
FluentCRM ist ein großartiges Plugin, aber die Handhabung der Offenlegung der Sicherheitslücke durch WPManageNinja lässt viel Raum für Verbesserungen. Die folgende Liste ist mein Vorschlag, wie WPManageNinja die Situation verbessern könnte.
Trotzdem vertraue ich WPManageNinja immer noch. Es gibt Fehler in jeder Software, und ein einziger schlecht verwalteter Sicherheitslückenbericht ist kein Grund, die Nutzung ihrer Plugins einzustellen.
Update 2023-06-12: Die Tatsache, dass sie immer noch versuchten, die Sicherheitslücke in ihrem Änderungsprotokoll zu verstecken, macht mir ernsthafte Sorgen. (Sie haben die CVE jetzt hinzugefügt.)