Ide o veľmi špecifický typ exploitu, ktorý postihuje všetky druhy softvéru.
Use-After-Free (UAF) je primitívna zraniteľnosť proti poškodeniu pamäte, ktorá naďalej predstavuje významnú hrozbu pre všetky typy softvéru od operačných systémov až po aplikačný softvér. Táto kritická bezpečnostná chyba nastane, keď sa komponent aplikácie pokúsi získať prístup k údajom na adrese pamäte, ktorá už bola uvoľnená, odtiaľ názov — use-after-free.
Zraniteľnosť UAF môže viesť k potenciálnemu zneužitiu softvéru alebo dokonca k ohrozeniu systému. Tu sa dozviete, čo je zraniteľnosť UAF, prečo k nej dochádza a ako môžete zabezpečiť svoj softvér pred zraniteľnosťou UAF.
Čo je zraniteľnosť UAF (Use-After-Free)?
Predtým, ako sa ponoríme do zraniteľnosti Use-After-Free, urobme krok späť a pochopme niektoré základy správy pamäte. Keď sa program spustí, jeho dáta a kód sa načítajú do pamäte.
Správa pamäte je proces riadenia, ako optimálnym spôsobom ukladať (nazývané prideľovanie pamäte) a odstraňovať (nazývané uvoľnenie pamäte) údaje a kód v pamäti. Dva primárne pamäťové segmenty, kde sú uložené programové dáta, sú
hromadu a hromadu.Programom je možné prideliť pamäťový priestor staticky na zásobníku a dynamicky na halde. Zraniteľnosť bez použitia po použití sa vyskytuje, keď programátori vo svojich programoch správne nespravujú dynamickú alokáciu pamäte a dealokáciu. To znamená, že trieda zraniteľností UAF je typom využívania haldy. Ak chcete lepšie porozumieť tejto zraniteľnosti, pomôže vám silné pochopenie ako fungujú ukazovatele v programovaní.
Use-After-Free (UAF), ako už názov napovedá, je typ zraniteľnosti primitívneho poškodenia pamäte, ku ktorej dochádza pri objekte, ktorý už bol uvoľnený z pamäte je znovu prístupný, čo vedie k zlyhaniam alebo neúmyselným následkom, ako sú úniky pamäte, eskalácia privilégií (EOP) alebo svojvoľný kód exekúcie. Poďme sa dozvedieť, ako k tomuto stavu vôbec dochádza a ako sa využíva.
Ako sa využíva Use-After-Free (UAF)?
Use-After-Free (UAF), ako už názov napovedá, je primitívna chyba zabezpečenia proti poškodeniu pamäte, ku ktorej dochádza, keď program pokračuje v prístupe k miestam pamäte, ktoré uvoľnil. Pozrime sa na príklad kódu:
#include <stdio.h>
#include <stdlib.h>
intHlavná(){
int *MUO = malloc (sizeof(int));
*MUO = 69420;
printf("Hodnota: %d\n", *MUO);
voľný (MUO);
printf("Hodnota?: %d\n", *MUO);
vrátiť0;
}
Podarilo sa odhaliť zraniteľnosť? Ako môžete vidieť, v tomto kóde je MUO ukazovateľ je uvoľnený z pamäte pomocou zadarmo() funkcia, napriek tomu sa v nasledujúcom riadku zavolá znova pomocou funkcie printf() funkciu. Výsledkom je neočakávané správanie programu a v závislosti od toho, kde sa v softvéri nachádza chyba zabezpečenia, môže byť využitá na získanie eskalácie privilégií a únikov pamäte.
Ako zmierniť používanie-po-zadarmo?
K UAF dochádza v dôsledku chýb v programovaní aplikácie. Existuje niekoľko opatrení, ktoré môžete urobiť, aby ste sa vyhli zraniteľnostiam softvéru Use-After-Free.
Tu je niekoľko osvedčených postupov, ktoré si môžete osvojiť, aby ste minimalizovali zraniteľnosti súvisiace s poškodením pamäte vo vašom softvéri:
- Používanie pamäťovo bezpečných programovacích jazykov, ako je Rust, so vstavanými mechanizmami na zabránenie primitívnym zraniteľnostiam proti poškodeniu pamäte, ako je UAF, pretečenie vyrovnávacej pamäte atď. Ak používate programovacie jazyky ako C/C++, s väčšou pravdepodobnosťou zavediete do kódu chyby pamäte. Z rovnakého dôvodu dokonca aj operačné systémy ako Windows a Linux pomaly migrujú na Rust. Mali by ste tiež zvážiť učenie o Rustovi ak vytvárate programy nízkej úrovne.
- Okrem používania jazyka bezpečného pre pamäť sa odporúča dodržiavať osvedčené postupy, ako je nastavenie ukazovateľa na hodnotu NULL po jeho uvoľnení, aby ste sa vyhli akémukoľvek zavedeniu zraniteľnosti Use-After-Free.
- Môžete tiež implementovať techniky ako One Time Allocation (OTA), ktoré zabraňujú útočníkom v prístupe k uvoľnenej pamäti objektov a prísne zásady životného cyklu objektov, ktoré pomáhajú pri sledovaní každého pamäťového objektu, ktorý je pridelený a uvoľnené. Majte však na pamäti, že tieto implementácie môžu zvýšiť réžiu pamäte a výkonu.
Príklady zraniteľnosti typu Use-After-Free (UAF) v reálnom svete
Zraniteľnosť Use-After-Free (UAF) bola objavená a zneužitá v rôznych reálnych scenároch od webových prehliadačov cez jadro Androidu až po každodenné aplikácie. To poukazuje na potrebu proaktívnych bezpečnostných opatrení. Niektoré príklady UAF v reálnom svete zahŕňajú:
- Internetové prehliadače: Zraniteľnosť UAF vo webových prehliadačoch bola zneužitá na spustenie ľubovoľného kódu, narušenie súkromia používateľov a na vykonávanie útokov na vzdialené spúšťanie kódu. Nedávnym príkladom by bol CVE-2021-38008, ktorý využil zraniteľnosť UAF v prehliadači Google Chrome a umožnil aktérom hrozieb spustiť ľubovoľný kód na diaľku na počítači obete.
- Operačné systémy: Zraniteľnosť UAF nájdená v jadrách Windows/Linux/Android umožnila útočníkom získať zvýšené privilégiá, obísť bezpečnostné mechanizmy a získať vytrvalosť. Existuje množstvo zraniteľností UAF, ktoré sa našli a dodnes sa nachádzajú v jadrách operačných systémov. V čase písania tohto článku, CVE-2023-3269, bola verejne uvoľnená ďalšia zraniteľnosť UAF v jadre Linuxu vedúca k eskalácii privilégií. CVE-2022-23270 je príkladom zraniteľnosti UAF v jadre Windowsu.
- Softvérové aplikácie: Zraniteľnosť UAF v softvérových aplikáciách bola zneužitá na manipuláciu s programom správanie, ktoré vedie k prezradeniu informácií, svojvoľnému spusteniu kódu, pádu programu a v najhoršom prípade k privilégiám eskaláciu. Viaceré softvérové aplikácie boli a stále sú náchylné na útoky UAF. Tieto softvéry sú väčšinou programy C/C++, ktoré boli vyvinuté s neefektívnymi a nebezpečnými prístupmi k správe pamäte.
Ak sa chcete dozvedieť viac o zraniteľnostiach typu Use-After-Free v aplikáciách v reálnom svete, môžete skontrolovať oficiálny MITER CVE stránku zoznamu a zoraďte podľa kľúčového slova Use-After-Free.
Efektívne prideľovanie pamäte pomáha zaistiť bezpečnosť softvéru
Optimálna a dobre premyslená alokácia pamäte je dlhá cesta k ochrane vašich aplikácií, aby sa nestali obeťou bežných primitívnych zraniteľností súvisiacich s poškodením pamäte.
UAF spolu s časom kontroly času použitia (TOCTOU), rasovými podmienkami a pretečením vyrovnávacej pamäte (BOF) sú niektoré z najčastejšie využívaných zraniteľností pamäte. Tomuto všetkému sa dá vyhnúť, ak sa naučíte, ako spravuje pamäť vášho programu platforma, na ktorej beží. To vám dáva prehľad o tom, ako operačný systém alokuje váš program v pamäti, a vybaví vás nástrojmi na navrhovanie softvéru pre optimálny výkon a bezpečnosť.
Ak ste to ešte neurobili, môžete začať tým, že pochopíte, ako sa správa pamäte vykonáva v systéme Linux, najpoužívanejšom serverovom operačnom systéme na svete.