Tai labai specifinis išnaudojimo tipas, kuris vargina visų rūšių programinę įrangą.
„Use-After-Free“ (UAF) yra primityvus atminties pažeidimo pažeidžiamumas, kuris ir toliau kelia didelę grėsmę visų tipų programinei įrangai – nuo operacinės sistemos iki taikomosios programinės įrangos. Šis kritinis saugos trūkumas atsiranda, kai programos komponentas bando pasiekti duomenis iš atminties adreso, kuris jau buvo atlaisvintas, taigi ir pavadinimas – naudoti po nemokamo.
UAF pažeidžiamumas gali sukelti potencialų programinės įrangos išnaudojimą ar net sistemos kompromisą. Štai kas yra UAF pažeidžiamumas, kodėl taip nutinka ir kaip galite apsaugoti savo programinę įrangą nuo UAF pažeidžiamumo.
Kas yra nenaudojamo naudojimo (UAF) pažeidžiamumas?
Prieš pasinerdami į „Use-After-Free“ pažeidžiamumą, žengkime žingsnį atgal ir suprasime kai kuriuos atminties valdymo pagrindus. Kai programa vykdoma, jos duomenys ir kodas įkeliami į atmintį.
Atminties valdymas – tai procesas, skirtas valdyti, kaip optimaliai išsaugoti (vadinama atminties paskirstymu) ir pašalinti (vadinamą atminties išskyrimu) duomenis ir kodą atmintyje. Du pirminiai atminties segmentai, kuriuose saugomi programos duomenys, yra
krūva ir krūva.Programoms galima skirti vietos atminties statiškai krūvoje ir dinamiškai krūvoje. Nenaudojamo naudojimo po nemokamo pažeidžiamumas atsiranda, kai programuotojai savo programose netinkamai valdo dinaminį atminties paskirstymą ir atskyrimą. Tai reiškia, kad UAF pažeidžiamumų klasė yra krūvos išnaudojimo tipas. Norint geriau suprasti šį pažeidžiamumą, reikia gerai suprasti kaip rodyklės veikia programuojant.
„Use-After-Free“ (UAF), kaip rodo pavadinimas, yra primityvios atminties sugadinimo pažeidžiamumo tipas, atsirandantis, kai objektas, kuris jau buvo atlaisvinta iš atminties, vėl pasiekiama, o tai sukelia gedimus arba nenumatytas pasekmes, tokias kaip atminties nutekėjimas, privilegijų padidinimas (EOP) arba savavališkas kodas. egzekucija. Sužinokime, kaip ši sąlyga atsiranda ir kaip ji išnaudojama.
Kaip išnaudojamas naudojimas po naudojimo (UAF)?
„Use-After-Free“ (UAF), kaip rodo pavadinimas, yra primityvus atminties pažeidimo pažeidžiamumas, atsirandantis, kai programa ir toliau pasiekia atminties vietas, kurias ji atlaisvino. Pažvelkime į kodo pavyzdį:
#įtraukti <stdio.h>
#įtraukti <stdlib.h>
tarptpagrindinis(){
tarpt *MUO = malloc (dydis(tarpt));
*MUO = 69420;
printf("Vertė: %d\n", *MUO);
nemokamas (MUO);
printf("Vertė?: %d\n", *MUO);
grąžinti0;
}
Ar galite pastebėti pažeidžiamumą? Kaip matote, šiame kode MUO žymeklis atimamas iš atminties naudojant Laisvas() funkcija, tačiau ji vėl iškviečiama kitoje eilutėje naudojant printf() funkcija. Dėl to programa veikia netikėtai ir, atsižvelgiant į tai, kur programinėje įrangoje yra pažeidžiamumas, jis gali būti panaudotas privilegijų padidinimui ir atminties nutekėjimui gauti.
Kaip sumažinti naudojimą po naudojimo?
UAF atsiranda dėl programos programavimo klaidų. Yra keletas atsargumo priemonių, kurių galite imtis, kad išvengtumėte programinės įrangos pažeidžiamumų, skirtų naudoti po naudojimo.
Štai keletas geriausių praktikos pavyzdžių, kuriuos galite pritaikyti norėdami sumažinti programinės įrangos atminties pažeidimus:
- Naudojant atmintį saugančias programavimo kalbas, pvz., Rust, su integruotais mechanizmais, kad būtų išvengta primityvių atminties sugadinimo pažeidžiamumų, pvz., UAF, buferio perpildymo ir kt. Jei naudojate programavimo kalbas, pvz., C/C++, labiau tikėtina, kad kode atsiras atminties klaidų. Dėl tos pačios priežasties net operacinės sistemos, tokios kaip „Windows“ ir „Linux“, lėtai pereina prie „Rust“. Taip pat turėtumėte apsvarstyti sužinoti apie Rustą jei kuriate žemo lygio programas.
- Be atminties saugančios kalbos, rekomenduojama vadovautis geriausios praktikos pavyzdžiais, pvz., nustatyti žymeklio reikšmę į NULL po to, kai ji bus atlaisvinta, kad išvengtumėte bet kokio pažeidžiamumo, naudojamo po naudojimo.
- Taip pat galite įdiegti tokius metodus kaip vienkartinis paskirstymas (OTA), kurie neleidžia užpuolikams pasiekti atlaisvintos atminties objektai ir griežta objekto gyvavimo ciklo politika, padedanti sekti kiekvieną priskirtą atminties objektą ir paskirstytas. Tačiau atminkite, kad šie diegimai gali padidinti atminties ir našumo sąnaudas.
Realūs naudojimo po nemokamo (UAF) pažeidžiamumo pavyzdžiai
„Use-After-Free“ (UAF) pažeidžiamumas buvo aptiktas ir išnaudojamas įvairiuose realaus pasaulio scenarijuose – nuo žiniatinklio naršyklių iki „Android“ branduolio iki kasdienių programų. Tai rodo, kad reikia imtis aktyvių saugumo priemonių. Kai kurie realaus pasaulio UAF pavyzdžiai:
- Interneto naršyklės: UAF pažeidžiamumas žiniatinklio naršyklėse buvo išnaudotas siekiant vykdyti savavališką kodą, pažeisti vartotojų privatumą ir vykdyti nuotolinio kodo vykdymo atakas. Naujausias pavyzdys būtų CVE-2021-38008, kuris išnaudojo UAF pažeidžiamumą naršyklėje „Google Chrome“, leidžiantį grėsmės subjektams nuotoliniu būdu vykdyti savavališką kodą nukentėjusiame kompiuteryje.
- Operacinės sistemos: UAF pažeidžiamumas, aptiktas „Windows“ / „Linux“ / „Android“ branduoliuose, leido užpuolikams įgyti padidintų privilegijų, apeiti saugos mechanizmus ir įgyti atkaklumo. Operacinės sistemos branduoliuose aptikta ir iki šiol randama daugybė UAF pažeidžiamumų. Šio rašymo metu CVE-2023-3269 buvo viešai paskelbtas dar vienas UAF pažeidžiamumas Linux branduolyje, dėl kurio buvo padidintos privilegijos. CVE-2022-23270 yra „Windows“ branduolio UAF pažeidžiamumo pavyzdys.
- Programinės įrangos programos: UAF pažeidžiamumas programinės įrangos programose buvo išnaudotas siekiant manipuliuoti programa elgesys, lemiantis informacijos atskleidimą, savavališko kodo vykdymą, programos gedimą ir, blogiausiu atveju, privilegiją eskalacija. Kelios programinės įrangos buvo ir vis dar yra jautrios UAF atakoms. Ši programinė įranga dažniausiai yra C/C++ programos, sukurtos taikant neefektyvius ir nesaugius atminties valdymo metodus.
Norėdami sužinoti daugiau apie pažeidžiamumą „Naudoti po nemokamo naudojimo“ realiose programose, galite patikrinti oficialus MITER CVE sąrašo puslapį ir rūšiuokite pagal raktinį žodį „Naudoti po nemokamų“.
Veiksmingas atminties paskirstymas padeda užtikrinti programinės įrangos saugumą
Optimalus ir gerai apgalvotas atminties paskirstymas labai padeda apsaugoti jūsų programas nuo įprastų primityvių atminties sugadinimo spragų.
UAF ir naudojimo laikas (TOCTOU), lenktynių sąlygos ir buferio perpildymai (BOF) yra vieni iš dažniausiai naudojamų atminties spragų. Viso to galima išvengti sužinojus, kaip programos atmintį valdo platforma, kurioje ji veikia. Tai suteikia jums aiškumo, kaip operacinė sistema paskirsto jūsų programą atmintyje, ir aprūpina jus įrankiais, leidžiančiais sukurti programinę įrangą, užtikrinančią optimalų veikimą ir saugumą.
Jei dar to nepadarėte, galite pradėti nuo supratimo, kaip atmintis valdoma Linux, dažniausiai pasaulyje naudojamoje serverių operacinėje sistemoje.