Hromadný postřik

Hromadné rozprašování v informační bezpečnosti  je útok , který využívá chyby při práci s pamětí aplikace . Hacker útočí sprejováním haldy a nutí aplikaci , aby přidělila paměť velkému počtu objektů obsahujících škodlivý kód . To zvyšuje míru úspěšnosti exploitu , který přesune vlákno provádění na určitou pozici v haldě . Je důležité pochopit, že bez exploitu, který vám umožní změnit tok provádění, nezpůsobí haldové postřikování žádnou škodu. Útok je založen na předvídatelnosti pozice haldy v adresovém prostoru procesu. Navíc alokace paměti na haldě je deterministická operace, která umožňuje úspěšně aplikovat tuto techniku. Hromadné rozprašování je zvláště účinné v prohlížečích , kde hacker může alokovat paměť pomocí více řádků JavaScriptu na webové stránce . Důležitou roli hraje podobnost alokace paměti v různých operačních systémech , díky čemuž je tento útok multiplatformní. Díky tomu je možné vložit určitou sekvenci bajtů (například strojovou instrukci) na předem predikovanou adresu v paměti cílového procesu [1] .

Když je proces vytvořen v operačním systému , je pro jeho potřeby přidělen adresní prostor [2] [3] [4] , který obsahuje uživatelská data, spustitelný kód a některé systémové informace, které závisí na konkrétním operačním systému. Uživatelská data jsou distribuována mezi haldu a zásobník v závislosti na tom, jak je pro ně alokována paměť [5] . Například segment zásobníku ukládá proměnné s automatickou alokační třídou a také informace, které se ukládají při každém volání funkce, jako je návratová adresa. Halda  je oblast dynamické paměti , to znamená, že když je paměť přidělována dynamicky, je na haldě alokován prostor. Tradičně hromada a hromádka rostou směrem k sobě [2] [3] [4] .

Základní koncept

Hromadný postřik není sám o sobě zranitelností . Lze jej však použít k doručení škodlivého kódu do oblasti spustitelné paměti procesu . Tato technika využívá determinismus operace přidělování paměti systému . To znamená, že velké množství paměti je často umístěno na stejném offsetu v adresovém prostoru procesu . Tato technika však není schopna narušit samotný bezpečnostní systém. Proto jeho použití vyžaduje zranitelnost, která umožňuje měnit pořadí provádění příkazů (strojových instrukcí) [6] .

Je obtížné použít tuto techniku, protože počet faktorů, které ovlivňují provedení procesu (z pohledu hackera), je velmi velký. Pomocí haldového nástřiku však můžete provést velké množství instrukcí, což tuto obtížnost částečně kompenzuje a umožňuje zvýšit pravděpodobnost úspěšného cracku [7] .

Hromadné stříkání lze implementovat pro většinu operačních systémů a architektur . Hlavním problémem je nalezení zranitelnosti , která vám umožní přesměrovat tok provádění . Dynamická alokace velkého množství paměti, jak již bylo zmíněno dříve, je operace, která umožňuje predikovat polohu haldy v paměti (v době mapování virtuální paměti na fyzickou paměť ) [8] . Pokaždé, když provedete stejnou sekvenci přístupů do paměti, halda s největší pravděpodobností skončí na stejném místě [6] [7] .

Pro zvýšení této pravděpodobnosti je však nutné, aby velikost části alokované paměti byla srovnatelná s velikostí segmentu nebo stránky , v závislosti na způsobu organizace paměti [7] .

Hlavním problémem tohoto útoku je změna toku provádění . Bez možnosti zachytit provedení nemá tento typ útoku smysl. Některé funkce mohou ukládat zpáteční adresu na hromadu, v takovém případě by se ji hacker mohl pokusit změnit. V takovém případě se při návratu z takové funkce přesune do paměti vhodné pro hackera a v důsledku toho se začne spouštět škodlivý kód . Jakoukoli funkci, která čte adresu na haldě, lze zneužít jako chybu zabezpečení. Hacker může tuto adresu nahradit adresou části paměti, kterou upravil. To může vést k přesměrování vlákna provádění na škodlivý kód. To však není tak jednoduché, jak se zdá [1] [8] .

Správnost adresy (její velikost, offset vzhledem k začátku stránky) použité pro substituci silně závisí na architektuře. Proto se v praxi používají bloky skládající se převážně z NOP s přidáním potřebného kódu na konec. Tato technika vám umožňuje nestarat se o přesnost výpočtu adresy a směrovat tok provádění na přibližné místo v adresním prostoru [1] .

Kroky pro implementaci haldového postřiku:

Tento typ útoku je velmi účinný v prohlížečích . Většina prohlížečů podporuje spouštění skriptů . Hacker může alokovat požadovanou paměť pomocí několika řádků JavaScriptu nebo ActionScriptu na webové stránce. Důležitou roli hraje podobnost alokace paměti v různých operačních systémech , díky čemuž je tento útok multiplatformní. Navíc adresy, na které musíte skočit, budou podobné [9] .

Historie

Hromadný postřik byl poprvé použit v roce 2001 a rozšířil se v létě 2005. Od té doby bylo v Internet Exploreru nalezeno velké množství zranitelností [10] [11] . Exploaty si byly velmi podobné. Každý takový exploit sestával z haldového sprejování, jehož způsob implementace se nezměnil, a přenesení programového počítadla na požadované místo v paměti . Proto byl nový exploit získán změnou několika řádků HTML a přechodem na novou zranitelnost [1] .

Implementace

JavaScript

Nejjednodušší způsob, jak alokovat místo v paměti prohlížeče ,  je deklarovat řetězcovou proměnnou a inicializovat ji [1] .

Příklady alokace paměti v JavaScriptu [9] :

var myvar = "CORELAN!" ; var myvar2 = nový řetězec ( "CORELAN!" ); var myvar3 = myvar + myvar2 ; var myvar4 = myvar3 . podřetězec ( 0 , 8 );

Toto jsou velmi jednoduché příklady, protože zvýrazněné čáry jsou malé. Kus kódu shellu je mnohem větší, ale stále menší než celá stránka paměti .

Hypoteticky je možné zapsat potřebný shell kód mnohokrát do každého bloku, který alokujeme, ale pak bude muset útočník sledovat, na kterou konkrétní adresu míří ukazatel, protože by neměl spadat doprostřed spustitelného kódu . Obvykle jednají jinak - vybírají kusy obsahující mnoho NOP a nakonec předepisují potřebné příkazy. Díky lineárnímu uspořádání bloků v haldě je pak snazší pozorovat linearitu provádění kódu a není třeba se obávat o přesnost trefení začátku části paměti [9] .

Při správné volbě velikosti by alokované části paměti měly být velmi blízké velikosti prvku haldy. Pokud je přidělená část paměti menší, bude zbývající místo volné. Správce paměti v nejlepším případě zanechá systémové smetí v tomto „nepřiděleném prostoru“ a v nejhorším umístí objekt správné velikosti. V každém případě to povede k chybě při pokusu o provedení tohoto paměťového místa [1] [9] .

Skript používaný útočníky tedy vypadá takto [9] :

< html > < skript > var shellcode = unescape ( '%u\4141%u\4141' ); // toto je CORELAN label var bigblock = unescape ( '%u\9090%u\9090' ); //90 je kód NOP var headersize = 20 ; var slackspace = velikost záhlaví + kód shellu . délka ; // počáteční velikost našeho chunku: užitečný kód + velikost záhlaví while ( bigblock . length < slackspace ) bigblock += bigblock ; //vyplnění pomocí NOP var fillblock = bigblock . podřetězec ( 0 , slackspace ); //užitečný kód - nacpání var block = bigblock . podřetězec ( 0 , bigblock . length - slackspace ); //jen NOPs while ( délka bloku + mezera < 0x40000 ) block = block + block + fillblock ; //vyplňte na velikost prvku haldy - v tomto případě je to 0x40000 var memory = new Array (); for ( i = 0 ; i < 500 ; i ++ ){ paměť [ i ] = blok + kód shellu } // výběr více takových prvků. </ script > </ html >

unescape()je funkce, která vám umožňuje umístit bajty přesně v pořadí uvedeném v argumentu [1] .

VBScript

VBScript se používá v Internet Exploreru k vytváření řetězců s string. Koncepčně stejné jako implementace JavaScriptu , pouze se mění názvy funkcí [6] .

ActionScript

V červenci 2009 byly nalezeny exploity , které umožňují používat ActionScript k implementaci haldového sprejování v Adobe Flash [1] .

HTML5

V září 2012 byla na EuSecWest 2012 představena nová implementace [12] . Federico Muttis a Anibal Sacco ukázali, že vysoce granulární haldové postřikování lze implementovat pomocí technologií HTML5 . Používali nízkoúrovňové bitmapové rozhraní poskytované rozhraním canvas API .

Obrázky

Existují metody, které využívají načítání obrázků. Obraz je složen z NOP s a dále postupujte jako v předchozích případech [1] [9] .

Způsoby, jak zabránit

Stejně jako u všech přetečení vyrovnávací paměti existují tři hlavní ochrany. [1] Často je snazší zabránit změně v toku provádění, než samotnému použití vyrovnávací paměti. Moderní operační systémy používají všechny následující metody:

  1. Prevence spuštění oddělením dat a spustitelného kódu , obvykle pomocí architektonických řešení, jako je bit NX . Například DEP je již implementováno ve většině operačních systémů [1]
  2. Zvýšení náhodnosti umístění dat v paměti . Například, aby další přidělený prvek haldy neměl pevný posun vzhledem k aktuálnímu. Již implementováno ve většině OS: ASLR [7] .
  3. Zvyšte počet kontrol mezí vyrovnávací paměti ve správci paměti .

Projekty související s tímto typem útoku:

  • Projekt Nozzle společnosti Microsoft Research si klade za cíl zabránit rozstřikování haldy [1] .
  • BuBBle je dalším projektem, jehož cílem je minimalizovat škody způsobené tímto útokem [13] .

Viz také

Poznámky

  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 Benjamin Livshits, Paruj Ratanaworabhan, Benjamin Zorn. TRYSKA: Obrana proti útokům vstřikováním kódu z haldy.  (anglicky)  : Průběh. - 2009. - S. 38 . Archivováno z originálu 9. srpna 2014.
  2. 1 2 Tanenbaum E., Woodhull A. Operační systémy. Vývoj a implementace. - Petrohrad. : Peter, 2007. - S. 78-252. - 704 s.
  3. 1 2 Richter J. Windows pro profesionály: Vytváření výkonných aplikací Win32 pro 64bitová Windows. - M .: Ruské vydání, 2008. - S. 68-118,333-418. — 720 s.
  4. 1 2 W. Richard Stevens, Stephen A. Rago. UNIX. Profesionální programování. - Petrohrad. : Symbol-Plus, 2014. - S. 288-351. — 1104 s.
  5. Brian Kernighan, Dennis Ritchie. C programovací jazyk. - Williams, 2015. - S. 93-123. — 304 s.
  6. 1 2 3 4 Thomas Toth, Christopher Kruegel. Přesná detekce přetečení vyrovnávací paměti pomocí abstraktního spouštění užitečného zatížení  //  RAID'02 Sborník z 5. mezinárodní konference na téma Nedávné pokroky v detekci narušení: Proceeding. - 2002. - 16. října. - S. 274-291 . — ISBN 3-540-00020-8 .
  7. 1 2 3 4 Tilo Muller. ASLR Smack & Laugh Reference  . - 2008. - 17. prosince. - S. 21 . Archivováno z originálu 28. září 2015.
  8. ↑ 1 2 Mark Russinovich, David Solomon. Vnitřní části systému Windows. - Petrohrad. : Peter, 2013. - S. 104-681. — 800 s.
  9. 1 2 3 4 5 6 Sotirov A. Hromada feng shui v javascriptu  (anglicky) . - 2007. - S. 55 . Archivováno z originálu 4. prosince 2015.
  10. HwaiGeeng, žvýkat. Bezpečnostní díry v rozšířeních ISAPI   : Inproceedings . - 2001. - S. 12 . Archivováno z originálu 22. prosince 2015.
  11. Černý klobouk. Bezpečnostní díry v rozšířeních ISAPI   : Inproceedings . - 2010. - S. 35 . Archivováno z originálu 4. března 2016.
  12. Anibal Sacco, Federico Muttis. HTML5 Heap Sprays, Pwn All The  Things . - 2012. Archivováno 23. prosince 2015.
  13. Francesco Gadaleta, Yves Younan, Wouter Joosen. BUBBLE: Protiopatření na úrovni Javascript Engine proti útokům haldovým postřikem  . - 2010. - S. 17 . Archivováno z originálu 3. března 2016.

Literatura

  • Richter J. Windows pro profesionály: Vytváření výkonných aplikací Win32 pro 64bitová Windows. - M .: Ruské vydání, 2008. - S. 68-118,333-418. — 720 s.
  • W. Richard Stevens, Stephen A. Rago. UNIX. Profesionální programování. - Petrohrad. : Symbol-Plus, 2014. - S. 288-351. — 1104 s.
  • Tanenbaum E., Woodhull A. Operační systémy. Vývoj a implementace. - Petrohrad. : Peter, 2007. - S. 78-252. - 704 s.
  • Brian Kernighan, Dennis Ritchie. C programovací jazyk. - Williams, 2015. - S. 93-123. — 304 s.
  • Mark Russinovich, David Solomon. Vnitřní části systému Windows. - Petrohrad. : Peter, 2013. - S. 104-681. — 800 s.

Odkazy