Hobe sprøjtning

Heap spraying i informationssikkerhed  er et angreb , der bruger fejl i arbejdet med applikationens hukommelse . Ved at angribe med heap-spray tvinger en hacker en applikation til at allokere hukommelse til et stort antal objekter, der indeholder ondsindet kode . Dette øger succesraten for en udnyttelse , der flytter udførelsestråden til en eller anden position i heapen . Det er vigtigt at forstå, at uden en udnyttelse, der giver dig mulighed for at ændre udførelsesstrømmen, vil heapsprøjtning ikke forårsage nogen skade. Angrebet er baseret på forudsigeligheden af ​​bunkens position i processens adresserum . Derudover er allokering af hukommelse på heapen en deterministisk operation, som gør det muligt at anvende denne teknik med succes. Heap spraying er især effektiv i browsere , hvor en hacker kan allokere hukommelse ved hjælp af flere linjer JavaScripten webside . En vigtig rolle spilles af ligheden mellem hukommelsesallokering i forskellige operativsystemer , hvilket gør dette angreb på tværs af platforme. Som et resultat er det muligt at indsætte en bestemt sekvens af bytes (for eksempel en maskininstruktion) i en forud forudsagt adresse i målprocessens hukommelse [ 1] .

Når en proces oprettes i operativsystemet , tildeles et adresseområde [2] [3] [4] til dets behov , som indeholder brugerdata, eksekverbar kode og nogle systemoplysninger, der afhænger af det specifikke operativsystem. Brugerdata fordeles mellem heapen og stakken afhængigt af, hvordan hukommelsen er allokeret til dem [5] . For eksempel gemmer staksegmentet variable med en automatisk allokeringsklasse samt information, der gemmes hver gang en funktion kaldes, såsom returadressen . Heapen  er et område med dynamisk hukommelse , det vil sige, når hukommelsen allokeres dynamisk, tildeles plads på heapen. Traditionelt vokser bunke og stak mod hinanden [2] [3] [4] .

Grundlæggende koncept

Dyngesprøjtning er ikke en sårbarhed i sig selv . Det kan dog bruges til at levere ondsindet kode til en process eksekverbare hukommelsesområde . Denne teknik udnytter determinismen i systemets hukommelsesallokeringsoperation . Det betyder, at en stor mængde hukommelse ofte er placeret med samme offset i procesadresserummet . Denne teknik er dog ikke i stand til at skabe et brud i selve sikkerhedssystemet. Derfor kræver dets brug en sårbarhed, der giver dig mulighed for at ændre rækkefølgen for udførelse af kommandoer (maskininstruktioner) [6] .

Det er svært at bruge denne teknik, fordi antallet af faktorer, der påvirker udførelsen af ​​processen (set fra en hackers synspunkt) er meget stort. Ved brug af heap-sprøjtning kan du dog udføre et stort antal instruktioner, hvilket delvist kompenserer for denne vanskelighed og giver dig mulighed for at øge sandsynligheden for en vellykket revne [7] .

Heap spraying kan implementeres for de fleste operativsystemer og arkitekturer . Den største vanskelighed er at finde en sårbarhed , der giver dig mulighed for at omdirigere strømmen af ​​eksekvering . Dynamisk allokering af en stor mængde hukommelse, som tidligere nævnt, er en operation, der giver dig mulighed for at forudsige bunkens position i hukommelsen (på tidspunktet for kortlægning af virtuel hukommelse til fysisk hukommelse ) [8] . Hver gang du udfører den samme sekvens af hukommelsesadgange, vil heapen højst sandsynligt ende det samme sted [6] [7] .

Men for at øge denne sandsynlighed er det nødvendigt, at størrelsen af ​​et stykke allokeret hukommelse kan sammenlignes med størrelsen på et segment eller en side , afhængigt af den måde hukommelsen er organiseret på [7] .

Hovedproblemet med dette angreb er at ændre strømmen af ​​eksekvering . Uden evnen til at opsnappe henrettelsen giver denne type angreb ikke mening. Nogle funktioner gemmer muligvis returadressen på heapen, i hvilket tilfælde en hacker kan forsøge at ændre dem. I dette tilfælde, når den vender tilbage fra en sådan funktion, vil den flytte til en hukommelsesplacering , der er praktisk for en hacker , og som et resultat vil ondsindet kode begynde at udføre . Enhver funktion, der læser en adresse på heapen, kan udnyttes som en sårbarhed. En hacker kan erstatte denne adresse med adressen på et stykke hukommelse, han har ændret. Dette kan føre til omdirigering af udførelsestråden til ondsindet kode. Dette er dog ikke så let, som det ser ud til [1] [8] .

Korrektheden af ​​adressen (dens størrelse, offset i forhold til begyndelsen af ​​siden), der bruges til substitution, afhænger i høj grad af arkitekturen. Derfor bruges der i praksis blokke, der hovedsageligt består af NOP'er , der tilføjer den nødvendige kode til sidst. Denne teknik giver dig mulighed for ikke at bekymre dig om nøjagtigheden af ​​adresseberegningen og dirigere udførelsesflowet til en omtrentlig placering i adresserummet [1] .

Trin til implementering af heap-sprøjtning:

Denne type angreb er meget effektiv i browsere . De fleste browsere understøtter scriptudførelse . En hacker kan allokere den nødvendige hukommelse ved hjælp af et par linjer JavaScript eller ActionScript på en webside. En vigtig rolle spilles af ligheden mellem hukommelsesallokering i forskellige operativsystemer , hvilket gør dette angreb på tværs af platforme. Desuden vil de adresser, du skal hoppe til, ligne [9] .

Historie

Dyngesprøjtning blev første gang brugt i 2001 og blev udbredt i sommeren 2005. Siden da er der fundet en lang række sårbarheder i Internet Explorer [10] [11] . Bedrifterne lignede hinanden meget. Hver sådan udnyttelse bestod af heap-sprøjtning, hvis implementeringsmetode ikke ændrede sig, og overførsel af programtælleren til den påkrævede placering i hukommelsen . Derfor blev en ny udnyttelse opnået ved at ændre nogle få linjer HTML og skifte til en ny sårbarhed [1] .

Implementering

JavaScript

Den nemmeste måde at allokere plads i browserens hukommelse  på er at erklære en strengvariabel og initialisere den [1] .

Eksempler på hukommelsesallokering i JavaScript [9] :

var myvar = "CORELAN!" ; var myvar2 = ny streng ( "CORELAN!" ); var myvar3 = myvar + myvar2 ; var myvar4 = myvar3 . understreng ( 0 , 8 );

Disse er meget enkle eksempler, fordi de fremhævede linjer er små. Et stykke shellcode er meget større, men stadig mindre end en hel side hukommelse .

Hypotetisk er det muligt at skrive den nødvendige shell-kode mange gange i hver blok, vi tildeler, men så skal angriberen holde styr på, hvilken specifik adresse pointeren går til, da den ikke skal falde ind i midten af ​​den eksekverbare kode . Normalt handler de anderledes - de vælger stykker, der indeholder mange NOP'er , og til sidst foreskriver de de nødvendige kommandoer. Så på grund af det lineære arrangement af blokke i heapen er det lettere at observere lineariteten af ​​kodeudførelse, og der er ingen grund til at bekymre sig om nøjagtigheden af ​​at ramme begyndelsen af ​​et stykke hukommelse [9] .

Med det rigtige valg af størrelse bør de tildelte stykker hukommelse være meget tæt på størrelsen af ​​heap-elementet. Hvis det tildelte stykke hukommelse er mindre, vil den resterende plads være ledig. Hukommelsesadministratoren vil i bedste fald efterlade systemaffald i denne "utildelte plads", og i værste fald placere en genstand af den rigtige størrelse. Under alle omstændigheder vil dette resultere i en fejl, når du forsøger at udføre denne hukommelsesplacering [1] [9] .

Således ser scriptet brugt af angriberne således ud [9] :

< html > < script > var shellcode = unescape ( '%u\4141%u\4141' ); // dette er CORELAN label var bigblock = unescape ( '%u\9090%u\9090' ); //90 er NOP-kode var headersize = 20 ; var slackspace = headersize + shellcode . længde ; // indledende størrelse på vores chunk: nyttig kode + header størrelse while ( bigblock . length < slackspace ) bigblock += bigblock ; //udfyldning med NOP'er var fillblock = bigblock . understreng ( 0 , slackspace ); //nyttig kodefyldning var blok = bigblock . understreng ( 0 , bigblock . længde - slackspace ); //just NOPs while ( blok . længde + slackspace < 0x40000 ) blok = blok + blok + udfyldningsblok ; //fill til størrelsen af ​​heap-elementet - i dette tilfælde er det 0x40000 var memory = new Array (); for ( i = 0 ; i < 500 ; i ++ ){ memory [ i ] = blok + shellcode } // vælg flere sådanne elementer. </ script > </ html >

unescape()er en funktion, der giver dig mulighed for at sætte bytes i nøjagtig den rækkefølge, der er angivet i argumentet [1] .

VBScript

VBScript bruges i Internet Explorer til at oprette strenge med string. Begrebsmæssigt det samme som JavaScript- implementeringen , kun funktionsnavnene ændres [6] .

ActionScript

I juli 2009 blev der fundet udnyttelser , der gør det muligt at bruge ActionScript til at implementere heap-spraying i Adobe Flash [1] .

HTML5

I september 2012 blev en ny implementering præsenteret på EuSecWest 2012 [12] . Federico Muttis og Anibal Sacco har vist, at meget granuleret heap-sprøjtning kan implementeres ved hjælp af HTML5- teknologier . De brugte bitmap-grænsefladen på lavt niveau leveret af canvas API .

Billeder

Der er metoder, der bruger billedindlæsning. Billedet er sammensat af NOP s og fortsætter derefter som i de tidligere tilfælde [1] [9] .

Måder at forhindre

Som med alle bufferoverløb er der tre hovedforsvar. [1] Det er ofte lettere at forhindre en ændring i udførelsesflowet end den faktiske brug af bufferen. Moderne operativsystemer bruger alle følgende metoder:

  1. Eksekveringsforebyggelse ved at adskille data og eksekverbar kode , normalt ved hjælp af arkitektoniske løsninger såsom NX bit . For eksempel er DEP allerede implementeret i de fleste operativsystemer [1]
  2. Forøgelse af tilfældigheden af ​​placeringen af ​​data i hukommelsen . For eksempel så det næste allokerede heapelement ikke har en fast offset i forhold til det nuværende. Allerede implementeret i de fleste OS: ASLR [7] .
  3. Øg antallet af buffergrænsekontrol i hukommelseshåndteringen .

Projekter relateret til denne type angreb:

  • Microsoft Researchs Nozzle-projekt har til formål at forhindre dynesprøjtning [1] .
  • BuBBle er et andet projekt, der har til formål at minimere skaden fra dette angreb [13] .

Se også

Noter

  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 Benjamin Livshits, Paruj Ratanaworabhan, Benjamin Zorn. DYSE: Et forsvar mod heap-spraying kodeinjektionsangreb.  (engelsk)  : Inprocedings. - 2009. - S. 38 . Arkiveret fra originalen den 9. august 2014.
  2. 1 2 Tanenbaum E., Woodhull A. Operativsystemer. Udvikling og implementering. - Sankt Petersborg. : Peter, 2007. - S. 78-252. - 704 s.
  3. 1 2 Richter J. Windows til professionelle: Opbygning af kraftfulde Win32-applikationer til 64-bit Windows. - M . : Russisk udgave, 2008. - S. 68-118,333-418. - 720 sek.
  4. 1 2 W. Richard Stevens, Stephen A. Rago. UNIX. Professionel programmering. - Sankt Petersborg. : Symbol-Plus, 2014. - S. 288-351. — 1104 s.
  5. Brian Kernighan, Dennis Ritchie. C programmeringssprog. - Williams, 2015. - S. 93-123. — 304 s.
  6. 1 2 3 4 Thomas Toth, Christopher Kruegel. Nøjagtig bufferoverløbsdetektion via abstrakt udførelse af nyttelast  //  RAID'02 Proceedings of the 5th international conference on Seneste fremskridt inden for intrusion detection : Proceeding. - 2002. - 16. oktober. - S. 274-291 . — ISBN 3-540-00020-8 .
  7. 1 2 3 4 Tilo Muller. ASLR Smack & Laugh Reference  . - 2008. - 17. december. - S. 21 . Arkiveret fra originalen den 28. september 2015.
  8. ↑ 1 2 Mark Russinovich, David Solomon. Windows internt. - Sankt Petersborg. : Peter, 2013. - S. 104-681. - 800 sek.
  9. 1 2 3 4 5 6 Sotirov A. Heap feng shui i javascript  (engelsk) . - 2007. - S. 55 . Arkiveret fra originalen den 4. december 2015.
  10. HwaiGeeng, Chew. Sikkerhedshuller i ISAPI-udvidelser   : Forløb . - 2001. - S. 12 . Arkiveret fra originalen den 22. december 2015.
  11. Sort Hat. Sikkerhedshuller i ISAPI-udvidelser   : Forløb . - 2010. - S. 35 . Arkiveret fra originalen den 4. marts 2016.
  12. Anibal Sacco, Federico Muttis. HTML5 Heap Sprays, Pwn All The  Things . - 2012. Arkiveret 23. december 2015.
  13. Francesco Gadaleta, Yves Younan, Wouter Joosen. BuBBle: En modforanstaltning på Javascript-motorniveau mod heap-  sprøjteangreb . - 2010. - S. 17 . Arkiveret fra originalen den 3. marts 2016.

Litteratur

  • Richter J. Windows til professionelle: Opbygning af kraftfulde Win32-applikationer til 64-bit Windows. - M . : Russisk udgave, 2008. - S. 68-118,333-418. - 720 sek.
  • W. Richard Stevens, Stephen A. Rago. UNIX. Professionel programmering. - Sankt Petersborg. : Symbol-Plus, 2014. - S. 288-351. — 1104 s.
  • Tanenbaum E., Woodhull A. Operativsystemer. Udvikling og implementering. - Sankt Petersborg. : Peter, 2007. - S. 78-252. - 704 s.
  • Brian Kernighan, Dennis Ritchie. C programmeringssprog. - Williams, 2015. - S. 93-123. — 304 s.
  • Mark Russinovich, David Solomon. Windows internt. - Sankt Petersborg. : Peter, 2013. - S. 104-681. - 800 sek.

Links