CVE-2026-26980 en Ghost

22 de jun. de 2026

Recientemente se ha publicado un CVE de nivel crítico que afecta al Blog Ghost CMS (el mismo que yo uso)

Tras detectar en mi servidor de SoloConLinux, que en algunos artículos se ha producido un Code Injection en los que se ha incluido un script de tipo ClickFix, he procedido a detener el blog y proceder con la mitigación del CVE para que no se viese afectado ningún lector del blog.

Seguramente os habreis percatado de ello. Hoy por la tarde no se ha podido acceder al blog ya que lo he puesto en modo privado/mantenimiento.
He activado este modo durante toda la corrección del CVE.

Corrección del CVE

Las versiones de Ghost afectadas van desde la 3.24.0 (incluida), hasta la versión 6.19.1 (excluida).

Descargar imagen docker corregida

Para la corrección del CVE he tenido que subir la versión de Ghost hasta una en la que no existiese el fallo. El error es un fallo de exposición que permite acceder a la API de Ghost a usuarios no autenticados.

Al tratarse de un contenedor la migración ha sido sencilla, tan solo he descargado una version que no tuviese el error para disponer de ella inmediatamente en el proceso de reinicio del contenedor. Para ello he ejecutado:
docker pull ghost:version-deseada

Parada del Blog Ghost

Para que no se conecte nadie, ni usuarios al blog ni "indeseables" a la API, he parado el servidor Ghost, solo el servicio del blog, pero no el servidor de mysql.

Revisión de Artículos con código inyectado

He revisado y corregido los artículos en los que se había incluido mediante code-injection un script de tipo ClickFix en el "footer" de las páginas.
Dado que yo no realizo ninguna injección propia para incluir opciones extra en el blog, lo más sencillo ha sido conectarme al servidor MySQL que contiene los más de 330 artículos del Blog y eliminar cualquier valor existente en los campos permitidos para incluir codigo.
Para ello tras conectarme he ejecutado lo siguiente:

UPDATE posts 
SET codeinjection_foot = '';

Reiniciar el Blog

Antes de reniciar el blog es necesario recargar la imagen que usará el contedor, para ello, al usar docker-compose he ejecutado lo siguiente:

# Recargar imagen a usar por el blog
docker-compose pull blog-ghost
# Iniciar el conjunto de contenedores del Blog
docker-compose up -d blog-ghost

Mientras reiniciaba he ido revisando los logs:

docker-compose logs -f blog-ghost

Corrección de bloqueos en base de datos

He sufrido un "momento tenso" cuando he visto que el servicio se iniciaba y se moría a los pocos segundos...

Al tener los logs en otra terminal he podido determinar que al ser un salto muy grande entre versiones se ha producido un time-out en el proceso interno de migración.

El servicio Ghost para prevenir errores ha protegido la base de datos y la ha dejado marcada como bloqueada.

Para solucionar el problema he tenido que volver a conectarme al contenedor mysql y una vez conectado a la base de datos de ghost he escrito:

UPDATE migrations_lock SET locked = 0;

Luego simplemente volver a levantar el grupo de contenedores de ghost:

docker-compose down blog-ghost

docker-compose up -d blog-ghost
Hay que revisar los logs y si vemos aparecer algun error de bloqueo volver a ejecutar el comando SQL anterior.

He revisado los logs en el inicio del blog y he comprobado que ha finalizado la migración y se inicia correctamente el Blog.

Rotado de claves y tokens

El ultimo paso es desde el menú de Ghost, proceder a la regeneración de Tokens, cambiar las contraseñas de los usuarios staff y activar el doble factor (que ya existe en las nuevas versiones).

Ultimo Repaso

Otra consulta a la base de datos y los artículos existente en la tabla posts para comprobar que en ningún momento se ha vuelto a inyectar nada.

El script "malicioso"

En mi caso el código inyectado al final de cada artículo ha sido el siguiente:

Este script hacía que el artículo apareciese en modo borroso (blur).
Por encima mostraba una caja de texto falsa para hacer click sobre ella.
Tras el click el script copiaba al portapapeles una serie de comandos de tipo PowerShell.

Un ultimo pop-up en el que aparecía un mensaje para que el usuario abriese un cmd y pegase el contenido y pulsase intro para ejecutarlo.

Pantalla del ClickFix para que ejecutar el codigo malicioso

Disculpas a los lectores del Blog

Me gustaría disculparme con los lectores del blog, por no haber subido de versión de Ghost tan pronto salió el CVE.

Al menos os dejo un artículo sobre ello. Si disponeis de un blog con Ghost podais remediarlo vosotros mismos también.

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux