Puffertúlcsordulás

Ez a közzétett változat, ellenőrizve: 2015. augusztus 27.

Az informatikai biztonság, illetve a programozás területén a puffertúlcsordulás (ang.: buffer overflow vagy buffer overrun) olyan szoftverhiba, sokszor biztonsági rés, melynél egy processz a fix hosszúságú tömbbe (puffer) történő íráskor nem ellenőrzi annak határait, így azt (például túl hosszú bemeneti adatok miatt) túlírva a szomszédos memóriaterületet írja felül. A felülírt memóriaterületen más adatok, a program változói, a program futását vezérlő adatok (programkód) is lehet. Ez a program hibás működéséhez, futásának befejeződéséhez (lefagyás) vagy a rendszer biztonságának sérüléséhez is vezethet.

A puffertúlcsordulást olyan bemeneti adatok is kiválthatják, melyek célja egy programkód lefuttatása, vagy a program működésének megváltoztatása. Így biztonsági rést jelenthet; számos exploit alapul puffertúlcsorduláson. A határellenőrzés (korlátellenőrzés) hatékonyan megakadályozza a puffertúlcsordulásos hibákat.

A puffertúlcsordulás kapcsán leggyakrabban a széles körben elterjedt C és a C++ programozási nyelveket szokás említeni, mivel ezek nem tartalmaznak beépített védelmet a memória bármilyen területének fölülírása ellen, és a beépített 'buffer' típus sem végez határellenőrzést.

Technikai leírás

szerkesztés

Puffertúlcsordulás akkor történik, amikor egy pufferbe írt adat, a határellenőrzés hiánya miatt a lefoglalt puffer melletti memóriacímeken lévő adatokat felülírja. Ez leggyakrabban stringek egyik pufferből a másikba másolásakor történik.

A következő példában egy program két, a memóriában egymás mellett elhelyezkedő adatelemet definiált: egy 8 bájt hosszúságú stringpuffert, A-t, és egy kétbájtos egészt, B-t. Kezdetben A csak nulla bájtokat tartalmaz, B pedig a 3-as számot. A példában a stringet alkotó karakterek egybájtosak.

A B
0 0 0 0 0 0 0 0 0 3

Ezután a program megkísérli a „túlmegyek” stringet eltárolni az A pufferben, null karakterrel lezárva. A string hosszát nem ellenőrzi a program, így felülírja B értékét:

A B
't' 'ú' 'l' 'm' 'e' 'g' 'y' 'e' 'k' 0

Bár a programozó egyáltalán nem akarta B értékét megváltoztatni, mégis felülírta egy olyan számmal, ami részben egy stringből származik. Ebben a példában, big-endian bájtsorrendet és ASCII kódtáblát feltételezve a „k” karakter és a mögötte álló zéró bájt együtt a 27392 számot adja ki. Ha B-n kívül más változót nem használna a program, egy hosszabb, B végén is túlmenő string írásakor valószínűleg hibát okozna, pl. segmentation faultot (felszabadított területre mutatási hibát), és a processz futásának a rendszer véget vetne.

Fordítás

szerkesztés

Ez a szócikk részben vagy egészben a Buffer overflow című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.