Ho appena individuato la fonte di questo problema con il plugin embed. Durante la configurazione dell’embedding, esiste un’impostazione “Allowed Hosts” (Host consentiti), che imposta quindi la CSP per l’iframe; l’iframe verrà visualizzato solo su tale host. Ad esempio, se configuro gli embed con un host consentito come example.com e provo a incorporare lo script JS su attacker.com, l’iframe rifiuta di caricarsi con l’errore:
Refused to frame 'https://forum.example.com/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self' https://example.com".
Tuttavia, in questo punto lo script JS è già stato eseguito e ha creato un argomento sul forum con l’URL fornito al codice di embedding.
Nel mio caso, ciò che sta accadendo è che utilizziamo Netlify per l’anteprima delle build, quindi una copia del blog viene effettivamente servita da URL netlify.app, che carica poi quel embed.js e crea il thread del forum per i post che avevo importato in precedenza in modo errato.
Non si tratta necessariamente di un problema di sicurezza, poiché è comunque possibile creare argomenti solo per gli URL del sito configurato e che corrispondono alla lista bianca dei percorsi. Tuttavia, è un problema in questa strategia di migrazione, dato che non avevo modo di impostare embed_url sui thread del forum durante la migrazione dei vecchi post in Discourse.
La soluzione consiste nell’aggiungere una regola CSP per impedire che embed.js venga eseguito su domini non configurati nell’impostazione “allowed hosts”.
Come prova di concetto, ho copiato il codice di embedding su un dominio completamente non correlato e ho impostato discourseEmbedUrl su uno dei vecchi post che avevo importato. Ho caricato la pagina e l’iframe è stato bloccato, ma lo script JS era già stato eseguito e aveva creato il thread del forum.
Se ritieni che si tratti più di un problema di sicurezza che di un bug, sono felice di eliminare questo post e segnalarlo tramite HackerOne.