Dette er en veldig spesifikk type utnyttelse som plager all slags programvare.

Use-After-Free (UAF) er en primitiv minnekorrupsjonssårbarhet som fortsetter å utgjøre en betydelig trussel mot alle typer programvare fra operativsystemer til applikasjonsprogramvare. Denne kritiske sikkerhetsfeilen oppstår når en applikasjonskomponent prøver å få tilgang til data i en minneadresse som allerede er frigjort, derav navnet – bruk-etter-fri.

UAF-sårbarheter kan føre til potensiell utnyttelse av programvare eller til og med systemkompromittering. Her er hva UAF-sårbarheten er, hvorfor det skjer, og hvordan du kan sikre programvaren din fra en UAF-sårbarhet.

Hva er sårbarheten Use-After-Free (UAF)?

Før vi dykker inn i Use-After-Free-sårbarheten, la oss ta et skritt tilbake og forstå noen grunnleggende prinsipper om minnebehandling. Når et program kjøres, lastes dets data og kode inn i minnet.

Minnehåndtering er prosessen med å administrere hvordan man lagrer (kalt minneallokering) og fjerner (kalt minnedeallokering) data og kode i minnet på en optimal måte. De to primære minnesegmentene der programdata er lagret er

stabelen og haugen.

Programmer kan tildeles minneplass statisk på stabelen og dynamisk på haugen. En bruk-etter-fri sårbarhet oppstår når programmerere ikke administrerer dynamisk minneallokering og deallokering riktig i programmene sine. Dette betyr at UAF-klassen av sårbarheter er en type heap-utnyttelse. For å forstå denne sårbarheten bedre, hjelper det å ha en sterk forståelse av hvordan pekere fungerer i programmering.

Use-After-Free (UAF) som navnet antyder, er en type primitiv minnekorrupsjonssårbarhet som oppstår når et objekt som allerede har blitt deallokert fra minnet åpnes igjen, noe som fører til krasjer eller utilsiktede konsekvenser som minnelekkasjer, Escalation of Privilege (EOP) eller vilkårlig kode henrettelse. La oss lære hvordan denne tilstanden oppstår i utgangspunktet og hvordan den utnyttes.

Hvordan utnyttes Use-After-Free (UAF)?

Use-After-Free (UAF), som navnet antyder, er en primitiv minnekorrupsjonssårbarhet som oppstår når et program fortsetter å få tilgang til minneplasseringer som det har frigjort. La oss ta en titt på en eksempelkode:

#inkludere <stdio.h>
#inkludere <stdlib.h>

inthoved-(){
int *MUO = malloc (størrelse på(int));
*MUO = 69420;
printf("Verdi: %d\n", *MUO);
gratis (MUO);
printf("Verdi?: %d\n", *MUO);
komme tilbake0;
}

Kan du oppdage sårbarheten? Som du kan se, i denne koden, er MUO pekeren deallokeres fra minnet ved hjelp av gratis() funksjonen, men den kalles opp igjen i neste linje ved hjelp av printf() funksjon. Dette resulterer i uventet programatferd, og avhengig av hvor sårbarheten er til stede i programvaren, kan den utnyttes for å få rettighetseskalering og minnelekkasjer.

Hvordan redusere bruk-etter-fri?

UAF oppstår på grunn av feil i programmeringen av en applikasjon. Det er noen få forholdsregler du kan ta for å unngå Use-After-Free-sårbarheter i programvaren din.

Her er noen gode fremgangsmåter du kan bruke for å minimere minnekorrupsjonssårbarheter i programvaren din:

  • Bruk av minnesikre programmeringsspråk som Rust med innebygde mekanismer for å forhindre sårbarheter med primitive minnekorrupsjon som UAF, Buffer Overflows, etc. Hvis du bruker programmeringsspråk som C/C++, er det mer sannsynlig at du introduserer minnefeil i koden din. Av samme grunn migrerer selv operativsystemer som Windows og Linux sakte til Rust. Du bør også vurdere lære om Rust hvis du lager programmer på lavt nivå.
  • I tillegg til å bruke et minnesikkert språk, anbefales det at du følger beste fremgangsmåter som å sette en peker til NULL-verdi etter at den er frigjort for å unngå introduksjon av Use-After-Free-sårbarhet.
  • Du kan også implementere teknikker som One Time Allocation (OTA) som hindrer angripere i å få tilgang til frigjort minne objekter og en streng objektlivssykluspolicy, som hjelper deg med å holde styr på hvert minneobjekt som er tildelt og deallokert. Husk imidlertid at disse implementeringene kan øke minnet og ytelseskostnadene.

Eksempler i den virkelige verden på UAF-sårbarhet (Use-After-Free).

UAF-sårbarheten (Use-After-Free) har blitt oppdaget og utnyttet i ulike virkelige scenarier, fra nettlesere til Android-kjerner til hverdagsapplikasjoner. Dette viser behovet for proaktive sikkerhetstiltak. Noen virkelige eksempler på UAF inkluderer:

  • Nettlesere: UAF-sårbarheter i nettlesere har blitt utnyttet til å kjøre vilkårlig kode, kompromittere brukernes personvern og utføre eksternt kodeutførelsesangrep. Et nylig eksempel kan være CVE-2021-38008, som utnyttet en UAF-sårbarhet i Google Chrome, slik at trusselaktører kan kjøre vilkårlig kode eksternt på offermaskinen.
  • Operativsystemer: UAF-sårbarheter funnet i Windows/Linux/Android-kjerner har gjort det mulig for angripere å få økte privilegier, omgå sikkerhetsmekanismer og få utholdenhet. Det er en mengde UAF-sårbarheter som er funnet og fortsatt finnes i operativsystemkjerner til denne datoen. I skrivende stund, CVE-2023-3269, ble enda en UAF-sårbarhet i Linux-kjernen som førte til rettighetseskalering utgitt offentlig. CVE-2022-23270 er et eksempel på en UAF-sårbarhet i Windows-kjernen.
  • Programvareapplikasjoner: UAF-sårbarheter i programvareapplikasjoner har blitt utnyttet til å manipulere programmer oppførsel, som fører til avsløring av informasjon, kjøring av vilkårlig kode, programkrasj og i verste fall privilegier eskalering. Flere programvareapplikasjoner har vært og er fortsatt utsatt for UAF-angrep. Disse programvarene er for det meste C/C++-programmer som er utviklet med ineffektive og usikre minnehåndteringsmetoder.

For å lære mer om Use-After-Free-sårbarheter i virkelige applikasjoner kan du sjekke offisiell MITRE CVE listeside og sorter etter Use-After-Free-nøkkelord.

Effektiv minnetildeling bidrar til å gjøre programvaren sikker

Optimal og gjennomtenkt minneallokering går langt for å beskytte applikasjonene dine fra å bli offer for vanlige primitive minnekorrupsjonssårbarheter.

UAF sammen med Time Of Check Time of Use (TOCTOU), løpsforhold og Buffer Overflows (BOF) er noen av de mest utnyttede minnesårbarhetene. Alle disse kan unngås ved å lære hvordan programmets minne administreres av plattformen det kjører på. Dette gir deg klarhet i hvordan operativsystemet allokerer programmet ditt i minnet og utstyrer deg med verktøyene for å designe programvare for optimal ytelse og sikkerhet.

Hvis du ikke allerede har gjort det, kan du begynne med å forstå hvordan minneadministrasjon gjøres på Linux, verdens mest brukte serveroperativsystem.