ClickCease El código BPF puede permitir la elevación local de privilegios (CVE-2021-29154) - TuxCare

Únase a nuestro popular boletín

Únase a más de 4.500 profesionales de Linux y el código abierto.

2 veces al mes. Sin spam.

El código BPF puede permitir la elevación local de privilegios (CVE-2021-29154)

12 de abril de 2021 - Equipo de RRPP de TuxCare

Another vulnerability targeting the BPF subsystem has been disclosed publicly in the past few days (CVE-2021-29154). It allows users on a system running non-default configuration of the BPF subsystem to run specially crafted code as a BPF filter and run arbitrary executable code in the kernel context.   According to vendors, it affects all distributions running kernels up to version 5.11.12. Distribution vendors are starting to deliver patches through their update mechanisms, and KernelCare is also finalizing patches for it’s rebootless patching process to address this issue.  Because of the nature of the BPF functionality, which is to allow user code to interact with network packet processing within the kernel, there is a very big potential for attack given any weakness in the implementation. This specific functionality has been addressed recently in the specter mitigation code bug discussed here.  To be vulnerable, a system would have to be configured to allow BPF JIT compilation (for example, by setting “net.core.bpf_jit_enable = 1”). This is often the case in situations where regular users are doing work related to sockets’ manipulation or in seccomp (secure computing mode) environments where permissions are granted more granularly than normal.  The actual vulnerable code resides in arch/x86/net/bpf_jit_comp.c and arch/x86/net/bpf_jit_comp32.c in the kernel source code tree. The flaw comes from the way branch displacement happens when the user code is compiled, by making wrong assumptions regarding the address of code during optimization.  Proper exploitation of this vulnerability could even lead to container or chroots’ escape, since the kernel is shared between them, and running code in the kernel context permits it to escape containerization limits.  As a stop-gap procedure, you can quickly disable BPF JIT by running:  # echo 0 > /proc/sys/net/core/bpf_jit_enable   Which will persist until reversed or a system reboot. A more permanent removal can be achieved by using your distribution’s syscfg equivalent utility to set “net.core.bpf_jit_enable=0” at boot time. Of course, this type of solution solves the problem by disabling the functionality, which in itself is self-defeating. If you actually had your system configured to use BPF JIT, in all likelihood your use case needed that setting explicitly enabled, and you should rely instead on proper kernel patching, either through your distribution vendor’s patches or through KernelCare’s rebootless process.&#8221; width=&#8221;2600&#8243; loading=&#8221;lazy&#8221; style=&#8221;width: 2600px;&#8221;></p><p style=En los últimos días se ha hecho pública otra vulnerabilidad dirigida al subsistema BPF (CVE-2021-29154). Permite a los usuarios de un sistema que ejecute una configuración no predeterminada del subsistema BPF ejecutar código especialmente diseñado como filtro BPF y ejecutar código ejecutable arbitrario en el contexto del núcleo. 

 

Según los vendedores, afecta a todas las distribuciones que ejecutan kernels hasta la versión 5.11.12. Los proveedores de distribuciones están empezando a enviar parches a través de sus mecanismos de actualización, y KernelCare también está ultimando parches para su proceso de parcheo sin reinicio con el fin de solucionar este problema.

Debido a la naturaleza de la funcionalidad BPF, que permite al código de usuario interactuar con el procesamiento de paquetes de red dentro del núcleo, existe un gran potencial de ataque ante cualquier debilidad en la implementación. Esta funcionalidad específica ha sido abordada recientemente en el error de código de mitigación de specter que se discute aquí.

 

Para ser vulnerable, un sistema tendría que estar configurado para permitir la compilación BPF JIT (por ejemplo, estableciendo "net.core.bpf_jit_enable = 1"). Este suele ser el caso en situaciones en las que usuarios normales realizan trabajos relacionados con la manipulación de sockets o en entornos seccomp (modo de computación segura) en los que los permisos se conceden de forma más granular de lo normal.

 

El código vulnerable real reside en arch/x86/net/bpf_jit_comp .c y arch/x86/net/bpf_jit_comp32.c en el árbol de código fuente del kernel. El fallo proviene de la forma en que se produce el desplazamiento de rama cuando se compila el código de usuario, al hacer suposiciones erróneas sobre la dirección del código durante la optimización.

 

La explotación adecuada de esta vulnerabilidad podría llevar incluso a la fuga de contenedores o chroots, ya que el kernel es compartido entre ellos, y ejecutar código en el contexto del kernel le permite escapar de los límites de la contenedorización.

 

Como procedimiento provisional, puede desactivar rápidamente BPF JIT ejecutando:

 

# echo 0 > /proc/sys/net/core/bpf_jit_enable

 

 

que persistirá hasta que se anule o se produzca un reinicio del sistema. Se puede conseguir una eliminación más permanente utilizando la utilidad equivalente syscfg de su distribución para establecer "net.core.bpf_jit_enable=0" en el arranque. Por supuesto, este tipo de solución resuelve el problema deshabilitando la funcionalidad, lo que en sí mismo es contraproducente. Si realmente tiene su sistema configurado para utilizar BPF JIT, es muy probable que su caso de uso necesite que esa configuración esté explícitamente habilitada, y en su lugar debería confiar en un parcheado adecuado del kernel, ya sea a través de los parches de su proveedor de distribución o a través del proceso sin reinicio de KernelCare.

¿Desea automatizar la aplicación de parches de vulnerabilidad sin reiniciar el núcleo, dejar el sistema fuera de servicio o programar ventanas de mantenimiento?

Más información sobre Live Patching con TuxCare

Conviértete en escritor invitado de TuxCare

Empezar

Correo

Únete a

4,500

Profesionales de Linux y código abierto

Suscríbase a
nuestro boletín