To je zelo specifična vrsta izkoriščanja, ki pesti vse vrste programske opreme.
Use-After-Free (UAF) je primitivna ranljivost za poškodovanje pomnilnika, ki še naprej predstavlja veliko grožnjo za vse vrste programske opreme od operacijskih sistemov do aplikacijske programske opreme. Ta kritična varnostna napaka se pojavi, ko komponenta aplikacije poskuša dostopati do podatkov v pomnilniškem naslovu, ki je že bil sproščen, od tod tudi ime — use-after-free.
Ranljivosti UAF lahko povzročijo morebitno izkoriščanje programske opreme ali celo ogrožanje sistema. Tukaj je opisano, kaj je ranljivost UAF, zakaj se to zgodi in kako lahko svojo programsko opremo zaščitite pred ranljivostjo UAF.
Kaj je ranljivost UAF (Use-After-Free)?
Preden se poglobimo v ranljivost Use-After-Free, naredimo korak nazaj in razumemo nekaj osnov upravljanja pomnilnika. Ko se program izvaja, se njegovi podatki in koda naložijo v pomnilnik.
Upravljanje pomnilnika je proces upravljanja, kako shraniti (imenovano dodelitev pomnilnika) in odstraniti (imenovano sprostitev pomnilnika) podatke in kodo v pomnilniku na optimalen način. Dva primarna pomnilniška segmenta, kjer so shranjeni programski podatki, sta
sklad in kup.Programom je mogoče dodeliti pomnilniški prostor statično na skladu in dinamično na kupu. Ranljivost uporabe po brezplačni uporabi se pojavi, ko programerji v svojih programih ne upravljajo pravilno dinamične dodelitve in sprostitve pomnilnika. To pomeni, da je razred ranljivosti UAF vrsta izkoriščanja kopice. Za boljše razumevanje te ranljivosti pomaga dobro razumevanje kako kazalci delujejo v programiranju.
Use-After-Free (UAF), kot že ime pove, je vrsta primitivne ranljivosti za poškodbe pomnilnika, ki se pojavi, ko predmet, ki je že bil sprostitev iz pomnilnika se znova dostopa, kar povzroči zrušitve ali nenamerne posledice, kot so uhajanje pomnilnika, stopnjevanje privilegijev (EOP) ali poljubna koda izvedba. Naučimo se, kako do tega stanja sploh pride in kako ga izkoristimo.
Kako se izkorišča uporaba brezplačne uporabe (UAF)?
Use-After-Free (UAF), kot namiguje ime, je primitivna ranljivost pomnilnika, ki se pojavi, ko program še naprej dostopa do pomnilniških lokacij, ki jih je osvobodil. Oglejmo si primer kode:
#vključi <stdio.h>
#vključi <stdlib.h>
intglavni(){
int *MUO = malloc (sizeof(int));
*MUO = 69420;
printf("Vrednost: %d\n", *MUO);
brezplačno (MUO);
printf("Vrednost?: %d\n", *MUO);
vrnitev0;
}
Ali lahko opazite ranljivost? Kot lahko vidite, je v tej kodi MUO kazalec se sprosti iz pomnilnika z uporabo prost() funkcija, vendar je znova poklicana v naslednji vrstici z uporabo printf() funkcijo. Posledica tega je nepričakovano vedenje programa in odvisno od tega, kje v programski opremi je prisotna ranljivost, se lahko izkoristi za povečanje privilegijev in uhajanje pomnilnika.
Kako ublažiti uporabo brez uporabe?
UAF se pojavi zaradi napak pri programiranju aplikacije. Obstaja nekaj previdnostnih ukrepov, s katerimi se lahko izognete ranljivostim Use-After-Free v vaši programski opremi.
Tukaj je nekaj najboljših praks, ki jih lahko uporabite za zmanjšanje ranljivosti poškodovanja pomnilnika v vaši programski opremi:
- Uporaba pomnilniško varnih programskih jezikov, kot je Rust, z vgrajenimi mehanizmi za preprečevanje primitivnih poškodb pomnilnika, kot so UAF, prelivanje medpomnilnika itd. Če uporabljate programske jezike, kot je C/C++, je večja verjetnost, da boste v svojo kodo vnesli pomnilniške napake. Iz istega razloga se celo operacijski sistemi, kot sta Windows in Linux, počasi selijo na Rust. Upoštevati morate tudi učenje o Rustu če ustvarite nizkonivojske programe.
- Poleg uporabe jezika, ki je varen za pomnilnik, je priporočljivo, da upoštevate najboljše prakse, kot je nastavitev kazalca na vrednost NULL, potem ko je osvobojen, da se izognete kakršni koli uvedbi ranljivosti Use-After-Free.
- Uporabite lahko tudi tehnike, kot je One Time Allocation (OTA), ki napadalcem preprečijo dostop do sproščenega pomnilnika objektov in strogega pravilnika življenjskega cikla objekta, ki pomaga pri spremljanju vsakega pomnilniškega predmeta, ki je dodeljen in razporejen. Upoštevajte pa, da lahko te izvedbe povečajo stroške pomnilnika in zmogljivosti.
Primeri ranljivosti brez uporabe (UAF) iz resničnega sveta
Ranljivost UAF (Use-After-Free) je bila odkrita in izkoriščena v različnih realnih scenarijih od spletnih brskalnikov do jedra Android do vsakodnevnih aplikacij. To kaže na potrebo po proaktivnih varnostnih ukrepih. Nekateri primeri UAF iz resničnega sveta vključujejo:
- Internetni brskalniki: ranljivosti UAF v spletnih brskalnikih so bile izkoriščene za izvajanje poljubne kode, ogrožanje zasebnosti uporabnikov in izvajanje napadov z izvajanjem kode na daljavo. Nedavni primer bi bil CVE-2021-38008, ki je izkoristil ranljivost UAF v Google Chromu in akterjem groženj omogočil, da na daljavo izvedejo poljubno kodo na žrtvi.
- Operacijski sistemi: ranljivosti UAF, najdene v jedrih Windows/Linux/Android, so napadalcem omogočile pridobitev višjih privilegijev, obid varnostnih mehanizmov in pridobitev obstojnosti. Obstaja množica ranljivosti UAF, ki so bile najdene in jih še vedno najdemo v jedrih operacijskega sistema do danes. V času pisanja tega članka, CVE-2023-3269, je bila javno objavljena še ena ranljivost UAF v jedru Linuxa, ki vodi do stopnjevanja privilegijev. CVE-2022-23270 je primer ranljivosti UAF v jedru Windows.
- Programske aplikacije: ranljivosti UAF v programskih aplikacijah so bile izkoriščene za manipulacijo programa vedenje, ki vodi do razkritja informacij, izvajanja poljubne kode, zrušitve programa in v najslabšem primeru privilegijev stopnjevanje. Številne programske aplikacije so bile in so še vedno dovzetne za napade UAF. Ta programska oprema je večinoma programov C/C++, ki so bili razviti z neučinkovitimi in nevarnimi pristopi upravljanja pomnilnika.
Če želite izvedeti več o ranljivostih Use-After-Free v realnih aplikacijah, si oglejte uradni MITER CVE stran s seznamom in razvrstite po ključni besedi Use-After-Free.
Učinkovito dodeljevanje pomnilnika pomaga narediti programsko opremo varno
Optimalna in dobro premišljena dodelitev pomnilnika je v veliki meri pripomogla k zaščiti vaših aplikacij pred tem, da postanejo žrtev običajnih primitivnih ranljivosti pomnilnika.
UAF skupaj s časom preverjanja časa uporabe (TOCTOU), pogoji tekmovanja in prelivi medpomnilnika (BOF) so nekatere najpogosteje izkoriščane ranljivosti pomnilnika. Vsem tem se lahko izognete tako, da se naučite, kako pomnilnik vašega programa upravlja platforma, na kateri se izvaja. To vam daje jasnost, kako operacijski sistem dodeljuje vaš program v pomnilniku, in vas opremi z orodji za načrtovanje programske opreme za optimalno delovanje in varnost.
Če tega še niste storili, lahko začnete z razumevanjem, kako poteka upravljanje pomnilnika v Linuxu, najbolj uporabljanem strežniškem operacijskem sistemu na svetu.