Přetečení na haldě

Z Wikipedie, otevřené encyklopedie
Skočit na navigaci Skočit na vyhledávání

Přetečení na haldě (anglicky heap overflow) je typ přetečení bufferu, který nastává v datové oblasti haldy. Přetečení na haldě jsou napadnutelná jiným způsobem než přetečení na zásobníku. Paměť v haldě je dynamicky alokovaná aplikací za běhu a typicky obsahuje programová data. Napadnutí je prováděno poškozením těchto dat specifickým způsobem za účelem způsobení přepsání interních struktur aplikace jako např. ukazatele spojového seznamu. Kanonická technika přetečení haldy přepisuje vazby dynamické alokace paměti (např. metadata pro malloc) a používá výslednou výměnu ukazatelů k přepsání ukazatele na funkci.

Typický příklad na Linuxu jsou dva buffery alokované vedle sebe v haldě. Zápis za hranice prvního bufferu dovoluje přepsání meta dat v druhém bufferu. Nastavením in-use bitu druhého bufferu na nulu a nastavením délky na malou zápornou hodnotu, což dovoluje kopírování null bytů, se ve chvíli, kdy program zavolá free() na prvním bufferu, pokusí spojit tyto dva buffery do jednoho. Když se toto stane, buffer, který měl být uvolněn, bude obsahovat dva ukazatele FD a BK v prvních 8 bytech dříve alokovaného bufferu. BK je zapsán do FD a může být použit k přepsání ukazatele. Avšak toto z více důvodů není nadále možné.

Následky[editovat | editovat zdroj]

Náhodné přetečení může vyústit v poškození dat nebo neočekávané chování některého procesu, který používá ovlivněnou oblast paměti. Na operačních systémech bez ochrany paměti to může být kterýkoliv proces v systému.

Záměrné zneužití může vést ke změně dat na specifickém umístění libovolným způsobem nebo spuštění libovolného kódu.

Zranitelnost Microsoft JPEG GDI+ [1] je příkladem rizika, jaké může přetečení na haldě představovat pro uživatele počítače.

iOS jailbreaking často používá přetečení na haldě k získání libovolného kódu, obvykle pro kernel exploity k získání schopnosti nahradit jádro vlastním.

Detekce a prevence[editovat | editovat zdroj]

Podobně jako u přetečení bufferů jsou tři primární možnosti, jak chránit haldu proti přetečení. Několik moderních operačních systémů jako jsou Windows a Linux poskytuje implementaci všech tří.

  • Zabránění vykonávání škodlivého kódu oddělením kódu od dat, typicky pomocí hardwarových funkcí jako např. NX-bit na moderních systémech.
  • Zavedení randomizace, takže halda není umístěna na pevné pozici.
  • Zavedení tzv. „sanity checks“ do správce haldy.

Od verze 2.3.6 obsahuje GNU libc ochranu, která dokáže detekovat přetečení haldy například kontrolou konzistence ukazatelů při volání unlink. Přestože je tato ochrana účinná proti starším typům exploitů, není dokonalá, jak je popsáno v[2],[3]. Linux navíc zahrnuje podporu ASLR (Address space layout randomization) od roku 2005, ačkoli PaX představil lepší implementaci již dříve. Linux také od roku 2004 podporuje NX-bit.

Microsoft zahrnul ochranu proti přetečení haldy od dubna 2003 ve Windows Server 2003 a od srpna 2004 ve Windows XP se Service Pack 2. Následující verze Windows jako Vista, Windows Server 2008 a Windows 7 obsahují tyto opatření: odstranění běžně cílených datových struktur, randomizace metadat haldy, rozšířené použití cookie hlavičky haldy, randomizovaná základní adresa haldy, kódování ukazatelů na funkce. Běžné Data Execution Prevention (DEP) a ASLR také napomáhají snížení rizika tohoto útoku.[4]

Odkazy[editovat | editovat zdroj]

Související články[editovat | editovat zdroj]

Externí odkazy[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku Heap overflow na anglické Wikipedii.

  1. Microsoft Security Bulletin MS04-028 [online]. Microsoft [cit. 2014-01-08]. Dostupné online. (anglicky) 
  2. MallocMaleficarum [online]. [cit. 2014-01-08]. Dostupné online. (anglicky) 
  3. Malloc Des-Maleficarum [online]. [cit. 2014-01-08]. Dostupné online. (anglicky) 
  4. Microsoft Security Research & Defense blogs.technet.com