Halom permetezés

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] .

Alapfogalom

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] .

Történelem

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] .

Megvalósítás

JavaScript

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 .

VBScript

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] .

ActionScript

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] .

HTML5

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 .

Képek

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] .

A megelőzés módjai

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:

  1. Végrehajtás megelőzése az adatok és a végrehajtható kód szétválasztásával , általában architekturális megoldásokkal, például NX bittel . Például a DEP a legtöbb operációs rendszerben már implementálva van [1]
  2. Az adatok helyének véletlenszerűségének növelése a memóriában . Például, hogy a következő lefoglalt kupacelemnek ne legyen fix eltolása az aktuálishoz képest. A legtöbb operációs rendszerben már megvalósítva: ASLR [7] .
  3. Növelje a pufferhatár-ellenőrzések számát a memóriakezelőben .

Az ilyen típusú támadásokhoz kapcsolódó projektek:

  • A Microsoft Research Nozzle projektjének célja a halompermetezés megakadályozása [1] .
  • A BuBBle egy másik projekt, amelynek célja a támadás okozta károk minimalizálása [13] .

Lásd még

Jegyzetek

  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 Benjamin Livshits, Paruj Ratanaworabhan, Benjamin Zorn. FÚVÓK: Védelem a halom-permetező kód befecskendezési támadásai ellen.  (angolul)  : Inprocedings. - 2009. - S. 38 . Az eredetiből archiválva : 2014. augusztus 9.
  2. 1 2 Tanenbaum E., Woodhull A. Operációs rendszerek. Fejlesztés és megvalósítás. - Szentpétervár. : Péter, 2007. - S. 78-252. - 704 p.
  3. 1 2 Richter J. Windows szakembereknek: Hatékony Win32 alkalmazások készítése 64 bites Windowshoz. - M . : orosz kiadás, 2008. - S. 68-118,333-418. — 720 s.
  4. 1 2 W. Richard Stevens, Stephen A. Rago. UNIX. Professzionális programozás. - Szentpétervár. : Symbol-Plus, 2014. - S. 288-351. — 1104 p.
  5. Brian Kernighan, Dennis Ritchie. C programozási nyelv. - Williams, 2015. - S. 93-123. — 304 p.
  6. 1 2 3 4 Thomas Toth, Christopher Kruegel. Pontos puffertúlcsordulás észlelése absztrakt hasznos terhelés végrehajtásával  //  RAID'02 Proceedings of the 5th international Conference on Recent progress in intrusion detection: Proceedings. - 2002. - október 16. - S. 274-291 . — ISBN 3-540-00020-8 .
  7. 1 2 3 4 Tilo Muller. ASLR Smack & Laugh Reference  . - 2008. - december 17. - S. 21 . Archiválva az eredetiből 2015. szeptember 28-án.
  8. ↑ 1 2 Mark Russinovich, David Solomon. Windows belső. - Szentpétervár. : Péter, 2013. - S. 104-681. — 800 s.
  9. 1 2 3 4 5 6 Sotirov A. Heap feng shui javascriptben  (angolul) . - 2007. - S. 55 . Az eredetiből archiválva: 2015. december 4.
  10. HwaiGeeng, Chew. Biztonsági rések az ISAPI-bővítményekben   : Inproceedings . - 2001. - S. 12 . Az eredetiből archiválva : 2015. december 22.
  11. Fekete kalap. Biztonsági rések az ISAPI-bővítményekben   : Inproceedings . - 2010. - S. 35 . Az eredetiből archiválva: 2016. március 4.
  12. Anibal Sacco, Federico Muttis. HTML5 Heap Sprays, Pwn All The  Things . - 2012. Archiválva : 2015. december 23.
  13. Francesco Gadaleta, Yves Younan, Wouter Joosen. BuBBle: Javascript-motor szintű ellenintézkedés a kupacpermetező  támadások ellen . - 2010. - S. 17 . Az eredetiből archiválva: 2016. március 3.

Irodalom

  • Richter J. Windows szakembereknek: Hatékony Win32 alkalmazások készítése 64 bites Windowshoz. - M . : orosz kiadás, 2008. - S. 68-118,333-418. — 720 s.
  • W. Richard Stevens, Stephen A. Rago. UNIX. Professzionális programozás. - Szentpétervár. : Symbol-Plus, 2014. - S. 288-351. — 1104 p.
  • Tanenbaum E., Woodhull A. Operációs rendszerek. Fejlesztés és megvalósítás. - Szentpétervár. : Péter, 2007. - S. 78-252. - 704 p.
  • Brian Kernighan, Dennis Ritchie. C programozási nyelv. - Williams, 2015. - S. 93-123. — 304 p.
  • Mark Russinovich, David Solomon. Windows belső. - Szentpétervár. : Péter, 2013. - S. 104-681. — 800 s.

Linkek