
CVE-2023-6931 PoC di kernel panic
PoC di Kernel Panic per CVE-2023-6931
CVE-2023-6931 è una vulnerabilità in perf_event che porta a un heap buffer overflow causato da un integer overflow nel read_size di un gruppo.
perf_events è un framework di monitoraggio e analisi delle prestazioni fornito dal kernel Linux. Questo framework consente di tracciare vari dati relativi alle prestazioni generati sia da componenti hardware che software.
perf_event_open
Un'interfaccia che consente allo spazio utente di configurare e controllare gli eventi di prestazione nel kernel.
Viene utilizzata per creare, raggruppare, controllare o leggere i dati degli eventi./proc/sys/kernel/perf_event_paranoid deve essere 1 o inferioreulimit -n.CONFIG_PERF_EVENTS deve essere impostata.La vulnerabilità sorge a causa di un integer overflow nel read_size di un gruppo. La funzione perf_event_validate_size esegue la validazione del read_size. Tuttavia, il modo in cui viene validato il read_size controlla solo il read_size dell'evento corrente.
Il punto chiave è che durante ogni validazione viene validato solo l'evento corrente, mentre gli eventi precedenti non lo sono. Se PERF_FORMAT_GROUP è impostato per il leader del gruppo, la semplice aggiunta di un evento corrente può aumentare il read_size del leader del gruppo.
Questo alla fine causa un problema in perf_read_group. Il calcolo di event->read_size si basa sul read_format del leader del gruppo, moltiplicato per nr_siblings. Poiché la variabile read_size è un u16 a 2 byte, il valore massimo che può contenere è 0xffff.
Per sfruttare questo, l'attaccante crea prima un evento leader del gruppo con tutte le possibili opzioni di read_format impostate. Successivamente, vengono creati numerosi eventi sibling. Questi sibling impostano solo PERF_FORMAT_TOTAL_TIME_RUNNING nel read_Format per garantire che non ci siano problemi di validazione in perf_event_validate_size. Di conseguenza, il valore di nr_siblings diventa estremamente grande, ma poiché ogni evento sibling supera la validazione individualmente, non ci sono problemi in questa fase.
Quando perf_read_group viene chiamato in questo stato, il read_size del leader del gruppo continua ad aumentare perché PERF_FORMAT_GROUP è impostato. Alla fine, questo porta a un integer overflow e kzalloc alloca un buffer molto piccolo. Tuttavia, poiché il numero effettivo di eventi è molto grande, si verifica un heap buffer overflow, causando un kernel panic.