
CVE-2023-6931 PoC de pânico do kernel
PoC de Pânico do Kernel para CVE-2023-6931
CVE-2023-6931 é uma vulnerabilidade em perf_event que leva a um estouro de buffer no heap causado por um estouro de inteiro no read_size de um grupo.
perf_events é um framework de monitoramento e análise de performance fornecido pelo kernel Linux. Esse framework permite o rastreamento de vários dados relacionados à performance gerados tanto por componentes de hardware quanto de software.
perf_event_open
Uma interface que permite que o espaço do usuário (user-space) configure e controle eventos de performance no kernel.
É usada para criar, agrupar, controlar ou ler dados de eventos./proc/sys/kernel/perf_event_paranoid deve ser 1 ou menorulimit -n.CONFIG_PERF_EVENTS deve estar definida.A vulnerabilidade surge devido a um estouro de inteiro no read_size de um grupo. A função perf_event_validate_size realiza a validação do read_size. No entanto, a forma como read_size é validado apenas verifica o read_size do evento atual.
O ponto-chave é que, durante cada validação, apenas o evento atual é validado, enquanto os eventos anteriores não são. Se PERF_FORMAT_GROUP estiver definido para o líder do grupo, simplesmente adicionar um evento atual pode aumentar o read_size do líder do grupo.
Isso acaba causando um problema em perf_read_group. O cálculo de event->read_size é baseado no read_format do líder do grupo, multiplicado por nr_siblings. Como a variável read_size é um u16 de 2 bytes, o valor máximo que ela pode armazenar é 0xffff.
Para explorar isso, o atacante primeiro cria um evento líder de grupo com todas as opções possíveis de read_format definidas. Em seguida, vários eventos irmãos são criados. Esses irmãos definem apenas PERF_FORMAT_TOTAL_TIME_RUNNING no read_Format para garantir que não haja problemas de validação em perf_event_validate_size. Como resultado, o valor de nr_siblings se torna extremamente grande, mas como cada evento irmão passa pela validação individualmente, não há problemas nesse estágio.
Quando perf_read_group é chamado nesse estado, o read_size do líder do grupo continua aumentando porque PERF_FORMAT_GROUP está definido. Eventualmente, isso leva a um estouro de inteiro, e kzalloc aloca um buffer muito pequeno. No entanto, como o número real de eventos é muito grande, ocorre um estouro de buffer no heap, causando um pânico do kernel.