„Puffertúlcsordulás” változatai közötti eltérés
[ellenőrzött változat] | [ellenőrzött változat] |
Syp (vitalap | szerkesztései) Nincs szerkesztési összefoglaló |
Syp (vitalap | szerkesztései) Nincs szerkesztési összefoglaló |
||
4. sor: | 4. sor: | ||
A puffertúlcsordulás kapcsán leggyakrabban a széles körben elterjedt [[C (programozási nyelv)|C]] és a [[C++]] [[programozási nyelv]]eket 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' [[Adattípus|típus]] sem végez határellenőrzést. |
A puffertúlcsordulás kapcsán leggyakrabban a széles körben elterjedt [[C (programozási nyelv)|C]] és a [[C++]] [[programozási nyelv]]eket 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' [[Adattípus|típus]] sem végez határellenőrzést. |
||
==Technikai leírás== |
|||
Puffertúlcsordulás akkor történik, amikor egy [[puffer]]be írt [[adat]], a [[határellenőrzés]] hiánya miatt a lefoglalt puffer melletti [[memóriacím]]eken lévő adatokat felülírja. Ez leggyakrabban [[string]]ek egyik pufferből a másikba másolásakor történik. |
|||
===Példa=== |
|||
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. |
|||
{| border="1" |
|||
| align="center" colspan="8" bgcolor="#ddddff" | A |
|||
| align="center" colspan="2" bgcolor="#ffdddd" | B |
|||
|- |
|||
| align="center" width="30" bgcolor="#ddddff" | 0 |
|||
| align="center" width="30" bgcolor="#ddddff" | 0 |
|||
| align="center" width="30" bgcolor="#ddddff" | 0 |
|||
| align="center" width="30" bgcolor="#ddddff" | 0 |
|||
| align="center" width="30" bgcolor="#ddddff" | 0 |
|||
| align="center" width="30" bgcolor="#ddddff" | 0 |
|||
| align="center" width="30" bgcolor="#ddddff" | 0 |
|||
| align="center" width="30" bgcolor="#ddddff" | 0 |
|||
| align="center" width="30" bgcolor="#ffdddd" | 0 |
|||
| align="center" width="30" bgcolor="#ffdddd" | 3 |
|||
|} |
|||
Ezután a program megkísérli a „túlmegyek” stringet eltárolni az A pufferben, [[null karakter]]rel lezárva. A string hosszát nem ellenőrzi a program, így felülírja B értékét: |
|||
{| border="1" |
|||
| align="center" colspan="8" bgcolor="#ddddff" | A |
|||
| align="center" colspan="2" bgcolor="#ffdddd" | B |
|||
|- |
|||
| align="center" width="30" bgcolor="#ddddff" | 't' |
|||
| align="center" width="30" bgcolor="#ddddff" | 'ú' |
|||
| align="center" width="30" bgcolor="#ddddff" | 'l' |
|||
| align="center" width="30" bgcolor="#ddddff" | 'm' |
|||
| align="center" width="30" bgcolor="#ddddff" | 'e' |
|||
| align="center" width="30" bgcolor="#ddddff" | 'g' |
|||
| align="center" width="30" bgcolor="#ddddff" | 'y' |
|||
| align="center" width="30" bgcolor="#ddddff" | 'e' |
|||
| align="center" width="30" bgcolor="#ddddff" | 'k' |
|||
| align="center" width="30" bgcolor="#ddddff" | 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ájtsorrend]]et é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 fault]]ot (felszabadított területre mutatási hibát), és a [[processz]] futásának a rendszer véget vetne. |
|||
==Források== |
==Források== |
A lap 2010. március 7., 17:10-kori változata
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
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.
Példa
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.
Források
- 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.