UnrealIRCd: inyección de comandos explotada en la naturaleza (CVE-2026-114713)
Un fallo de escape en el tag label permite a un usuario de UnrealIRCd ejecutar comandos de servidor; corregido en 6.2.7.1 y explotado en la naturaleza.
Resumen
- Un fallo de escape en el módulo labeled-response de UnrealIRCd permite a cualquier usuario ordinario inyectar comandos de servidor a servidor que se ejecutan con la autoridad del servidor. UnrealIRCd publicó 6.2.7.1 y un parche en caliente el 7 de noviembre de 2026.
- Todos los servidores UnrealIRCd 6.0.0 a 6.2.7 que cargan el módulo, algo que hace la configuración predeterminada, están expuestos cuando la red tiene dos o más servidores enlazados.
- El registro CVE lo califica como CVSS v3.1 8.6 Alta. El catálogo Known Exploited Vulnerabilities (KEV) de CISA lo añadió el 13 de noviembre de 2026, y su registro Stakeholder-Specific Vulnerability Categorization (SSVC) marca la explotación como activa.
- Actualice a 6.2.7.1 o aplique el parche en caliente del proveedor y verifique la versión del módulo. Consulte "¿Cómo lo corrijo?" para el rodeo SPAMFILTER.
¿Estoy afectado?
Está expuesto cuando se cumplen todas estas condiciones:
- El servidor ejecuta UnrealIRCd 6.0.0 a 6.2.7, o una versión 5.x al final de su vida útil.
- El módulo
labeled-responseestá cargado. El archivomodules.default.confpredeterminado lo carga. - La red tiene dos o más servidores enlazados. El CVE describe la ejecución de comandos con la autoridad del servidor en esa topología.
- Un usuario ordinario puede conectarse y enviar tags de mensaje IRCv3.
Un servidor único y no enlazado no retransmite la línea inyectada a un par, por lo que la ruta de autoridad de servidor del CVE no se aplica. Actualice de todos modos: 6.2.7.1 también corrige otros ocho problemas, incluidos dos fugas de direcciones IP.
| Rama | Versiones afectadas | Versión corregida |
|---|---|---|
| 6.x | 6.0.0 a 6.2.7 | 6.2.7.1 |
| 5.x | Todas las versiones (fin de vida desde el 2023-07-01) | Ninguna; actualizar a 6.2.7.1 |
Compruebe la versión en ejecución y el estado del módulo:
# Version of the running server
./unrealircd version
# Is the module loaded, and at which version?
./unrealircd module-status | grep labeled-response
La línea del módulo indica el estado del parche. labeled-response 5.0 significa que el servidor no está corregido. labeled-response 5.0-hot-patch-bundle-20261107 o labeled-response 6.2.7.1 significa que sí lo está.
¿Cómo lo corrijo?
Actualice a 6.2.7.1 o aplique el parche en caliente sin reiniciar, y después verifique la línea del módulo.
- Aplique el SPAMFILTER temporal del proveedor en la red. Ejecútelo como IRCOp en cada servidor:
SPAMFILTER add -regex T block - Invalid_label ^label=(?![^\r\n;\x20]*\z). Bloquea los labels que contienen un retorno de carro, un salto de línea, un punto y coma o un espacio, y solo funciona cuando todos los servidores ejecutan 6.0.4 o una versión posterior. - En cada servidor, ejecute
./unrealircd hot-patch bundle-20261107. La última línea debe indicar que el parche se instaló y que el servidor se rehashó correctamente. - O actualice con
./unrealircd upgradey reinicie. Los usuarios de Windows descargan 6.2.7.1 desde el sitio del proveedor. - Verifique con
./unrealircd module-status | grep labeled-response. La salida debe nombrar el bundle del parche en caliente o 6.2.7.1. - Retire el SPAMFILTER cuando todos los servidores estén corregidos.
Para las versiones 5.x al final de su vida útil, añada blacklist-module "labeled-response"; a la configuración de cada servidor y reinícielos, no solo los rehaga. UnrealIRCd 5 está al final de su vida útil desde el 2023-07-01 y no recibe correcciones.
El parche en caliente cubre los nueve problemas de la versión. Si falla, las preguntas frecuentes del proveedor sobre el parche en caliente describen los casos de actualización de distribución y de compilación. La actualización a 6.2.7.1 es la alternativa.
¿Cuál es la causa raíz?
El servidor copiaba el tag de mensaje IRCv3 label en un búfer de tamaño fijo. Después lo formateaba en las respuestas sin escapar los delimitadores que separan tags, parámetros y líneas.
En UnrealIRCd 6.2.7, lr_pre_command() copia el valor del tag con strlcpy en currentcmd.label. La única validación está en labeled_response_mtag_is_ok(). Comprueba que el valor no esté vacío, que el cliente admita las capacidades labeled-response y batch, y que el valor tenga 64 bytes o menos.
int lr_pre_command(Client *from, MessageTag *mtags, const char *buf)
{
lr_clear();
if (IsServer(from))
return 0;
for (; mtags; mtags = mtags->next)
{
if (!strcmp(mtags->name, "label") && mtags->value)
{
strlcpy(currentcmd.label, mtags->value, sizeof(currentcmd.label));
currentcmd.client = from;
break;
}
}
return 0;
}
gen_start_batch() escribe después el label en @label=%s :%s BATCH +%s labeled-response con snprintf. lr_post_command() hace lo mismo en su ruta de respuesta única:
snprintf(packet, sizeof(packet) - 3,
"@label=%s%s%s",
currentcmd.label,
more_tags ? ";" : " ",
more_tags ? currentcmd.firstbuf + 1 : currentcmd.firstbuf);
En IRC, un mensaje se compone de una sección de tags, una fuente, un comando y parámetros. Los delimitadores funcionan así:
- Un punto y coma separa los tags.
- Un espacio termina la sección de tags.
- Un retorno de carro o un salto de línea termina el mensaje.
Un label que contiene uno de esos bytes cambia por tanto la estructura de la respuesta que construye UnrealIRCd. El label también se copia en la respuesta ACK mediante la biblioteca de tags de mensaje. Esa biblioteca usa el mismo valor sin escapar.
¿Cómo se explota?
- El atacante se conecta a cualquier servidor de la red como usuario ordinario, con un cliente capaz de enviar tags IRCv3.
- El atacante envía un comando con un tag
labelcuyo valor contiene un separador de tag, un espacio o un salto de línea. El servidor lo acepta porque la validación solo comprueba la longitud y las capacidades del cliente. - UnrealIRCd copia el label en el inicio de
BATCH, en la respuestaACKo en la respuesta única que almacena para ese comando. - Los delimitadores dividen el texto generado en tags, parámetros o un segundo mensaje IRC adicional.
- La respuesta cruza un enlace de servidor. El par analiza el mensaje adicional como un comando de servidor a servidor de un enlace de confianza, así que lo ejecuta con la autoridad del servidor.
No hace falta código de exploit público para explicar el fallo, y aquí no se enlaza ninguno. El proveedor indica que cualquier usuario ordinario puede KILL, GLINE y hacer muchas otras cosas. El registro de CISA marca la explotación como activa, así que la técnica está en uso.
¿Cómo se desarrolla el ataque?
Un usuario ordinario coloca delimitadores de tag y de línea en un label. UnrealIRCd copia el label en una respuesta sin escaparlo, y el servidor par ejecuta el comando inyectado como si fuera de un servidor de confianza.
con un tag label manipulado"] --> B["El módulo copia el label
sin comprobar delimitadores"] B --> C["La respuesta se construye
como @label=<valor> ..."] C --> D["Los delimitadores dividen la respuesta
en tags o en una segunda línea"] D --> E["La respuesta cruza un enlace de servidor"] E --> F["El par ejecuta la línea inyectada
con la autoridad del servidor"] F --> G["KILL, GLINE y otros
comandos de servidor se ejecutan"]
¿Qué puede hacer un atacante?
Un usuario ordinario puede ejecutar comandos que solo un servidor o un IRCOp debería ejecutar, incluidos KILL y GLINE contra otros usuarios y canales.
El impacto exige todas estas condiciones:
- El servidor ejecuta una versión afectada y carga
labeled-response. - La red tiene dos o más servidores enlazados, para que un par analice la línea inyectada como un comando de servidor.
- El atacante puede conectarse como usuario ordinario. No necesita una cuenta en el servidor ni estatus de operador.
- El atacante puede enviar tags IRCv3. Un socket directo o un cliente con scripts basta.
El proveedor describe el problema como el más crítico de UnrealIRCd en 15 años. El registro SSVC de CISA indica impacto técnico total y explotación automatizable. El registro CVE solo califica el impacto en la integridad (C:N/I:H/A:N); los impactos en disponibilidad y confidencialidad dependen de los comandos que ejecute el atacante.
¿Por qué funciona la corrección?
La corrección rechaza cualquier label que contenga un espacio, un punto y coma, una barra invertida, un retorno de carro o un salto de línea. El valor ya no puede cambiar la estructura de la respuesta.
El commit de corrección 05b5f5fdc8bb añade una comprobación a labeled_response_mtag_is_ok():
int labeled_response_mtag_is_ok(Client *client, const char *name, const char *value)
{
if (BadPtr(value))
return 0;
+ if (strpbrk(value, " ;\\\r\n"))
+ return 0;
+
if (IsServer(client))
return 1;
La comprobación se ejecuta antes de la rama de servidor, así que también se aplica a los tags que llegan de un servidor enlazado. Cada ruta de respuesta que usa currentcmd.label recibe ahora un valor sin separador de tag, sin separador de parámetro y sin salto de línea. Eso cubre el inicio del batch, la respuesta ACK y el búfer de respuesta única.
El proveedor entregó el mismo cambio en 6.2.7.1 y en el bundle del parche en caliente. La corrección es completa para este CVE; los otros ocho problemas de la versión son cambios distintos.
¿Cómo compruebo si estuve comprometido?
No se han publicado indicadores de compromiso. CISA marca la explotación como activa, pero ni el proveedor ni CISA han publicado patrones de solicitudes, recuentos de víctimas ni firmas de registros para este CVE.
Compruebe primero el estado del parche, porque un servidor sin corregir es la exposición:
./unrealircd module-status | grep labeled-response
./unrealircd version
Después revise los registros del servidor en busca de los efectos que nombra el proveedor:
- Comandos KILL, GLINE, SVS* y otros comandos de servidor que no emitieron un IRCOp ni un enlace de servidor conocido.
- Desconexiones de enlaces de servidor o errores de protocolo en el mismo momento.
- Cambios de configuración o de listas de baneos que no hizo ningún operador.
Los registros de UnrealIRCd varían según la compilación y el nivel de registro, y un intento bloqueado puede no dejar rastro. El SPAMFILTER registra las coincidencias cuando bloquea un label; busque su mensaje de bloqueo si el filtro estaba activo.
Cronología
- 2026-11-04: se redacta el commit de corrección
05b5f5fdc8bb. - 2026-11-07: UnrealIRCd publica 6.2.7.1 y el parche en caliente
bundle-20261107a las 15:00 UTC. - 2026-11-08: se publica el registro CVE y el proveedor envía el aviso a la lista de correo oss-security.
- 2026-11-12: el registro SSVC de CISA marca la explotación como activa.
- 2026-11-13: CISA añade CVE-2026-114713 al catálogo KEV, con fecha límite 2026-11-16.
Preguntas frecuentes
¿Se explota CVE-2026-114713 en la naturaleza?
Sí. CISA lo añadió al catálogo KEV el 13 de noviembre de 2026, y su registro SSVC marca la explotación como activa a fecha del 12 de noviembre. El aviso del proveedor describe el impacto pero no nombra una campaña ni una víctima.
¿El rodeo SPAMFILTER corrige el problema por completo?
No. Bloquea la inyección crítica del label solo cuando todos los servidores de la red ejecutan 6.0.4 o una versión posterior. No corrige los otros ocho problemas de 6.2.7.1, y es un filtro temporal, no un parche.
Ejecuto UnrealIRCd 5. ¿Qué hago?
UnrealIRCd 5 está al final de su vida útil desde el 2023-07-01 y está afectado por el problema crítico. Añada blacklist-module "labeled-response"; en cada servidor y reinicie, y después pase a 6.2.7.1. El proveedor indica que las otras versiones al final de su vida útil no se comprobaron y probablemente también están afectadas.
¿Está expuesto un servidor único?
El CVE describe la ejecución de comandos con la autoridad del servidor en una red con dos o más servidores enlazados. Un servidor único y no enlazado no retransmite la línea inyectada a un par, así que esa ruta no se aplica. Actualice de todos modos, porque 6.2.7.1 corrige otros ocho problemas.
¿Cómo verifico el parche en caliente?
Ejecute ./unrealircd module-status | grep labeled-response. La línea debe mostrar labeled-response 5.0-hot-patch-bundle-20261107 o labeled-response 6.2.7.1. Una simple línea labeled-response 5.0 significa que el parche no está instalado.
Referencias
- Registro CVE-2026-114713, CNA MITRE, publicado el 2026-11-08, CVSS v3.1 8.6, CWE-140 y el bloque SSVC del CISA ADP: https://www.cve.org/CVERecord?id=CVE-2026-114713 (consultado el 14 de noviembre de 2026)
- UnrealIRCd, "UnrealIRCd 6.2.7.1 released and hot-patch to fix 9 security issues", 7 de noviembre de 2026, el texto del aviso y la lista completa de problemas: https://www.openwall.com/lists/oss-security/2026/11/08/1 (consultado el 14 de noviembre de 2026)
- Índice de noticias de UnrealIRCd, la fecha de publicación, la cuota de mercado del 38 % y las instrucciones del parche en caliente: https://www.unrealircd.org/index/news (consultado el 14 de noviembre de 2026)
- Commit de corrección
05b5f5fdc8bb, "Fix CRITICAL issue where anyone could execute commands as server/IRCOp", 4 de noviembre de 2026: https://github.com/unrealircd/unrealircd/commit/05b5f5fdc8bb (consultado el 14 de noviembre de 2026) - Código fuente de UnrealIRCd 6.2.7, la copia no validada del label en
src/modules/labeled-response.cy los constructores de respuesta: https://github.com/unrealircd/unrealircd/blob/59546a20f6c9b0dae1646727acf74b4b744e9b09/src/modules/labeled-response.c (consultado el 14 de noviembre de 2026) - Lista de módulos predeterminados de UnrealIRCd,
labeled-responsecargado por defecto: https://github.com/unrealircd/unrealircd/blob/unreal60_dev/doc/conf/modules.default.conf (consultado el 14 de noviembre de 2026) - Catálogo Known Exploited Vulnerabilities de CISA, CVE-2026-114713 añadido el 2026-11-13 con fecha límite 2026-11-16: https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json (consultado el 14 de noviembre de 2026)