È stata rivelata un'informazione sulla sesta vulnerabilità (1, 2-3, 4, 5), che consente a un utente locale non privilegiato di ottenere i diritti di root sovrascrivendo i dati nella cache di pagina. La vulnerabilità è stata soprannominata PinTheft. È disponibile un prototipo dell'exploit. L'identificatore CVE non è ancora stato assegnato. La correzione è attualmente disponibile solo sotto forma di patch, pubblicata il 5 maggio e accettata nel ramo netdev l'11 maggio, ma non inclusa nelle versioni correttive del kernel.
La vulnerabilità è presente nell'implementazione del protocollo di rete RDS (Reliable Datagram Sockets), progettato per lo scambio ad alta velocità di messaggi tra nodi in un cluster, con ritardi minimi e consegna garantita. Un attacco è possibile su sistemi con il sottosistema io_uring attivato (io_uring_disabled=0) e un kernel compilato con le opzioni CONFIG_RDS, CONFIG_RDS_TCP e CONFIG_IO_URING. Per il funzionamento dell'exploit, deve essere disponibile un file eseguibile leggibile con il flag SUID-root nel sistema.
Per il caricamento automatico del modulo del kernel rds_tcp, l'exploit richiede l'invio di dati tramite RDS utilizzando il trasporto SO_RDS_TRANSPORT=2. È stato notato che tra le distribuzioni Linux testate, nella configurazione predefinita il modulo del kernel rds è fornito solo in Arch Linux. Per bloccare la vulnerabilità, è possibile disabilitare il caricamento automatico dei moduli del kernel rds e rds_tcp: rmmod rds_tcp rds printf ‘install rds /bin/false\ninstall rds_tcp /bin/false\n’ > /etc/modprobe.d/pintheft.conf
La vulnerabilità è causata da un errore nell'implementazione del meccanismo zerocopy nella funzione rds_message_zcopy_from_user(), che modifica direttamente i dati nella cache di pagina per evitare un'ulteriore bufferizzazione. In caso di errore, non è stata effettuata la pulizia del campo rm->data.op_nents, causando un doppio rilascio del buffer (double-free). L'apparizione di un valore errato nel contatore dei riferimenti è stata sfruttata per sovrascrivere i dati nella cache della pagina, grazie alla manipolazione del puntatore a un buffer fisso io_uring.
In altri aspetti, il meccanismo di sfruttamento è tipico per tutte le vulnerabilità di questa classe: l'attaccante riesce a far sì che un file di programma con il flag suid root si depositi nella cache delle pagine, dopodiché sostituisce nel header ELF il codice per avviare /usr/bin/sh. Dopo questa manipolazione, l'esecuzione del programma porta all'importazione in memoria non del file eseguibile originale dal dispositivo, ma di una copia modificata dalla cache delle pagine. A differenza degli exploit precedenti, la nuova variante è adattata esclusivamente per attaccare l'utilità 'su', ma può essere utilizzata anche in presenza di programmi suid nel sistema come mount, passwd, chsh, newgrp, umount e pkexec.
Fonte: opennet.ru
