Incrustar comentarios de Discourse en otro sitio web mediante Javascript

Acabo de rastrear el origen de este problema con el plugin de incrustación (embed). Al configurar la incrustación, existe una configuración llamada “Hosts permitidos”, que luego establece la Política de Seguridad de Contenido (CSP) para el iframe, de modo que el iframe solo se mostrará en ese host. Por ejemplo, si configuro las incrustaciones con un host permitido de example.com e intento incrustar el JS en attacker.com, el iframe se niega a cargar con el siguiente error:

Se ha denegado la carga del marco 'https://forum.example.com/' porque un ancestro viola la siguiente directiva de Política de Seguridad de Contenido: "frame-ancestors 'self' https://example.com".

Sin embargo, en este punto, el JS ya se ha ejecutado y ha creado un tema en el foro con la URL que se proporcionó al código de incrustación.

Lo que está ocurriendo en mi caso es que utilizamos Netlify para previsualizar las compilaciones, por lo que una copia del blog se está sirviendo realmente desde URLs de netlify.app, las cuales cargan ese embed.js y crean el hilo del foro para las publicaciones que importé incorrectamente con anterioridad.

Esto no es necesariamente un problema de seguridad, ya que solo puede crear temas para URLs del sitio web configurado y que coincidan con la lista de permitidos de rutas. Sin embargo, es un problema en esta estrategia de migración, ya que no tenía forma de establecer el embed_url en los hilos del foro al migrar publicaciones antiguas a Discourse.

La solución consiste en agregar una regla CSP para evitar que ese embed.js se ejecute en dominios que no estén configurados bajo la configuración de “hosts permitidos”.

Como prueba de concepto, copié el código de incrustación a un dominio completamente ajeno y establecí el discourseEmbedUrl en una de las publicaciones antiguas que importé. Cargué la página y el iframe fue bloqueado, pero el JS ya se había ejecutado y había creado el hilo del foro.

Si consideras que esto es más un problema de seguridad que un error, estaré encantado de eliminar esta publicación e informarlo a través de HackerOne.

2 Me gusta