Informațiile despre a șasea vulnerabilitate (1, 2-3, 4, 5) au fost dezvăluite, permițând unui utilizator local fără privilegii să obțină drepturi root prin rescrierea datelor în cache-ul paginii. Vulnerabilitatea a primit numele de cod PinTheft. Un prototip al exploit-ului este disponibil. Identificatorul CVE nu a fost încă atribuit. Corecția este disponibilă momentan doar sub formă de patch, care a fost publicat pe 5 mai și a fost acceptat în ramura netdev pe 11 mai, dar nu a fost inclus în versiunile corective ale nucleului.
Vulnerabilitatea este prezentă în implementarea protocolului de rețea RDS (Reliable Datagram Sockets), destinat pentru schimbul rapid de mesaje între noduri într-un cluster, cu o întârziere minimă și livrare garantată. Atacul este posibil pe sistemele cu subsistemul io_uring activat (io_uring_disabled=0) și nucleul compilat cu opțiunile CONFIG_RDS, CONFIG_RDS_TCP și CONFIG_IO_URING. Pentru ca exploit-ul să funcționeze, în sistem trebuie să existe un fișier executabil accesibil la citire cu flag-ul SUID-root.
Pentru a încerca să încarce automat modulul nucleului rds_tcp, exploit-ul solicită trimiterea datelor prin RDS folosind transportul SO_RDS_TRANSPORT=2. Se remarcă faptul că, dintre distribuțiile Linux testate, în configurația implicită, modulul nucleului rds este disponibil doar în Arch Linux. Pentru a bloca vulnerabilitatea, se poate dezactiva încărcarea automată a modulelor nucleului rds și rds_tcp: rmmod rds_tcp rds printf 'install rds /bin/false\ninstall rds_tcp /bin/false\n' > /etc/modprobe.d/pintheft.conf
Vulnerabilitatea este cauzată de o eroare în implementarea mecanismului zerocopy în funcția rds_message_zcopy_from_user(), care efectuează modificări directe ale datelor în cache-ul paginii pentru a evita buferizarea inutilă. În cazul unei erori, nu s-a efectuat curățarea câmpului rm->data.op_nents, ceea ce a dus la eliberarea dublă a buffer-ului (double-free). Apariția unei valori incorecte în contorul de referințe a fost exploatată pentru a rescrie datele în cache-ul paginii, prin manipularea pointer-ului către un buffer fixat io_uring.
În rest, mecanismul de exploatare este tipic pentru toate vulnerabilitățile din această categorie — atacatorul reușește să plaseze un fișier al programului cu flagul suid root în cache-ul paginilor, după care modifică antetul ELF pentru a executa \/usr\bin\sh. După această manipulare, rularea programului duce la încărcarea în memorie nu a fișierului executabil original de pe dispozitiv, ci a unei copiei modificate din cache-ul paginilor. Spre deosebire de exploiturile anterioare, noul variant este adaptat numai pentru atacuri asupra utilitarului „su”, dar poate fi utilizat și în prezența în sistem a unor programe suid, cum ar fi mount, passwd, chsh, newgrp, umount și pkexec.
Sursa: opennet.ro
