Vulnerabilità in XFS che consente la lettura dei dati grezzi del dispositivo a blocchi

È stata identificata una vulnerabilità (CVE-2021-4155) nel codice del file system XFS che consente a un utente locale non privilegiato di leggere i dati a blocchi inutilizzati direttamente da un dispositivo a blocchi. Tutte le principali versioni del kernel Linux precedenti alla 5.16 che contengono il driver XFS sono interessate da questo problema. La correzione è stata inclusa nella versione 5.16, così come negli aggiornamenti del kernel 5.15.14, 5.10.91, 5.4.171, 4.19.225, ecc. Lo stato degli aggiornamenti generati per risolvere il problema nelle distribuzioni può essere monitorato su queste pagine: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch.

La vulnerabilità è causata dal comportamento errato di due ioctl(XFS_IOC_ALLOCSP) e ioctl(XFS_IOC_FREESP) specifici di XFS, che sono un analogo funzionale della chiamata di sistema fallocate() a livello di kernel. Quando si aumenta la dimensione di un file che non è allineato al blocco, gli ioctls XFS_IOC_ALLOCSP/XFS_IOC_FREESP non reimpostano i byte di coda a zero fino al limite del blocco successivo. Pertanto, su XFS con una dimensione di blocco standard di 4096 byte, un utente malintenzionato può leggere fino a 4095 byte di dati scritti in precedenza da ciascun blocco. Queste aree possono contenere dati di file eliminati, file deframmentati e file con blocchi deduplicati.

Puoi testare il tuo sistema per individuare il problema utilizzando un semplice prototipo di exploit. Se, dopo aver eseguito la sequenza di comandi proposta, è possibile leggere il testo di Shakespeare, il driver FS è vulnerabile. Inizialmente il montaggio di una partizione XFS a scopo dimostrativo richiede i privilegi di root.

Poiché ioctl(XFS_IOC_ALLOCSP) e ioctl(XFS_IOC_FREESP) hanno praticamente la stessa funzionalità di fallocate() standard e la loro unica differenza è la perdita di dati, la loro presenza è simile a una backdoor. Nonostante la politica generale di non modificare le interfacce esistenti nel kernel, su suggerimento di Linus si è deciso di rimuovere completamente questi ioctl nella prossima versione.

Fonte: opennet.ru

Aggiungi un commento