Nel codice del file system XFS è stata scoperta una vulnerabilità (CVE-2021-4155) che consente a un utente locale non privilegiato di leggere direttamente i dati dei blocchi inutilizzati dal dispositivo a blocchi. Tutte le versioni significative del kernel Linux superiori alla 5.16 che contengono il driver XFS sono vulnerabili a questo problema. La correzione è stata inclusa nella versione 5.16 e in aggiornamenti del kernel 5.15.14, 5.10.91, 5.4.171, 4.19.225, ecc. Lo stato dell’elaborazione degli aggiornamenti per risolvere il problema nelle distribuzioni può essere monitorato su queste pagine: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch.
La vulnerabilità è causata da un comportamento errato di due specifici ioctl XFS (XFS_IOC_ALLOCSP) e ioctl (XFS_IOC_FREESP), che sono l'equivalente funzionale della chiamata di sistema fallocate() del kernel. Durante l'aumento delle dimensioni di un file non allineato alla dimensione di un blocco, gli ioctl XFS_IOC_ALLOCSP/XFS_IOC_FREESP non azzerano i byte finali fino al successivo confine del blocco. Pertanto, su XFS con una dimensione di blocco standard di 4096 byte, un attaccante può leggere fino a 4095 byte di dati precedentemente scritti da ogni blocco. Questi settori possono contenere dati di file eliminati, file deframmentati e file con blocchi deduplicati.
Puoi controllare se il tuo sistema presenta il problema utilizzando un semplice prototipo di exploit. Se dopo aver eseguito la sequenza di comandi proposta riesci a leggere un testo di Shakespeare, allora il driver FS è vulnerabile. Il montaggio iniziale della partizione XFS per la dimostrazione richiede i diritti di superutente.
Poiché ioctl(XFS_IOC_ALLOCSP) e ioctl(XFS_IOC_FREESP) sono praticamente identici al fallocate() standard in termini di funzionalità, e l'unica loro differenza è la perdita di dati, la loro presenza è simile a quella di un retroporta. Nonostante la politica generale di non modificare le interfacce esistenti nel kernel, su proposta di Linus, è stata presa la decisione di rimuovere completamente questi ioctl nella prossima versione.
Fonte: opennet.ru
