Jedná se o velmi specifický typ exploitu, který postihuje všechny druhy softwaru.
Use-After-Free (UAF) je primitivní chyba zabezpečení proti poškození paměti, která nadále představuje významnou hrozbu pro všechny typy softwaru od operačních systémů po aplikační software. Tato kritická bezpečnostní chyba nastane, když se komponenta aplikace pokusí získat přístup k datům na adrese paměti, která již byla uvolněna, odtud název — use-after-free.
Zranitelnost UAF může vést k potenciálnímu zneužití softwaru nebo dokonce ke kompromitaci systému. Zde je uvedeno, co je zranitelnost UAF, proč k ní dochází a jak můžete zabezpečit svůj software před zranitelností UAF.
Co je zranitelnost UAF (Use-After-Free)?
Než se ponoříme do zranitelnosti Use-After-Free, udělejme krok zpět a pochopme některé základy správy paměti. Když je program spuštěn, jeho data a kód se načtou do paměti.
Správa paměti je proces správy toho, jak optimálním způsobem ukládat (nazývané alokace paměti) a odstraňovat (nazývané dealokace paměti) data a kód v paměti. Dva primární paměťové segmenty, kde jsou uložena programová data, jsou
hromadu a hromadu.Programům lze přidělovat paměťový prostor staticky na zásobníku a dynamicky na haldě. K chybě zabezpečení bez použití po použití dochází, když programátoři ve svých programech správně nespravují dynamickou alokaci paměti a dealokaci. To znamená, že třída zranitelností UAF je druhem zneužití haldy. Abychom této zranitelnosti lépe porozuměli, je dobré ji dobře porozumět jak fungují ukazatele v programování.
Use-After-Free (UAF), jak název napovídá, je typem zranitelnosti primitivního poškození paměti, ke kterému dochází, když objekt již byl uvolněný z paměti je znovu přístupný, což vede k pádům nebo nezamýšleným následkům, jako jsou úniky paměti, eskalace oprávnění (EOP) nebo libovolný kód provedení. Pojďme se naučit, jak k tomuto stavu vůbec dochází a jak se využívá.
Jak je zneužíván Use-After-Free (UAF)?
Use-After-Free (UAF), jak název napovídá, je primitivní chyba zabezpečení proti poškození paměti, ke které dochází, když program pokračuje v přístupu k paměťovým místům, která uvolnil. Podívejme se na příklad kódu:
#zahrnout <stdio.h>
#zahrnout <stdlib.h>
inthlavní(){
int *MUO = malloc (sizeof(int));
*MUO = 69420;
printf("Hodnota: %d\n", *MUO);
zdarma (MUO);
printf("Hodnota?: %d\n", *MUO);
vrátit se0;
}
Podařilo se zjistit zranitelnost? Jak můžete vidět, v tomto kódu je MUO ukazatel je uvolněn z paměti pomocí volný, uvolnit() funkce, přesto je volána znovu na dalším řádku pomocí printf() funkce. To má za následek neočekávané chování programu a v závislosti na tom, kde se chyba zabezpečení v softwaru vyskytuje, může být využita k získání eskalace oprávnění a úniků paměti.
Jak zmírnit používání-po-zdarma?
K UAF dochází v důsledku chyb v programování aplikace. Existuje několik opatření, která můžete učinit, abyste se vyhnuli zranitelnosti softwaru Use-After-Free.
Zde je několik osvědčených postupů, které můžete přijmout, abyste minimalizovali zranitelnosti poškození paměti ve vašem softwaru:
- Používání paměťově bezpečných programovacích jazyků, jako je Rust, s vestavěnými mechanismy, aby se zabránilo zranitelnosti primitivního poškození paměti, jako je UAF, přetečení vyrovnávací paměti atd. Pokud používáte programovací jazyky jako C/C++, je pravděpodobnější, že do kódu zavedete chyby paměti. Ze stejného důvodu i operační systémy jako Windows a Linux pomalu migrují na Rust. Měli byste také zvážit učení o Rustu pokud vytváříte programy nízké úrovně.
- Kromě používání jazyka bezpečného pro paměť se doporučuje, abyste se řídili osvědčenými postupy, jako je nastavení ukazatele na hodnotu NULL po jeho uvolnění, abyste se vyhnuli zavedení chyby zabezpečení Use-After-Free.
- Můžete také implementovat techniky jako One Time Allocation (OTA), které brání útočníkům v přístupu k uvolněné paměti objektů a Strict Object Lifecycle Policy, která pomáhá při sledování každého paměťového objektu, který je alokován a uvolněno. Mějte však na paměti, že tyto implementace mohou zvýšit režii paměti a výkonu.
Příklady zranitelnosti UAF (Use-After-Free) v reálném světě
Chyba zabezpečení Use-After-Free (UAF) byla objevena a zneužita v různých reálných scénářích od webových prohlížečů přes jádro Androidu až po každodenní aplikace. To ukazuje na potřebu proaktivních bezpečnostních opatření. Některé příklady UAF v reálném světě zahrnují:
- Internetové prohlížeče: Zranitelnosti UAF ve webových prohlížečích byly zneužity ke spouštění libovolného kódu, narušování soukromí uživatelů a provádění útoků na vzdálené spouštění kódu. Nedávným příkladem by byl CVE-2021-38008, který zneužil zranitelnost UAF v prohlížeči Google Chrome a umožnil aktérům hrozeb spouštět libovolný kód na dálku na počítači oběti.
- Operační systémy: Chyby zabezpečení UAF nalezené v jádrech Windows/Linux/Android umožnily útočníkům získat zvýšená oprávnění, obejít bezpečnostní mechanismy a získat vytrvalost. Existuje nepřeberné množství zranitelností UAF, které byly nalezeny a dodnes se nacházejí v jádrech operačních systémů. V době psaní tohoto článku, CVE-2023-3269, byla veřejně uvolněna další zranitelnost UAF v jádře Linuxu vedoucí k eskalaci oprávnění. CVE-2022-23270 je příkladem chyby zabezpečení UAF v jádře Windows.
- Softwarové aplikace: Zranitelnosti UAF v softwarových aplikacích byly zneužity k manipulaci s programem chování, které vede k prozrazení informací, svévolnému spuštění kódu, pádu programu a v nejhorším případě k privilegiím eskalace. Mnoho softwarových aplikací bylo a stále je náchylných k útokům UAF. Tyto programy jsou většinou programy C/C++, které byly vyvinuty s neefektivními a nebezpečnými přístupy ke správě paměti.
Chcete-li se dozvědět více o zranitelnostech Use-After-Free v aplikacích v reálném světě, můžete zkontrolovat oficiální MITER CVE stránku seznamu a seřadit podle klíčového slova Use-After-Free.
Efektivní alokace paměti pomáhá zabezpečit software
Optimální a dobře promyšlená alokace paměti poskytuje dlouhou cestu k ochraně vašich aplikací, aby se nestaly kořistí běžných zranitelností primitivního poškození paměti.
UAF spolu s časem kontroly času použití (TOCTOU), podmínkami závodu a přetečením vyrovnávací paměti (BOF) jsou některé z nejčastěji využívaných zranitelností paměti. Tomu všemu se lze vyhnout tím, že se naučíte, jak spravuje paměť vašeho programu platforma, na které běží. Díky tomu budete mít jasno v tom, jak operační systém přiděluje váš program v paměti, a vybaví vás nástroji pro návrh softwaru pro optimální výkon a zabezpečení.
Pokud jste to ještě neudělali, můžete začít tím, že pochopíte, jak se správa paměti provádí v Linuxu, celosvětově nejpoužívanějším operačním systému pro servery.