Mi (nem) véd meg ha sebezhető a programom? (Stack buffer- & Heap overflow)

Ez a cikk a számítástechnikai biztonságtechnika néhány területét röviden bemutató sorozatunk része. A feldolgozott témák általában kapcsolódnak a Security Challenge 2013 egy-egy feladatához.

A számítógép biztonságban vagy programozásban a buffer overflow egy olyan hiba ahol a program, mikor egy adatot ír egy bufferbe, túlfut annak határain és szomszédos memória területekbe ír bele.

Különböző technikák léteznek arra, hogy exploitáljuk a buffer overflow sérülékenységeket, de ezek architektúrától és operációs rendszertől függenek. A heap (dinamikusan allokált memória) overflow exploitálása sokban különbözhet a stack buffer overflow exploitálásától. A stacken lévő buffer overflow esetében egy lokális változót, függvény visszatérési címet írunk át, hogy a kívánt eredményt elérjük. A heap overflow esetében a dinamikusan foglalt memória tartalmát változtatjuk meg úgy, hogy a belső adatstruktúrákat megpróbáljuk átírni, pl. egy pointert egy láncolt listában vagy egy függvénypointer értékét.

Természetesen az operációs rendszerekben illetve különböző architektúrákon sokféle védelmet dolgoztak ki ezeknek a hibákból eredő támadások megfékezésének érdekében: NX bit, DEP, Stack-smashing protection, ASLR, Canary stb. Ahogy fejlődtek a védelmi megoldások újabb és újabb módszereket dolgoztak ki az operációs rendszerek különféle védelmének a kijátszása érdekében: NOP Sled, return-to-libc (ret2libc), Return-Oriented Programming (ROP), Jump Oriented Programming (JOP). Ezek közül néhány alapvetőt kiemelnénk:

  • Non-eXecutable stack, heap, data sections: Egy klasszikus overflow egy tetszőleges kód injektálására és futtattására alapszik. Ezért ha megakadályozzuk a futtatását az írható memória lapoknak, akkor a támadónak mindenképp nehezebb dolga lesz.
  • Address Space Layout Randomization (ASLR): Főként nem futtatható memóriaterületen lévő tulcsordulás esetén, a sikeres kihasználáshoz fix címekre hivatkozunk. (Code Reuse támadásoknál) Az ASLR bekapcsolt állapotában viszont, a process memóriaterében lévő lapok címeit a rendszer randomizálja.
  • Buffer overflow protection: A buffer overflow támadásoknál a kulcs gondolat általában felülírni a visszatérési címet, hogy eltérítsük a program futását a normáltól. Ilyen esetek védelmére találták ki a kanárikat, melyet a visszatérési cím elé elhelyezve, esetleges túlcsordulás esetén felülírhat a támadó. Ezt a változást pedig könnyedén detektálni lehet.

Bővebben a fent említett technikákról:

Ezeknek a védelmeknek a kijátszására irányuló technikák a gyakorlatban:

comments powered by Disqus