
CVE-2023-6931 pánico del kernel PoC
PoC de Kernel Panic para CVE-2023-6931
CVE-2023-6931 es una vulnerabilidad en perf_event que conduce a un desbordamiento de búfer en el heap causado por un desbordamiento de enteros en el read_size de un grupo.
perf_events es un marco de monitoreo y análisis de rendimiento proporcionado por el kernel de Linux. Este marco permite el seguimiento de varios datos relacionados con el rendimiento generados tanto por componentes de hardware como de software.
perf_event_open
Una interfaz que permite al espacio de usuario configurar y controlar eventos de rendimiento en el kernel. Se utiliza para crear, agrupar, controlar o leer datos de eventos./proc/sys/kernel/perf_event_paranoid debe ser 1 o inferior.ulimit -n.CONFIG_PERF_EVENTS debe estar establecida.La vulnerabilidad surge debido a un desbordamiento de enteros en el read_size de un grupo. La función perf_event_validate_size realiza la validación del read_size. Sin embargo, la forma en que se valida read_size solo verifica el read_size del evento actual.
El punto clave es que durante cada validación, solo se valida el evento actual, mientras que los eventos anteriores no. Si PERF_FORMAT_GROUP está configurado para el líder del grupo, simplemente agregar un evento actual puede aumentar el read_size del líder del grupo.
Esto finalmente causa un problema en perf_read_group. El cálculo de event->read_size se basa en el read_format del líder del grupo, multiplicado por nr_siblings. Dado que la variable read_size es un u16 de 2 bytes, el valor máximo que puede contener es 0xffff.
Para explotar esto, el atacante primero crea un evento líder de grupo con todas las opciones posibles de read_format configuradas. Luego, se crean numerosos eventos hermanos. Estos hermanos solo configuran PERF_FORMAT_TOTAL_TIME_RUNNING en el read_format para garantizar que no haya problemas de validación en perf_event_validate_size. Como resultado, el valor de nr_siblings se vuelve extremadamente grande, pero dado que cada evento hermano pasa la validación individualmente, no hay problemas en esta etapa.
Cuando se llama a perf_read_group en este estado, el read_size del líder del grupo continúa aumentando porque PERF_FORMAT_GROUP está configurado. Eventualmente, esto conduce a un desbordamiento de enteros, y kzalloc asigna un búfer muy pequeño. Sin embargo, dado que el número real de eventos es muy grande, se produce un desbordamiento de búfer en el heap, causando un pánico del kernel.