Bug beschreiben
Wenn Discourse als DiscourseConnect-Anbieter (SSO-Anbieter) verwendet wird, wird die E-Mail-Adresse des Benutzers in der 302-Weiterleitungs-URL an die vertrauende Partei offengelegt. Dies geschieht, weil die Methode populate_user_data in lib/second_factor/actions/discourse_connect_provider.rb immer die E-Mail-Adresse setzt:
def populate_user_data(sso)
sso.name = current_user.name
sso.username = current_user.username
sso.email = current_user.email # <-- Wird immer eingeschlossen
sso.external_id = current_user.id.to_s
# ...
end
Diese E-Mail wird dann Base64-kodiert und in die Weiterleitungs-URL aufgenommen:
https://zielseite.com/callback?sso=<base64_payload>&sig=<hmac_signature>
Beim Dekodieren der Base64-Nutzlast wird die E-Mail-Adresse im Klartext sichtbar.
Auswirkungen
- Browserverlauf: E-Mail wird im Browserverlauf gespeichert
- Nginx-Protokolle: Die vollständige URL wird in den Nginx-Zugriffsprotokollen protokolliert
- Protokolle der Zielseite: Die vertrauende Partei erhält die E-Mail ohne ausdrückliche Zustimmung des Benutzers
- Erwartung des Benutzers: Benutzer stimmen normalerweise zu, um zu beweisen, „dass ich ein legitimer Benutzer bin“ – sie erwarten nicht, dass ihre E-Mail-Adresse weitergegeben wird
Erwartetes Verhalten
Benutzer sollten kontrollieren können, ob ihre E-Mail-Adresse an die vertrauende Partei weitergegeben wird. Es sollte eine Konfigurationsoption geben, ähnlich wie bei discourse_connect_overrides_groups, discourse_connect_overrides_avatar usw.
Derzeit gibt es keine Site-Einstellung, um dieses Verhalten zu deaktivieren. Das Schreiben eines Plugins zur Umgehung dieses Verhaltens ist möglich, aber nicht ideal.
Reproduktionsschritte
enable_discourse_connect_provideraktivierendiscourse_connect_provider_secretskonfigurieren (z. B. *.example.com|secret123)- Einen Benutzer über den DiscourseConnect-Anbieter authentifizieren lassen
- Die 302-Weiterleitungs-URL überprüfen – die E-Mail ist in den URL-Parametern sichtbar
Die Weiterleitungs-URL sieht ungefähr so aus:
https://vertrauende-partei.com/sso?sso=bm9uY2U9xxx&sig=xxx
Beim Dekodieren des sso-Parameters wird Folgendes angezeigt:
nonce=xxx&return_sso_url=xxx&email=user@example.com&external_id=123
Umgebung
- Discourse-Version: (neueste)
- Selbst gehostet
Mögliche Korrekturvorschläge
- Eine Site-Einstellung wie
discourse_connect_provider_includes_emailhinzufügen (Standard:truezur Abwärtskompatibilität), um zu steuern, ob die E-Mail in der Antwort enthalten ist - Oder einen POST-basierten Rückruf anstelle einer GET-302-Weiterleitung implementieren, um die Protokollierung der URL zu vermeiden