この問題の根源が埋め込みプラグインにあることを突き止めました。埋め込みを設定する際、「許可されたホスト」という設定があり、これが iframe の CSP(コンテンツセキュリティポリシー)を設定します。その結果、iframe はそのホストでのみ表示されます。例えば、example.com を許可されたホストとして設定し、attacker.com で JS を埋め込もうとすると、iframe は以下のエラーで読み込みを拒否されます。
Refused to frame 'https://forum.example.com/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self' https://example.com".
ただし、この時点で JS はすでに実行されており、埋め込みコードに指定された URL を使ってフォーラムにトピックが作成されてしまいます。
私の場合、Netlify を使ってビルドのプレビューを行っているため、ブログのコピーが実際には netlify.app の URL から提供されています。これが embed.js を読み込み、以前に誤ってインポートした投稿のフォーラムスレッドを作成してしまっていたのです。
これは必ずしもセキュリティ上の問題ではありません。設定されたウェブサイト内の URL かつパスの許可リストに一致するトピックしか作成できないからです。しかし、Discourse への古い投稿の移行時に、フォーラムスレッドに対して embed_url を設定する方法がなかったため、この移行戦略においては問題となります。
対策としては、「許可されたホスト」設定で指定されていないドメインで embed.js が実行されないようにする CSP ルールを追加することです。
概念実証として、埋め込みコードを全く関係のないドメインにコピーし、discourseEmbedUrl を以前インポートした投稿のいずれかに設定しました。ページを読み込むと iframe はブロックされましたが、JS はすでに実行され、フォーラムスレッドが作成されていました。
これがバグというよりもセキュリティ上の問題だとお考えであれば、この投稿を削除し、HackerOne を通じて報告することを喜んで行います。