El código BPF puede permitir la elevación local de privilegios (CVE-2021-29154)
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.