Benutzer können IPs anderer Benutzer über Chat-Plugin entdecken (Hotlinking-Schutz beheben)

(Zuvor über Sicherheitskanäle gemeldet, wurde abgelehnt, jetzt öffentliche Offenlegung nach einem Prozess der verantwortungsvollen Offenlegung)

Zusammenfassung / Anfrage

Als Benutzer möchte ich, dass die über Hotlinks geposteten Bilder im Chat vom Server zwischengespeichert und erst dann angezeigt werden, um meine IP vor einem böswilligen Drittanbieter-Bildhosting-Server zu schützen. Ich möchte das zwischengespeicherte/proxy-Bild trotzdem sehen!

Discourse hat bereits Einstellungen dafür, aber sie werden im Chat nicht korrekt angewendet. Wenn beide relevanten Hotlinking-Einstellungen (unten) aktiviert sind, sollte dies die gleiche Funktion wie im Forum haben. D.h.: Das von Drittanbietern gehostete Bild wird auf den Server heruntergeladen und erst dann dem Benutzer angezeigt.

Hintergrund / Auswirkungen

In den alten Tagen der Internetforen war es sehr beliebt, Benutzern das Posten von Bilder-Einbettungen durch “Hotlinking” zu Drittanbieter-Servern zu ermöglichen, die die Bilder hosteten.

Während dies bei älteren Foren sehr üblich war, haben wir im Zuge der Weiterentwicklung des Internets gelernt, dass dies eine schlechte Praxis ist. Fast alle Social-Media-Plattformen haben sich weiterentwickelt, um dies zu verhindern. Ein Teil des Grundes war, Probleme mit kaputten/verlorenen Bildern oder überlasteten kleinen Servern zu vermeiden, aber es gibt auch eine sehr wichtige Sicherheitsüberlegung:

Ein Benutzer, der ein Bild von einem externen Server postet, lädt dieses vom verknüpften Server herunter. Dies ermöglicht es einem böswilligen Drittanbieter-Server, die IP-Adresse des Benutzers zu protokollieren. Dies ist sehr problematisch, da ein böswilliger Benutzer, wenn der Server von ihm betrieben wird, nun die IP-Adresse des anderen Benutzers kennt. (Stellen Sie sich einen Fall vor, in dem ein böswilliger Benutzer Sie kontaktiert, um Ihre Heim-IP herauszufinden)

Eine geleakte IP kann von einer böswilligen Person verwendet werden, um die wahre Identität des Benutzers zu ermitteln oder ihren Heimrouter/PC auf Schwachstellen zu scannen usw. Sie könnten damit sogar ein XSS auf einer anderen Seite durchführen, wenn die andere Seite XSS-Schwachstellen aufweist.

Deshalb machen fast alle großen sozialen Netzwerke (Twitter, Discord, Facebook usw.) aus Sicherheitsgründen kein Image-Hotlinking mehr. Jedes Drittanbieterbild wird jetzt auf dem Server zwischengespeichert, anstatt dass der Benutzer es direkt abruft.

Relevante Discourse-Einstellungen

Discourse bietet zwei relevante Einstellungen:

Block hotlinked media (Hotlinked-Medien blockieren) ersetzt Hotlinked-Bilder durch einen Textlink.

Download remote images to local (Remote-Bilder lokal herunterladen) konvertiert Hotlinked-Bilder in lokal gespeicherte Bilder.

Verhalten der Einstellungen im Forum

:white_check_mark: Wenn beide Einstellungen aktiviert sind, scheint das Forum bei meinen begrenzten Tests wie erwartet zu funktionieren. Externe Bilder werden in lokale Bilder konvertiert, bevor sie anderen Benutzern angezeigt werden, wodurch die IP des Benutzers geschützt wird. Ich habe keine umfangreichen Timing-Angriffe durchgeführt, um das Verhalten zu überprüfen, aber zumindest bei meinen begrenzten Tests funktionierte es korrekt.

(Dies ist das, was ich von jeder modernen sozialen Plattform erwarten würde, ähnlich dem Verhalten auf Twitter/Discord/Facebook usw.)

Verhalten der Einstellungen im Chat

Im Chat konnte ich kein ähnliches Verhalten erzielen. Keine Kombination von Einstellungen liefert zufriedenstellende Ergebnisse:

:cross_mark: Wenn beide Einstellungen aktiviert sind, wird das Remote-Bild nur in einen Link umgewandelt. Es gibt jedoch ein sehr kurzes Zeitfenster, in dem das Bild dem anderen Benutzer immer noch angezeigt wird und somit eine Webanfrage ausgelöst wird, die die Benutzer-IP dem anderen Benutzer preisgibt. Dies ist im Grunde das schlechteste Ergebnis, da die Benutzer-IP preisgegeben wird und man das Bild nicht einmal sehen kann.

:cross_mark: Wenn Block hotlinked media deaktiviert und Download remote images to local aktiviert ist, wird einfach ein Hotlink erstellt; es schien nicht tatsächlich das Remote-Bild herunterzuladen. Keine Schwachstelle, aber es scheint ein Fehler zu sein.

:cross_mark: Wenn Block hotlinked media aktiviert und Download remote images to local deaktiviert ist, hat dies das gleiche Verhalten wie wenn beide aktiviert sind. Es wird als Link anstelle eines Bildes angezeigt – aber das Bild wird manchmal vom Remote-Client abgerufen, wodurch die IP preisgegeben wird. (Ich habe festgestellt, dass manchmal beim ersten Senden des Bildes es blockiert wurde, aber beim zweiten Mal kurzzeitig nicht, oder andere wahrscheinlich timingbedingte Probleme traten häufig auf.)

(Erneut getestet auf einem Entwicklungs-Checkout von git heute: 3.5.0.beta8-dev (2c0635ee4c))

Offenlegung / Antwort

Ich habe dies bereits zuvor (im Jahr 2024) per E-Mail und HackerOne gemeldet, aber mir wurde gesagt, dass es sich nicht um ein Sicherheitsproblem handele und der Sicherheitsbericht (2844784) leider abgelehnt wurde. Hier war die relevante Aussage:

Vielen Dank für Ihren Bericht. Nach sorgfältiger Prüfung schließen wir diesen, da das beschriebene Verhalten eine Standardfunktionalität des Webs und keine Sicherheitslücke darstellt.

Wenn ein Browser eine externe Ressource (Bilder, Skripte usw.) lädt, sendet er zwangsläufig eine Anfrage an den Hosting-Server. Dieser Server sieht natürlich die anfragende IP-Adresse – dies ist grundlegend für die Funktionsweise des Internets und wird für sich genommen nicht als Sicherheitslücke betrachtet. Obwohl IP-Adressen in einigen Kontexten als personenbezogene Daten betrachtet werden können, ist ihre Offenlegung durch Standard-Webanfragen ein erwartetes Verhalten, das Benutzer beim Surfen im Internet implizit akzeptieren.

Der Hotlinking-Schutz in Discourse soll die unbefugte Wiederverwendung von gehosteten Inhalten verhindern, nicht die IP-Adressen von Benutzern vor externen Servern verbergen.

Dies mag durchaus der beabsichtigte Anwendungsfall der Funktion zum Blockieren von Hotlinks sein, aber ich denke, dass die Nichtbehebung dieses Problems die Benutzer des Chat-Plugins gefährdet – insbesondere in lebhafteren Communities, in denen Benutzer versuchen könnten, die Heim-IP eines Gegners herauszufinden und ihn zu doxxen/DDOSen.

Ich widerspreche auch der Vorstellung, dass Benutzer im modernen Zeitalter implizit zustimmen, nicht vertrauenswürdige Hotlink-URLs auf einer vertrauenswürdigen Forum-Website aufzurufen. Ich werde keine Kommentare zu GDPR/etc.-Implikationen abgeben, da ich sie nicht kenne, aber rein aus grundlegender Datenschutzerwartung ist dies außer bei sehr alten Foren nicht zu erwarten. Definitiv nicht bei modernen Foren.

Ich habe meine Absicht, öffentlich in diesem Forum über das Problem zu posten, am 22. November 2024 mitgeteilt und seitdem nichts mehr gehört.

Ich poste hier, damit andere Discourse-Administratoren informiert sind und hoffentlich die Verbesserung des Hotlinking-Schutzes durch das Engineering-Team ermutigt wird. Da es lange her ist und keine Verbesserung stattgefunden hat, poste ich in gutem Glauben in der Hoffnung, dass Bewusstsein und vielleicht Ermutigung durch die Community zur Bedeutung des Problems zu Verbesserungen führen werden.


Danke fürs Lesen :slight_smile:

3 „Gefällt mir“

Vielen Dank für den detaillierten Bericht. Das Team wird sich dies in den nächsten Wochen ansehen und prüfen, was zur Abschottung dieses Vektors erforderlich ist.

Ich stimme zu, dass die Website-Einstellung produktübergreifend gleichmäßig funktionieren und nicht auf Themen beschränkt sein sollte.

2 „Gefällt mir“