En la implementación del protocolo de red TIPC (Comunicación Transparente entre Procesos) en el kernel de Linux se ha identificado una vulnerabilidad crítica (CVE-2021-43267) que permite la ejecución remota de código con privilegios de kernel a través del envío de un paquete de red especialmente diseñado. El peligro del problema se mitiga porque para llevar a cabo el ataque es necesario habilitar explícitamente el soporte para TIPC en el sistema (cargado y configurando el módulo del kernel tipc.ko), lo cual no se realiza por defecto en las distribuciones de Linux no especializadas.
El protocolo TIPC es compatible desde el kernel de Linux 3.19, pero el código que lleva a la vulnerabilidad fue incluido a partir del kernel 5.10. La vulnerabilidad ha sido corregida en los kernels 5.15.0, 5.10.77 y 5.14.16. El problema persiste y aún no se ha solucionado en Debian 11, Ubuntu 21.04/21.10, SUSE (en la rama SLE15-SP4 que aún no se ha lanzado), RHEL (sin detalles sobre si se ha retroportado el arreglo vulnerable) y Fedora. Ya se ha lanzado una actualización del kernel para Arch Linux. Las distribuciones con kernels anteriores a 5.10, como Debian 10 y Ubuntu 20.04, no son vulnerables.
El protocolo TIPC fue desarrollado originalmente por Ericsson, y está diseñado para facilitar la comunicación entre procesos en un clúster, activándose principalmente en los nodos de los clústeres. TIPC puede funcionar sobre Ethernet o sobre UDP (puerto de red 6118). Si se utiliza sobre Ethernet, un ataque puede ser realizado desde la red local, mientras que al usar UDP, puede provenir de la red global si el puerto no está protegido por un firewall. Un usuario local no privilegiado también puede llevar a cabo el ataque. Para habilitar TIPC, es necesario cargar el módulo del kernel tipc.ko y configurar la vinculación a la interfaz de red usando netlink o la utilidad tipc.
La vulnerabilidad se manifiesta en la función tipc_crypto_key_rc y es causada por la falta de una verificación adecuada entre el tamaño de los datos especificado en el encabezado y el tamaño real al procesar paquetes del tipo MSG_CRYPTO, utilizados para obtener claves de cifrado de otros nodos en el clúster con el fin de descifrar mensajes enviados desde esos nodos. El tamaño de los datos copiados en memoria se calcula como la diferencia entre los valores de los campos de tamaño del mensaje y del tamaño del encabezado, sin tener en cuenta el tamaño real del nombre del algoritmo de cifrado y el contenido de la clave transmitidos en el mensaje. Se supone que el tamaño del nombre del algoritmo es fijo, y para la clave se envía un atributo adicional con el tamaño, lo que permite al atacante especificar un valor en este atributo diferente del real, lo que ocasionará que se escriba más allá del búfer asignado. struct tipc_aead_key { char alg_name[TIPC_AEAD_ALG_NAME]; unsigned int keylen; /* en bytes */ char key[]; };

Fuente: opennet.ru
