În Netfilter, subsistemul nucleului Linux utilizat pentru filtrarea și modificarea pachetelor de rețea, a fost descoperită o vulnerabilitate (CVE-2021-22555) care permite unui utilizator local să obțină privilegii root în sistem, inclusiv în cadrul unui container izolat. A fost pregătit un prototip funcțional de exploit pentru a ocoli mecanismele de protecție KASLR, SMAP și SMEP. Cercetătorul care a descoperit vulnerabilitatea a primit de la Google o recompensă de 20.000 de dolari pentru identificarea metodei de ocolire a izolării containerelor Kubernetes în clusterul kCTF.
Problema apare începând cu nucleul 2.6.19, lansat acum 15 ani, și este cauzată de o eroare în gestionarii IPT_SO_SET_REPLACE și IP6T_SO_SET_REPLACE, care duce la o depășire a buffer-ului atunci când se trimit parametrii special creați prin apelarea setsockopt în modul compatibil. În condiții normale, apelul compat_setsockopt() poate fi efectuat doar de utilizatorul root, dar privilegii necesare pentru atac pot fi obținute și de un utilizator neprivilegiat în sistemele cu suport activat pentru spațiile de nume ale identificatorilor de utilizator (user namespaces).
Utilizatorul poate crea un container cu un utilizator root separat și exploata vulnerabilitatea din acel container. De exemplu, „user namespaces” este activat implicit în Ubuntu și Fedora, dar nu este activat în Debian și RHEL. Un patch pentru corectarea vulnerabilității a fost integrat în nucleul Linux pe 13 aprilie. Actualizările pachetelor au fost deja formulate de proiectele Debian, Arch Linux și Fedora. În Ubuntu, RHEL și SUSE, actualizările sunt în pregătire.
Problema apare în funcția xt_compat_target_from_user() din cauza calculelor incorecte ale dimensiunii memoriei atunci când se salvează structuri ale nucleului după transformarea dintr-o reprezentare pe 32 de biți în una pe 64 de biți. Eroarea permite scrierea a patru byte-uri zero în orice poziție din exteriorul buffer-ului alocat, limitată de offset-ul 0x4C. Această oportunitate s-a dovedit suficientă pentru a crea un exploit care duce la obținerea privilegiilor root — prin curățarea pointer-ului m_list->next din structura msg_msg se creau condiții pentru accesarea datelor după eliberarea memoriei (use-after-free), ceea ce era apoi folosit pentru obținerea informațiilor despre adrese și modificarea altor structuri prin manipularea apelului de sistem msgsnd().
Sursa: opennet.ro
