Sono state identificate due nuove vulnerabilità nel sottosistema eBPF, che consente l'esecuzione di gestori all'interno del kernel Linux in una macchina virtuale speciale con JIT. Entrambe le vulnerabilità permettono di eseguire codice con privilegi di kernel, al di fuori della macchina virtuale isolata eBPF. Le informazioni sui problemi sono state pubblicate dal team di Zero Day Initiative, che organizza le competizioni Pwn2Own, durante le quali sono state dimostrate tre attacchi su Ubuntu Linux quest'anno, utilizzando vulnerabilità precedentemente sconosciute (non è stato comunicato se le vulnerabilità in eBPF siano collegate a questi attacchi).
- CVE-2021-3490 — vulnerabilità causata dall'assenza di controlli sui limiti dei valori a 32 bit durante l'esecuzione di operazioni bitwise AND, OR e XOR in eBPF ALU32. Un attaccante può sfruttare questo errore per leggere e scrivere dati al di fuori dei confini del buffer allocato. Il problema con l'operazione XOR si manifesta a partire dalla versione del kernel 5.7-rc1, mentre AND e OR a partire dal rilascio 5.10-rc1.
- CVE-2021-3489 — vulnerabilità causata da un errore nell'implementazione del buffer circolare e legata al fatto che la funzione bpf_ringbuf_reserve non verificava se la dimensione dell'area di memoria allocata poteva risultare inferiore alla dimensione effettiva del buffer circolare ringbuf. Il problema si manifesta a partire dal rilascio 5.8-rc1.
Lo stato della correzione delle vulnerabilità nelle distribuzioni può essere monitorato su queste pagine: Ubuntu, Debian, RHEL, Fedora, SUSE, Arch). Le correzioni sono disponibili anche sotto forma di patch (CVE-2021-3489, CVE-2021-3490). La possibilità di sfruttare il problema dipende dalla disponibilità del sistema di chiamate eBPF per l'utente. Ad esempio, nella configurazione predefinita in RHEL, per sfruttare la vulnerabilità è necessario che l'utente disponga dei diritti CAP_SYS_ADMIN.
Un'altra vulnerabilità separata nel kernel Linux è CVE-2021-32606, che consente a un utente locale di elevare le proprie privilegi a livello root. Il problema si manifesta a partire dal kernel Linux 5.11 ed è causato da una condizione di gara nell'implementazione del protocollo CAN ISOTP, che permette di modificare i parametri di binding del socket a causa della mancanza di adeguate serrature nella funzione isotp_setsockopt() durante l'elaborazione del flag CAN_ISOTP_SF_BROADCAST.
Dopo la chiusura del socket ISOTP, continua a esistere il binding al socket del destinatario, che può continuare a utilizzare le strutture collegate al socket dopo che la memoria ad esse associata è stata liberata (uso dopo la liberazione a causa di un accesso in isotp_rcv() a una struttura isotp_sock già liberata). Tramite manipolazioni dei dati, è possibile sovrascrivere il puntatore alla funzione sk_error_report() ed eseguire codice a livello kernel.
Fonte: opennet.ru
