Cuando se identifica una biblioteca potencialmente vulnerable en un servidor, la primera reacción suele ser desinstalarla. Pero ese remedio puede romper dependencias, dejar sin actualizaciones al sistema o interrumpir procesos que sí son necesarios.

Con CVE-2026-111497, el problema está en un decodificador Brotli que podría corromper memoria al procesar un flujo comprimido malformado. Tener Brotli instalado no basta para afirmar que el servidor sea explotable: importa qué procesos lo cargan y si descomprimen datos controlados por terceros. La explicación de la vulnerabilidad, las versiones afectadas y la corrección definitiva están en el artículo principal sobre CVE-2026-111497.

Esta guía desarrolla otra parte del problema: cómo reducir una superficie de ejecución innecesaria sin dañar el sistema de actualizaciones. Se basa en una intervención real descrita de forma anonimizada, sin identificar el proveedor de infraestructura, los proyectos alojados ni las características que permitirían reconocer el entorno.

Los dos servicios que conviene distinguir

fwupd: firmware, no paquetes ordinarios

fwupd es un servicio que permite consultar e instalar actualizaciones de firmware en dispositivos compatibles: por ejemplo, componentes UEFI y determinados periféricos. Puede utilizarse desde herramientas gráficas o desde la terminal con fwupdmgr, y expone funciones mediante D-Bus.

No es el mecanismo que instala correcciones habituales de OpenSSL, Python o los paquetes de Ubuntu. En muchas máquinas virtuales genéricas no hay firmware físico actualizable desde el sistema invitado, aunque no debe suponerse que fwupd es inútil en todas las VM: hay que comprobar si algún dispositivo admitido o flujo operativo depende de él.

packagekitd: interfaz común para gestionar software

packagekitd es el proceso del servicio PackageKit. Ofrece a otras aplicaciones una interfaz D-Bus para consultar, instalar y actualizar paquetes. Una tienda gráfica de aplicaciones puede usarlo como intermediario.

PackageKit no es APT. APT es el gestor de paquetes empleado directamente por Ubuntu; PackageKit es una capa adicional que puede apoyarse en él. En un servidor administrado exclusivamente por terminal y automatizaciones, es posible que esa capa no se necesite.

Esta distinción es fundamental: bloquear PackageKit no significa bloquear el comando apt ni las actualizaciones automáticas nativas de Ubuntu.

¿Qué son APT y unattended-upgrades?

APT permite descargar, instalar y actualizar paquetes de los repositorios configurados. Un administrador puede usar apt update o apt upgrade para mantenimiento manual.

unattended-upgrades automatiza la instalación de las actualizaciones permitidas por la configuración del sistema, especialmente parches de seguridad. En instalaciones habituales de Ubuntu Server intervienen dos temporizadores de systemd:

ComponenteResponsabilidad
apt-daily.timerPrograma la actualización de listas de paquetes y tareas periódicas de APT.
apt-daily-upgrade.timerPrograma la ejecución del mecanismo periódico de actualización.
unattended-upgradesSelecciona e instala actualizaciones según orígenes y políticas configurados.
fwupdGestiona actualizaciones de firmware compatibles; no reemplaza a APT.
PackageKit / packagekitdExpone gestión de software para aplicaciones mediante D-Bus; no reemplaza a APT.

Los temporizadores activos no garantizan por sí solos que se estén instalando parches. También hay que revisar la configuración, los orígenes autorizados y los registros de ejecución. Asimismo, una actualización de kernel puede dejar pendiente un reinicio.

Por qué no bastó con detener los procesos

En systemd estas operaciones son diferentes:

  • stop: detiene el proceso en ese momento; algo podría arrancarlo después.
  • disable: elimina su activación automática habitual; no impide que una dependencia o una petición de D-Bus lo vuelva a activar.
  • mask: bloquea la activación de la unidad por systemd, incluso ante solicitudes indirectas, hasta que se retire ese bloqueo.

Tanto fwupd como PackageKit pueden activarse bajo demanda mediante D-Bus, el sistema de comunicación entre procesos de Linux. Por eso, detener un daemon y observarlo ausente durante un minuto no es una mitigación estable cuando otro componente puede solicitarlo inmediatamente después.

En el caso estudiado se enmascararon los servicios de firmware y PackageKit, se desactivó el temporizador de refresco de firmware y se bloqueó el componente de actualizaciones offline asociado a PackageKit. APT y los temporizadores de actualizaciones automáticas se conservaron. No se desinstaló ninguna biblioteca compartida ni se sustituyó libbrotli1 a mano.

Una secuencia prudente de mitigación

1. Inventariar antes de cambiar. Identificar los nombres reales de las unidades en la distribución y verificar dependencias, tareas programadas y herramientas que puedan usarlas:

systemctl list-unit-files '*fwupd*' '*packagekit*' 'apt-daily*'
systemctl list-timers --all
dpkg-query -W libbrotli1 fwupd packagekit unattended-upgrades 2>/dev/null
apt-cache policy libbrotli1

2. Comprobar si los servicios son necesarios. Si existe un actualizador gráfico, integración con firmware o automatización de PackageKit, deshabilitarlo podría romper una función esperada. Tener pocos usuarios o estar en una VM no es prueba suficiente.

3. Aplicar un bloqueo selectivo durante una ventana de mantenimiento. Una vez confirmada la prescindibilidad, en sistemas donde existan esas unidades los comandos pueden ser, a modo de ejemplo:

sudo systemctl mask --now fwupd.service packagekit.service
sudo systemctl disable --now fwupd-refresh.timer
sudo systemctl mask --now packagekit-offline-update.service

Los nombres y la existencia de las unidades cambian entre distribuciones y versiones. Verifica cada unidad antes de ejecutar comandos; no copies la secuencia indiscriminadamente. Enmascarar afecta a programas que dependan de esos servicios, pero no desinstala sus paquetes.

4. Comprobar que APT sigue sano y que la actualización automática no fue deshabilitada:

apt-get -s upgrade
systemctl list-timers --all 'apt-daily*'
systemctl is-enabled apt-daily.timer apt-daily-upgrade.timer
apt-config dump | grep -E 'APT::Periodic|Unattended-Upgrade'
sudo tail -n 40 /var/log/unattended-upgrades/unattended-upgrades.log

La simulación de APT valida la resolución de paquetes en ese momento: no confirma que una instalación real vaya a completarse ni que unattended-upgrades ya haya instalado el último parche. Comprueba también que las opciones periódicas estén habilitadas y que los logs correspondan a ejecuciones recientes.

5. Verificar y seguir monitorizando. Revisar el estado de las unidades y confirmar que no se ejecutan los dos daemons:

systemctl is-enabled fwupd.service packagekit.service
systemctl is-active fwupd.service packagekit.service
pgrep -a -x fwupd
pgrep -a -x packagekitd

Una búsqueda puntual sin procesos encontrados solo prueba su ausencia en ese instante. No descarta otros consumidores de Brotli, incluidos runtimes, aplicaciones y contenedores.

Qué se consiguió y qué quedó pendiente

En la intervención analizada, la simulación de instalación de APT finalizó correctamente; los temporizadores de actualizaciones automáticas permanecieron activos; los servicios prescindibles quedaron bloqueados y la revisión posterior no encontró procesos fwupd ni packagekitd ejecutándose con Brotli cargado.

Esto es reducción de superficie de ataque, no reparación del decodificador. libbrotli1 siguió instalado por compatibilidad. Si otra aplicación utiliza una versión vulnerable y descomprime Brotli procedente de fuentes no confiables, el riesgo sigue existiendo. La corrección definitiva exige instalar parches del proveedor, revisar copias incorporadas en runtimes y reiniciar los procesos afectados.

Tampoco basta retirar br de Accept-Encoding: un servidor remoto puede responder con Content-Encoding: br de todas formas. Cuando se usa esa mitigación, hay que rechazar la respuesta antes de descomprimirla o desactivar realmente la decodificación vulnerable, si la aplicación lo permite.

Cómo revertirlo

El bloqueo es deliberadamente reversible. Si una función legítima deja de trabajar, identifica la unidad responsable y retira solo la máscara necesaria:

sudo systemctl unmask fwupd.service packagekit.service
sudo systemctl unmask packagekit-offline-update.service

Para el temporizador de firmware, restablece su estado anterior solo si estaba habilitado antes (por ejemplo, con sudo systemctl enable —now fwupd-refresh.timer). No reactives servicios a ciegas sin haber revisado la razón del cambio de seguridad.

La enseñanza

Una mitigación segura no consiste en borrar todo paquete que figure en un informe. Consiste en comprobar exposición real, desconectar rutas de ejecución prescindibles, preservar mecanismos críticos, validar funcionamiento y mantener pendiente la actualización correctiva.

En servidores Linux, entender la diferencia entre firmware, interfaces gráficas de paquetes y las actualizaciones automáticas nativas permite tomar decisiones con menos riesgo operativo.

Referencias