Ich habe die Ursache dieses Problems mit dem Embed-Plugin gefunden. Bei der Konfiguration des Embeddings gibt es eine Einstellung „Zulässige Hosts", die daraufhin die CSP für das iframe festlegt, sodass das iframe nur auf diesem Host angezeigt wird. Wenn ich beispielsweise Embeds mit einem zulässigen Host von example.com konfiguriere und versuche, das JS auf attacker.com einzubetten, wird das iframe mit der folgenden Fehlermeldung abgelehnt:
„Das Einbetten von ‘https://forum.example.com/’ wurde verweigert, da ein Vorfahr die folgende Content-Security-Policy-Anweisung verletzt: „frame-ancestors ‘self’ https://example.com"."
In diesem Fall wurde das JS jedoch bereits ausgeführt und hat ein Thema im Forum mit der URL erstellt, die dem Embed-Code übergeben wurde.
In meinem Fall nutzen wir Netlify zur Vorschau von Builds, sodass eine Kopie des Blogs tatsächlich von netlify.app-URLs bereitgestellt wird. Diese lädt dann die embed.js und erstellt die Foren-Threads für die Beiträge, die ich zuvor fehlerhaft importiert hatte.
Dies ist nicht unbedingt ein Sicherheitsproblem, da weiterhin nur Themen für URLs erstellt werden können, die auf der konfigurierten Website liegen und mit der Pfad-Whitelist übereinstimmen. Es ist jedoch ein Problem bei dieser Migrationsstrategie, da ich beim Migrieren alter Beiträge in Discourse keine Möglichkeit hatte, die embed_url für die Foren-Themen festzulegen.
Die Lösung besteht darin, eine CSP-Regel hinzuzufügen, um zu verhindern, dass embed.js auf Domains ausgeführt wird, die nicht unter der Einstellung „Zulässige Hosts" konfiguriert sind.
Als Proof of Concept habe ich den Embed-Code auf eine völlig unrelated Domain kopiert und die discourseEmbedUrl auf einen der von mir importierten alten Beiträge gesetzt. Beim Laden der Seite wurde das iframe blockiert, aber das JS war bereits ausgeführt worden und hatte den Foren-Thread erstellt.
Wenn Sie dies eher als Sicherheitsproblem denn als Fehler betrachten, bin ich gerne bereit, diesen Beitrag zu löschen und ihn stattdessen über HackerOne zu melden.