Dit is een heel specifiek type exploit dat allerlei soorten software teistert.

Use-After-Free (UAF) is een primitieve kwetsbaarheid voor geheugenbeschadiging die een aanzienlijke bedreiging blijft vormen voor alle soorten software, van besturingssystemen tot applicatiesoftware. Deze kritieke beveiligingsfout treedt op wanneer een toepassingscomponent toegang probeert te krijgen tot gegevens in een geheugenadres dat al is vrijgegeven, vandaar de naam: use-after-free.

UAF-kwetsbaarheden kunnen leiden tot mogelijke exploitatie van software of zelfs tot systeemcompromissen. Dit is wat de UAF-kwetsbaarheid is, waarom het gebeurt en hoe u uw software kunt beveiligen tegen een UAF-kwetsbaarheid.

Wat is de Use-After-Free (UAF)-kwetsbaarheid?

Laten we, voordat we ingaan op de Use-After-Free-kwetsbaarheid, een stap terug doen en enkele basisprincipes van geheugenbeheer begrijpen. Wanneer een programma wordt uitgevoerd, worden de gegevens en code in het geheugen geladen.

Geheugenbeheer is het proces waarbij wordt beheerd hoe gegevens en code op een optimale manier in het geheugen kunnen worden opgeslagen (geheugentoewijzing genoemd) en verwijderd (geheugendeallocatie genoemd). De twee primaire geheugensegmenten waarin programmagegevens worden opgeslagen, zijn

instagram viewer
de stapel en de hoop.

Aan programma's kan geheugenruimte statisch op de stapel en dynamisch op de heap worden toegewezen. Een "use-after-free"-kwetsbaarheid doet zich voor wanneer programmeurs dynamische geheugentoewijzing en deallocatie niet correct beheren in hun programma's. Dit betekent dat de UAF-klasse van kwetsbaarheden een vorm van heap-exploitatie is. Om deze kwetsbaarheid beter te begrijpen, helpt het om er een goed begrip van te hebben hoe pointers werken bij het programmeren.

Use-After-Free (UAF) is, zoals de naam al doet vermoeden, een type kwetsbaarheid voor primitieve geheugenbeschadiging die optreedt wanneer een object dat al is De toewijzing uit het geheugen is opnieuw geopend, wat leidt tot crashes of onbedoelde gevolgen zoals geheugenlekken, Escalation of Privilege (EOP) of willekeurige code executie. Laten we eens kijken hoe deze aandoening zich in de eerste plaats voordoet en hoe deze wordt uitgebuit.

Hoe wordt Use-After-Free (UAF) uitgebuit?

Use-After-Free (UAF), zoals de naam al doet vermoeden, is een primitieve kwetsbaarheid voor geheugenbeschadiging die optreedt wanneer een programma toegang blijft krijgen tot geheugenlocaties die het heeft vrijgemaakt. Laten we een voorbeeldcode bekijken:

#erbij betrekken <standaard.H>
#erbij betrekken <standaardlib.H>

intvoornaamst(){
int *MUO = malloc (groottevan(int));
*MUO = 69420;
printf("Waarde: %d\n", *MUO);
gratis (MUO);
printf("Waarde?: %d\n", *MUO);
opbrengst0;
}

Zou je de kwetsbaarheid kunnen ontdekken? Zoals je kunt zien, is in deze code de MUO aanwijzer wordt ongedaan gemaakt uit het geheugen met behulp van de vrij() functie, maar het wordt opnieuw aangeroepen in de volgende regel met behulp van de printf() functie. Dit resulteert in onverwacht programmagedrag en afhankelijk van waar de kwetsbaarheid aanwezig is in software, kan deze worden gebruikt om escalatie van bevoegdheden en geheugenlekken te verkrijgen.

Hoe Use-After-Free te beperken?

UAF ontstaat door fouten in de programmering van een applicatie. Er zijn enkele voorzorgsmaatregelen die u kunt nemen om Use-After-Free-kwetsbaarheden in uw software te voorkomen.

Hier volgen enkele best practices die u kunt toepassen om kwetsbaarheden voor geheugenbeschadiging in uw software te minimaliseren:

  • Het gebruik van geheugenveilige programmeertalen zoals Rust met ingebouwde mechanismen om primitieve kwetsbaarheden voor geheugenbeschadiging zoals UAF, Buffer Overflows, etc. te voorkomen. Als u programmeertalen zoals C/C++ gebruikt, is de kans groter dat u geheugenfouten in uw code introduceert. Om dezelfde reden migreren zelfs besturingssystemen zoals Windows en Linux langzaam naar Rust. Je zou ook moeten overwegen leren over Roest als u low-level programma's maakt.
  • Naast het gebruik van een geheugenveilige taal, wordt aanbevolen best practices te volgen, zoals het instellen van een aanwijzer op NULL-waarde nadat deze is vrijgegeven om introductie van Use-After-Free-kwetsbaarheid te voorkomen.
  • U kunt ook technieken zoals One Time Allocation (OTA) implementeren die voorkomen dat aanvallers toegang krijgen tot vrijgekomen geheugen objecten en een strikt objectlevenscyclusbeleid, dat helpt bij het bijhouden van elk geheugenobject dat is toegewezen en ongedaan gemaakt. Houd er echter rekening mee dat deze implementaties de geheugen- en prestatieoverhead kunnen verhogen.

Voorbeelden uit de praktijk van een Use-After-Free (UAF)-kwetsbaarheid

De Use-After-Free (UAF)-kwetsbaarheid is ontdekt en misbruikt in verschillende real-world scenario's, van webbrowsers tot Android-kernel tot alledaagse applicaties. Hieruit blijkt de noodzaak van proactieve beveiligingsmaatregelen. Enkele praktijkvoorbeelden van UAF zijn:

  • Internetbrowsers: UAF-kwetsbaarheden in webbrowsers zijn misbruikt om willekeurige code uit te voeren, de privacy van gebruikers in gevaar te brengen en aanvallen uit te voeren op het uitvoeren van externe code. Een recent voorbeeld is CVE-2021-38008, dat misbruik maakte van een UAF-kwetsbaarheid in Google Chrome, waardoor aanvallers willekeurige code op afstand op de slachtoffercomputer konden uitvoeren.
  • Besturingssystemen: UAF-kwetsbaarheden gevonden in Windows-/Linux-/Android-kernels hebben aanvallers in staat gesteld verhoogde rechten te verkrijgen, beveiligingsmechanismen te omzeilen en doorzettingsvermogen te verkrijgen. Er is een overvloed aan UAF-kwetsbaarheden die zijn gevonden en tot op heden nog steeds worden aangetroffen in de kernels van het besturingssysteem. Op het moment van schrijven werd CVE-2023-3269, nog een andere UAF-kwetsbaarheid in de Linux-kernel die leidde tot escalatie van bevoegdheden, publiekelijk vrijgegeven. CVE-2022-23270 is een voorbeeld van een UAF-kwetsbaarheid in de Windows-kernel.
  • Softwaretoepassingen: UAF-kwetsbaarheden in softwaretoepassingen zijn misbruikt om programma's te manipuleren gedrag, wat leidt tot het vrijgeven van informatie, het uitvoeren van willekeurige code, het crashen van programma's en in het ergste geval privileges escalatie. Meerdere softwaretoepassingen waren en zijn nog steeds vatbaar voor UAF-aanvallen. Deze software zijn meestal C/C++-programma's die zijn ontwikkeld met inefficiënte en onveilige benaderingen van geheugenbeheer.

Voor meer informatie over Use-After-Free-kwetsbaarheden in real-world applicaties kunt u de officiële MITRE CVE lijstpagina en sorteer op Use-After-Free-trefwoord.

Efficiënte geheugentoewijzing helpt software veilig te maken

Optimale en goed doordachte geheugentoewijzing helpt u al een heel eind om uw toepassingen te beschermen tegen veelvoorkomende kwetsbaarheden voor primitieve geheugenbeschadiging.

UAF samen met Time Of Check Time of Use (TOCTOU), race-condities en Buffer Overflows (BOF) zijn enkele van de meest misbruikte geheugenkwetsbaarheden. Al deze kunnen worden vermeden door te leren hoe het geheugen van uw programma wordt beheerd door het platform waarop het draait. Dit geeft u duidelijkheid over hoe het besturingssysteem uw programma in het geheugen toewijst en voorziet u van de tools om software te ontwerpen voor optimale prestaties en beveiliging.

Als je dat nog niet hebt gedaan, kun je beginnen met te begrijpen hoe geheugenbeheer wordt uitgevoerd op Linux, 's werelds meest gebruikte serverbesturingssysteem.