Compania Qualys a descoperit două vulnerabilități (CVE-2021-44731, CVE-2021-44730) în utilitarul snap-confine, livrat cu flag-ul SUID root și invocat de procesul snapd pentru a forma un mediu de execuție pentru aplicațiile livrate în pachete autonome în format snap. Vulnerabilitățile permit unui utilizator neprivilegiat local să execute cod cu drepturi de root în sistem. Problemele au fost remediate în actualizarea de astăzi a pachetelor snapd pentru Ubuntu 21.10, 20.04 și 18.04.
Prima vulnerabilitate (CVE-2021-44730) permite realizarea unui atac prin manipularea link-urilor dure, dar necesită dezactivarea protecției sistemului pentru link-urile dure (setarea sysctl fs.protected_hardlinks la 0). Problema este cauzată de verificarea incorectă a locației fișierelor executabile ale utilitarilor snap-update-ns și snap-discard-ns, care sunt rulate cu drepturi de root. Calea către aceste fișiere era calculată în funcția sc_open_snapd_tool() pe baza propriei căi din /proc/self/exe, ceea ce permite crearea unui link dur către snap-confine în propriul director și plasarea în acest director a variantelor de utilitare snap-update-ns și snap-discard-ns. După rularea prin link-ul dur, snap-confine cu drepturi de root va lansa din directorul curent fișierele snap-update-ns și snap-discard-ns furnizate de atacator.
A doua vulnerabilitate este cauzată de o stare de competiție și poate fi exploatată în configurația implicită Ubuntu Desktop. Pentru a funcționa cu succes, exploit-ul în Ubuntu Server necesită alegerea, în timpul instalării, a uneia dintre pachetele din secțiunea „Featured Server Snaps”. Starea de competiție se manifestă în funcția setup_private_mount(), invocată în timpul pregătirii spațiului de nume pentru punctele de montare ale pachetului snap. Această funcție creează un director temporar „/tmp/snap.$SNAP_NAME/tmp” sau folosește unul existent pentru bind-mounting-ul directorilor pachetului în format snap.
Dat fiind că numele directorului temporar este previzibil, un atacator poate înlocui conținutul acestuia cu un link simbolic în momentul după verificarea proprietarului, dar înainte de apelul sistemului mount. De exemplu, se poate crea în directorul /tmp/snap.lxd un link simbolic „/tmp/snap.lxd/tmp”, care indică către un director la alegere, iar apelul mount() va urma linkul simbolic și va monta directorul în spațiul de nume snap. În mod similar, se poate monta propriul conținut în /var/lib și, prin înlocuirea /var/lib/snapd/mount/snap.snap-store.user-fstab, se poate organiza montarea propriului director /etc în spațiul de nume al pachetului snap pentru a permite încărcarea bibliotecii cu privilegii de root prin înlocuirea /etc/ld.so.preload.
Se observă că crearea unui exploit s-a dovedit a fi o sarcină neobișnuită, deoarece utilitarul snap-confine este scris în limbajul Go folosind tehnici de programare sigură, are protecție bazată pe profiluri AppArmor, filtrează apelurile sistemului pe baza mecanismului seccomp și aplică pentru izolare un spațiu de nume pentru montare. Cu toate acestea, cercetătorilor le-a reușit să pregătească un exploit funcțional pentru obținerea privilegiilor de root în sistem. Codul exploit-ului va fi publicat în câteva săptămâni, după ce utilizatorii vor aplica actualizările furnizate.
Sursa: opennet.ro
