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

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:

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

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