Sacensību stāvoklis Linux kodola atkritumu savācējā, kas var izraisīt privilēģiju eskalāciju

Jans Horns no Google Project Zero komandas, kurš savulaik identificēja Spectre un Meltdown ievainojamības, publicēja paņēmienu Linux kodola atkritumu savācēja ievainojamības (CVE-2021-4083) izmantošanai. Ievainojamība ir radusies sacensību stāvokļa dēļ, kad tiek tīrīti failu deskriptori unix ligzdās, un tā, iespējams, ļauj vietējam nepiederīgam lietotājam izpildīt savu kodu kodola līmenī.

Problēma ir interesanta, jo tika lēsts, ka laika logs, kurā notiek sacīkstes nosacījums, ir pārāk mazs, lai radītu reālus varoņdarbus, taču pētījuma autors parādīja, ka pat šādas sākotnēji skeptiskas ievainojamības var kļūt par reālu uzbrukumu avotu, ja ekspluatācijas radītājs ir nepieciešamās prasmes un laiks. Jans Horns parādīja, kā ar filigrānu manipulāciju palīdzību jūs varat samazināt sacīkstes nosacījumus, kas rodas, vienlaikus izsaucot close() un fget() funkcijas, līdz pilnībā izmantojamā "use-after-free" ievainojamībā un panākt piekļuvi jau atbrīvotiem datiem. struktūra kodola iekšpusē.

Faila deskriptora aizvēršanas laikā notiek sacensību nosacījums, vienlaikus izsaucot close() un fget(). Izsaukums close() var notikt pirms fget() izpildes, kas mulsinās atkritumu savācēju, jo saskaņā ar pārskaitījumu faila struktūrai nebūs ārēju atsauču, bet tā paliks pievienota faila deskriptoram, t.i. Atkritumu savācējs domās, ka tam ir ekskluzīva pieeja struktūrai, bet patiesībā īsu laiku atlikušais ieraksts faila deskriptoru tabulā joprojām norādīs uz struktūras atbrīvošanu.

Lai palielinātu iespējamību nokļūt sacensību stāvoklī, tika izmantoti vairāki triki, kas ļāva palielināt ekspluatācijas panākumu iespējamību līdz 30%, ieviešot sistēmai specifiskas optimizācijas. Piemēram, lai palielinātu laiku, lai piekļūtu struktūrai ar failu deskriptoriem par vairākiem simtiem nanosekunžu, dati tika izspiesti no procesora kešatmiņas, kešatmiņu piepildot ar darbībām citā CPU kodolā, kas ļāva izgūt struktūru no atmiņas, nevis no. ātra CPU kešatmiņa.

Otra svarīga iezīme bija aparatūras taimera radīto pārtraukumu izmantošana, lai palielinātu sacensību apstākļu laiku. Brīdis tika izvēlēts tā, lai pārtraukumu apstrādātājs aktivizētu, kad notiek sacensību nosacījums, un kādu laiku pārtrauktu koda izpildi. Lai vēl vairāk aizkavētu kontroles atgriešanu, aptuveni 50 tūkstoši ierakstu gaidīšanas rindā tika ģenerēti, izmantojot epoll, kas prasīja meklēšanu, izmantojot pārtraukumu apstrādātāju.

Ievainojamības izmantošanas paņēmiens tika atklāts pēc 90 dienu neizpaušanas perioda. Problēma parādās kopš kodola 2.6.32 un tika novērsta decembra sākumā. Labojums tika iekļauts kodolā 5.16 un tika pārsūtīts arī uz kodola LTS filiālēm un kodola pakotnēm, kas tiek piegādātas izplatījumos. Zīmīgi, ka ievainojamība tika identificēta, analizējot līdzīgu problēmu CVE-2021-0920, kas izpaužas atkritumu savācējā, apstrādājot karogu MSG_PEEK.

Avots: opennet.ru

Pievieno komentāru