Se han descubierto dos nuevas vulnerabilidades en el subsistema eBPF, que permite ejecutar manejadores dentro del núcleo de Linux en una máquina virtual especial con JIT. Ambas vulnerabilidades permiten ejecutar código con privilegios de núcleo, fuera de la máquina virtual aislada eBPF. La información sobre los problemas fue publicada por el equipo de Zero Day Initiative, que organiza competencias Pwn2Own, donde este año se demostraron tres ataques a Ubuntu Linux, que utilizaron vulnerabilidades previamente desconocidas (no se informa si las vulnerabilidades en eBPF están relacionadas con estos ataques).
- CVE-2021-3490 — la vulnerabilidad se debe a la falta de verificación de límites en valores de 32 bits durante la ejecución de operaciones bit a bit AND, OR y XOR en eBPF ALU32. Un atacante puede aprovechar este error para leer y escribir datos fuera de los límites del buffer asignado. El problema con la operación XOR se manifiesta a partir de la versión del núcleo 5.7-rc1, mientras que AND y OR aparecen desde el lanzamiento 5.10-rc1.
- CVE-2021-3489 — la vulnerabilidad es causada por un error en la implementación del buffer circular y está relacionada con que la función bpf_ringbuf_reserve no verificaba si el tamaño del área de memoria asignada podía ser menor que el tamaño real del buffer circular ringbuf. El problema se manifiesta a partir del lanzamiento 5.8-rc1.
Se puede rastrear el estado de las correcciones de vulnerabilidades en las distribuciones en estas páginas: Ubuntu, Debian, RHEL, Fedora, SUSE, Arch. Las correcciones también están disponibles en forma de parches (CVE-2021-3489, CVE-2021-3490). La posibilidad de explotación del problema depende de la disponibilidad del sistema de llamadas eBPF para el usuario. Por ejemplo, en la configuración predeterminada en RHEL, se requieren derechos CAP_SYS_ADMIN para explotar la vulnerabilidad.
Se puede destacar otra vulnerabilidad en el núcleo de Linux — CVE-2021-32606, que permite a un usuario local elevar sus privilegios al nivel de root. El problema se manifiesta a partir del núcleo de Linux 5.11 y es causado por una condición de carrera en la implementación del protocolo CAN ISOTP, que permite modificar los parámetros de enlace del socket debido a la falta de bloqueos adecuados en la función isotp_setsockopt() al procesar la bandera CAN_ISOTP_SF_BROADCAST.
Después de cerrar el socket ISOTP, continua la vinculación al socket receptor, que puede seguir utilizando las estructuras relacionadas con el socket después de liberar la memoria asociada (uso después de liberar debido a la llamada a isotp_rcv() en una estructura isotp_sock ya liberada). A través de manipulaciones de datos, se puede lograr la sobrescritura del puntero a la función sk_error_report() y ejecutar su propio código en el nivel del núcleo.
Fuente: opennet.ru
