Az információbiztonság területén a halom permetezés olyan támadás , amely hibákat használ fel az alkalmazás memóriájával való munka során . A halom permetezéssel támadó hacker arra kényszeríti az alkalmazást , hogy nagyszámú, rosszindulatú kódot tartalmazó objektum számára foglaljon memóriát . Ez növeli annak a kizsákmányolásnak a sikerarányát, amely a végrehajtási szálat a kupon belüli bizonyos pozícióba helyezi . Fontos megérteni, hogy a végrehajtás menetének megváltoztatását lehetővé tevő exploit nélkül a halompermetezés nem okoz kárt. A támadás a kupac pozíciójának kiszámíthatóságán alapul a folyamat címterében . Ezenkívül a memória lefoglalása a kupacban determinisztikus művelet, amely lehetővé teszi ennek a technikának a sikeres alkalmazását. A kupacpermetezés különösen hatékony a böngészőkben , ahol a hacker több soros JavaScript használatával is lefoglalhat memóriát egy weboldalon . Fontos szerepet játszik a memóriakiosztás hasonlósága a különböző operációs rendszerekben , ami ezt a támadást platformközivé teszi. Ennek eredményeként lehetőség van bizonyos bájtsorozat (például gépi utasítás) beszúrására egy előre megjósolt címbe a célfolyamat memóriájában [1] .
Amikor egy folyamatot létrehozunk az operációs rendszerben , egy címteret [2] [3] [4] foglalnak le az igényeinek megfelelően , amely felhasználói adatokat, végrehajtható kódot és néhány, az adott operációs rendszertől függő rendszerinformációt tartalmaz. A felhasználói adatok elosztása a kupac és a verem között attól függően történik, hogy a memória hogyan van lefoglalva számukra [5] . Például a verem szegmens változókat tárol automatikus kiosztási osztályokkal, valamint olyan információkat, amelyeket a rendszer minden függvényhíváskor elment, például a visszatérési címet. A kupac a dinamikus memória területe , vagyis amikor a memória dinamikusan van lefoglalva, a halomban helyet foglalnak le. Hagyományosan a kupac és a verem egymás felé nő [2] [3] [4] .
A halom permetezés önmagában nem jelent sebezhetőséget . Használható azonban rosszindulatú kódok továbbítására a folyamat végrehajtható memóriaterületére . Ez a technika a rendszer memóriafoglalási műveletének determinizmusát használja ki . Ez azt jelenti, hogy gyakran nagy mennyiségű memória található ugyanazon az eltoláson a folyamatcímtérben . Ez a technika azonban nem képes magában a biztonsági rendszerben feltörni. Ezért használatához olyan sebezhetőségre van szükség, amely lehetővé teszi a parancsok (gépi utasítások) végrehajtási sorrendjének megváltoztatását [6] .
Nehéz ezt a technikát alkalmazni, mert a folyamat végrehajtását befolyásoló tényezők száma (a hacker szemszögéből) igen nagy. A kupacpermetezéssel azonban számos utasítást végrehajthat, ami részben kompenzálja ezt a nehézséget, és lehetővé teszi a sikeres repedés valószínűségének növelését [7] .
A halompermetezés a legtöbb operációs rendszerhez és architektúrához megvalósítható . A fő nehézséget egy olyan sebezhetőség megtalálása jelenti, amely lehetővé teszi a végrehajtási folyamat átirányítását . A nagy mennyiségű memória dinamikus lefoglalása , amint azt korábban említettük, egy olyan művelet, amely lehetővé teszi a kupac pozíciójának előrejelzését a memóriában (a virtuális memória fizikai memóriába való leképezésekor ) [8] . Valahányszor ugyanazt a memória-elérési sorozatot hajtjuk végre, a kupac nagy valószínűséggel ugyanarra a helyre kerül [6] [7] .
Ennek a valószínűségnek a növeléséhez azonban szükséges, hogy a lefoglalt memória egy darabjának mérete összemérhető legyen egy szegmens vagy oldal méretével, a memória elrendezésétől függően [7] .
A támadás fő problémája a végrehajtás folyamatának megváltoztatása . A végrehajtás elfogásának képessége nélkül az ilyen típusú támadásoknak nincs értelme. Egyes függvények a kupacban tárolhatják a visszatérési címet , ebben az esetben a hacker megpróbálhatja megváltoztatni azokat. Ebben az esetben, amikor visszatér egy ilyen funkcióból, egy olyan memóriahelyre kerül, amely kényelmes egy hacker számára , és ennek eredményeként egy rosszindulatú kód futni kezd . Bármely funkció, amely beolvas egy címet a kupacban, kihasználható sebezhetőségként. A hacker lecserélheti ezt a címet egy általa módosított memóriadarab címére. Ez a végrehajtási szál rosszindulatú kódra való átirányításához vezethet. Ez azonban nem olyan egyszerű, mint amilyennek látszik [1] [8] .
A helyettesítésre használt cím helyessége (mérete, eltolása az oldal elejéhez képest) erősen függ az architektúrától. Ezért a gyakorlatban olyan blokkokat használnak, amelyek főként NOP -okból állnak , és a végén hozzáadják a szükséges kódot. Ez a technika lehetővé teszi, hogy ne aggódjon a címszámítás pontosságáért, és a végrehajtási folyamatot egy hozzávetőleges helyre irányítsa a címtérben [1] .
A halompermetezés végrehajtásának lépései:
Ez a fajta támadás nagyon hatékony a böngészőkben . A legtöbb böngésző támogatja a szkriptek végrehajtását . A hacker lefoglalhatja a szükséges memóriát néhány soros JavaScript vagy ActionScript használatával egy weboldalon. Fontos szerepet játszik a memóriakiosztás hasonlósága a különböző operációs rendszerekben , ami ezt a támadást platformközivé teszi. Ezenkívül a címek, amelyekre ugrani kell, hasonlóak lesznek [9] .
A halompermetezést először 2001-ben alkalmazták, és 2005 nyarán terjedt el. Azóta nagyszámú sebezhetőséget találtak az Internet Explorerben [10] [11] . A tettek nagyon hasonlítottak egymáshoz. Minden ilyen exploit halom permetezésből állt, amelynek megvalósítási módja nem változott, és a programszámláló átvitelét a kívánt helyre a memóriában . Ezért a HTML néhány sorának megváltoztatásával és egy új sebezhetőségre való átállással egy új exploitot kaptak [1] .
A legegyszerűbb módja annak, hogy helyet foglaljon el a böngésző memóriájában , ha deklarál egy karakterlánc-változót és inicializálja [1] .
Példák memóriafoglalásra JavaScriptben [9] :
var myvar = "CORELAN!" ; var myvar2 = new String ( "CORELAN!" ); var myvar3 = myvar + myvar2 ; var myvar4 = myvar3 . részkarakterlánc ( 0 , 8 );Ezek nagyon egyszerű példák, mert a kiemelt sorok kicsik. Egy shellkód darab sokkal nagyobb, de még mindig kevesebb, mint egy teljes oldalnyi memória .
Hipotetikusan lehetséges, hogy minden egyes blokkba többször is beírhatjuk a szükséges shell-kódot , de ekkor a támadónak nyomon kell követnie, hogy a mutató melyik konkrét címre kerül, mivel az nem eshet a futtatható kód közepére . Általában eltérően járnak el - kiválasztják a sok NOP -t tartalmazó darabokat , és a végén előírják a szükséges parancsokat. Ekkor a blokkok halomban való lineáris elrendezése miatt könnyebben megfigyelhető a kódvégrehajtás linearitása, és nem kell aggódni a memóriadarab elejére való eltalálás pontosságától [9] .
A méret helyes megválasztásával a lefoglalt memóriadaraboknak nagyon közel kell lenniük a kupacelem méretéhez. Ha a lefoglalt memória kisebb, akkor a fennmaradó hely szabad lesz. A memóriakezelő a legjobb esetben is rendszerszemetet hagy ezen a „kiosztatlan területen”, legrosszabb esetben pedig megfelelő méretű objektumot helyez el. Mindenesetre ez hibát fog eredményezni, amikor megpróbálja végrehajtani ezt a memóriahelyet [1] [9] .
Így a támadók által használt szkript így néz ki [9] :
< html > < script > var shellcode = unescape ( '%u\4141%u\4141' ); // ez a CORELAN címke var bigblock = unescape ( '%u\9090%u\9090' ); //90 a NOP kód var headersize = 20 ; var slackspace = headersize + shellcode . hossza ; // darabunk kezdeti mérete: hasznos kód + fejléc mérete while ( bigblock . hossz < slackspace ) bigblock += bigblock ; //kitöltés NOP-okkal var fillblock = bigblock . részkarakterlánc ( 0 , slackspace ); //hasznos kód - filling var block = bigblock . substring ( 0 , bigblock . long - slackspace ); //csak NOP-ok while ( blokk . hossz + slackspace < 0x40000 ) block = blokk + blokk + fillblock ; //fill a heap elem méretére - ebben az esetben 0x40000 var memory = new Array (); for ( i = 0 ; i < 500 ; i ++ ){ memória [ i ] = blokk + shellkód } // több ilyen elem kijelölése. </ script > </ html >unescape()egy olyan függvény, amely lehetővé teszi, hogy a bájtokat pontosan az [1] argumentumban megadott sorrendbe helyezze .
A VBScript az Internet Explorer programban a karakterláncok létrehozására szolgál string. Elvileg megegyezik a JavaScript implementációval , csak a függvénynevek változnak [6] .
2009 júliusában olyan exploitokat találtak , amelyek lehetővé teszik az ActionScript használatát a halompermetezés megvalósításához Adobe Flashben [1] .
2012 szeptemberében egy új megvalósítást mutattak be az EuSecWest 2012 rendezvényen [12] . Federico Muttis és Anibal Sacco kimutatták, hogy a rendkívül szemcsés halompermetezés megvalósítható HTML5 -technológiákkal . A canvas API által biztosított alacsony szintű bittérképes felületet használták .
Vannak olyan módszerek, amelyek képbetöltést használnak. A kép NOP -okból áll össze, majd járjon el az előző esetekben [1] [9] .
Mint minden puffer túlcsordulásnál , itt is három fő védekezés létezik. [1] Gyakran könnyebb megakadályozni a végrehajtási folyamat változását, mint a puffer tényleges használatát. A modern operációs rendszerek az alábbi módszerek mindegyikét használják:
Az ilyen típusú támadásokhoz kapcsolódó projektek: