Onderzoekers van het bedrijf Xint hebben een kwetsbaarheid in de Linux-kernel ontdekt (CVE-2026-31431) die het voor een niet-privilegieerde gebruiker mogelijk maakt om root-toegang tot het systeem te verkrijgen. De kwetsbaarheid heeft de codenaam Copy Fail gekregen. Er is een exploit-prototype beschikbaar. De mogelijkheid om de kwetsbaarheid te exploiteren is gedemonstreerd in Ubuntu 24.04 LTS, Amazon Linux 2023, RHEL 10.1 en SUSE 16, maar het wordt opgemerkt dat pakketten met kernels van andere distributies, waaronder Debian, Arch, Fedora, Rocky en Alma, ook kwetsbaar zijn, hoewel ze niet afzonderlijk zijn getest.
De kwetsbaarheid wordt veroorzaakt door een logische fout in de crypto API (AF_ALG) van de Linux-kernel, die is ontstaan bij een optimalisatie in 2017, waarbij onnodige buffering werd verwijderd door in-place operaties van block cipher AEAD (Authenticated Encryption with Associated Data) uit te voeren. Het probleem ontstond door het ondoordachte gebruik van de functie splice(), die gegevens tussen bestandsdescriptoren en pipes doorgeeft zonder kopiëren, door links naar elementen in de pagina-cache door te geven. Na de optimalisatie werd er bij het verzenden van een bestand naar een AF_ALG-socket voor decryptie in de scatterlist-structuur niet een link naar een afzonderlijke buffer geschreven, maar een directe link naar elementen in de pagina-cache van de kernel met de gegevens van het bestand.
In de vervolgde decryptieprocessen werden de gelinkte gegevens van de authenticatietag gemengd met de extra geauthentiseerde gegevens (AAD, Associated Authenticated Data) die in de RX-buffer werden gekopieerd, en met de ciphertext, waarbij de offset voor de schrijfoperatie naar de authenticatietag werd berekend op basis van de gekopieerde gegevens zonder de juiste controles, wat het mogelijk maakte om willekeurige gebieden in de pagina-cache te overschrijven.
De kwetsbaarheid maakt het mogelijk om bij elke aanvraag 4 bytes te overschrijven op een gekozen offset, waardoor een aanvaller door een serie aanvragen de inhoud van elk bestand in het systeem kan wijzigen dat voor lezen toegankelijk is, nadat het eerder in de cache is geplaatst. Aangezien bij alle leesoperaties uit bestanden de inhoud eerst uit de pagina-cache wordt geleverd, zal de kernel of het proces bij het lezen van gegevens uit een bestand niet de werkelijke maar de vervalste gegevens ontvangen, wat kan worden gebruikt om code in uitvoerbare bestanden of gedeelde bibliotheken te injecteren.
Om code met root-rechten uit te voeren, moet de paginacache worden gewijzigd voor elk uitvoerbaar bestand met de suid root-vlag.
In de voorgestelde exploit wordt een uitvoerbaar bestand gelezen vanuit /usr/bin/su en de inhoud die in de paginacache is geladen van dit bestand wordt gewijzigd om er eigen code in te plaatsen. Bij een volgende uitvoering van de tool 'su' zal niet het originele uitvoerbare bestand van de opslag worden geladen, maar een gewijzigde kopie uit de paginacache.
De exploit is universeel, vereist geen aanpassing aan distributies of kernelversies en kan met elke distributie worden gebruikt. Aangezien bij het gebruik van containerisolatie een gedeelde paginacache voor alle containers wordt gebruikt, kan de kwetsbaarheid worden gebruikt om toegang te krijgen tot de hostomgeving vanuit een container (er wordt later een exploit beloofd om de isolatie in Kubernetes te omzeilen).
De kwetsbaarheid is met behulp van AI ontdekt na ongeveer een uur experimenteren met de analyse van de code van de cryptosubsystemen van de kernel. Het probleem doet zich voor vanaf kernelversie Linux 4.14, die in 2017 werd uitgebracht, en is verholpen in kernels 6.18.22, 6.19.12 en 7.0. De status van de oplossing van kwetsbaarheden in distributies kan worden beoordeeld op deze pagina's: Debian, Ubuntu, SUSE/openSUSE, RHEL, Gentoo, Arch,
Fedora, ROSA.
Als een beveiligingsomleiding kan het kernelmodule algif_aead worden uitgeschakeld, die in OpenSSL wordt gebruikt wanneer de afhandeling afalg expliciet is ingeschakeld en in bepaalde applicaties (breng de aanwezigheid van dergelijke actieve applicaties in kaart met het commando 'lsof | grep AF_ALG'):
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif.conf
rmmod algif_aead
Bron: opennet.ru
