Vulnerabilitat d'arrel al nucli de Linux i denegació de servei a systemd

Els investigadors de seguretat de Qualys han revelat detalls de dues vulnerabilitats que afecten el nucli de Linux i el gestor del sistema systemd. Una vulnerabilitat al nucli (CVE-2021-33909) permet a un usuari local aconseguir l'execució de codi amb drets root mitjançant la manipulació de directoris molt imbricats.

El perill de la vulnerabilitat s'agreuja pel fet que els investigadors van poder preparar exploits de treball que funcionin a Ubuntu 20.04/20.10/21.04, Debian 11 i Fedora 34 en la configuració predeterminada. Cal assenyalar que no s'han provat altres distribucions, però teòricament també són susceptibles al problema i poden ser atacades. Es promet que es publicarà el codi complet de les explotacions després que el problema s'elimini a tot arreu, però ara per ara només hi ha disponible un prototip de funcionalitat limitada, cosa que fa que el sistema es bloquegi. El problema és present des del juliol de 2014 i afecta les versions del nucli a partir de la versió 3.16. La correcció de vulnerabilitat es va coordinar amb la comunitat i es va acceptar al nucli el 19 de juliol. Les principals distribucions ja han generat actualitzacions als seus paquets del nucli (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

La vulnerabilitat és causada per la manca de comprovar el resultat d'una conversió size_t a int abans de realitzar operacions al codi seq_file, que crea fitxers a partir d'una seqüència de registres. Si no es comprova, pot ser que es produeixin escriptures fora dels límits a la memòria intermèdia en crear, muntar i suprimir una estructura de directoris molt imbricada (mida del camí superior a 1 GB). Com a resultat, un atacant pot aconseguir una cadena de 10 bytes "//deleted" escrita amb un desplaçament de "-2 GB - 10 bytes" que apunta a l'àrea immediatament anterior al buffer assignat.

L'explotació preparada requereix 5 GB de memòria i 1 milió d'inodes gratuïts per funcionar. L'explotació funciona cridant a mkdir() per crear una jerarquia d'un milió de subdirectoris per aconseguir una mida de camí de fitxer superior a 1 GB. Aquest directori es munta mitjançant bind-mount en un espai de noms d'usuari separat, després del qual s'executa la funció rmdir() per eliminar-lo. Paral·lelament, es crea un fil que carrega un petit programa eBPF, que es bloqueja en l'etapa després de comprovar el pseudocodi eBPF, però abans de la seva compilació JIT.

A l'espai de noms d'ID d'usuari sense privilegis, s'obre el fitxer /proc/self/mountinfo i es llegeix el nom d'accés llarg del directori muntat a l'enllaç, de manera que la cadena "//deleted" s'escriu a l'àrea abans de l'inici de la memòria intermèdia. La posició per escriure la línia s'escull de manera que sobreescriu la instrucció del programa eBPF ja provat però encara no compilat.

A continuació, a nivell de programa eBPF, l'escriptura descontrolada fora de la memòria intermèdia es transforma en una capacitat controlada per llegir i escriure en altres estructures del nucli mitjançant la manipulació de les estructures btf i map_push_elem. Com a resultat, l'explotació determina la ubicació de la memòria intermèdia modprobe_path[] a la memòria del nucli i sobreescriu la ruta "/sbin/modprobe", que us permet iniciar el llançament de qualsevol fitxer executable amb drets d'arrel en cas d'un error. crida request_module(), que s'executa, per exemple, quan es crea un sòcol d'enllaç net.

Els investigadors proporcionen diverses solucions alternatives que només són efectives per a un exploit específic, però no eliminen el problema en si. Es recomana establir "/proc/sys/kernel/unprivileged_userns_clone" a 0 per desactivar el muntatge de directoris en un espai de noms d'ID d'usuari separat, i "/proc/sys/kernel/unprivileged_bpf_disabled" a 1 per desactivar la càrrega de programes eBPF al nucli.

Cal destacar que mentre analitzaven un atac alternatiu que implicava l'ús del mecanisme FUSE en lloc de bind-mound per muntar un directori gran, els investigadors es van trobar amb una altra vulnerabilitat (CVE-2021-33910) que afectava el gestor del sistema del sistema. Va resultar que quan s'intenta muntar un directori amb una mida de camí superior a 8 MB mitjançant FUSE, el procés d'inicialització del control (PID1) s'esgota la memòria de pila i es bloqueja, cosa que posa el sistema en un estat de "pànic".

El problema és que systemd fa un seguiment i analitza el contingut de /proc/self/mountinfo, i processa cada punt de muntatge a la funció unit_name_path_escape(), que realitza una operació strdupa() que col·loca les dades a la pila en lloc de la memòria assignada dinàmicament. . Com que la mida màxima de la pila està limitada mitjançant RLIMIT_STACK, el processament d'un camí massa gran fins al punt de muntatge fa que el procés PID1 s'estavella i atura el sistema. Per a un atac, podeu utilitzar el mòdul FUSE més senzill en combinació amb un directori molt imbricat com a punt de muntatge, la mida del camí del qual supera els 8 MB.

El problema apareix des del systemd 220 (abril de 2015), ja s'ha solucionat al repositori principal del systemd i s'ha solucionat a les distribucions (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). En particular, a la versió 248 de systemd l'explotació no funciona a causa d'un error al codi de systemd que fa que el processament de /proc/self/mountinfo falli. També és interessant que el 2018 es va produir una situació similar i quan van intentar escriure un exploit per a la vulnerabilitat CVE-2018-14634 al nucli de Linux, els investigadors de Qualys es van trobar amb tres vulnerabilitats crítiques a systemd.

Font: opennet.ru

Afegeix comentari