Buffer overflow
Szinte 100%, hogy ezt a hibát elkövetted a korábbi prog1-es NagyHF elkészítésekor, pedig hatalmas nagy biztonsági kockázatokat rejt magában.
A Buffer-overflow egy bitonsági rés, hiba, amit a figyelmetlen memóriakezelés okoz:
A következő példában egy karakterláncot kérünk be, csakhogy a felhasználó nem biztos, hogy olyan hosszú sorozatot ad meg, ami belefér a példában szereplő buffer
tömbbe:
#include <stdio.h>
int main() {
char buffer[10];
char alma[10] = "alma";
printf("Hello world!\n");
scanf("%s", buffer);
printf("%s\n", alma);
return 0;
}
Mivel mind a két tömb a stack-en lakik, és "egymásután" helyezkednek el a memóriában (általában a legtöbb fordítónál és a legtöbb rendszeren ebben a sorrendben), lehetőségünk van rá, hogy hiába csak a buffer-be akarnánk írni, felül tudjuk írni az alma tömb tartalmát is: gyakorlatilag túlindexeljük a buffer-t, így az alma-ban kötünk ki. Próbáljuk ki a lenti parancsokat fordítás után (main a futtatható állomány), milyen viselkedést tapasztalunk? A python3 -c "print('0'*N)"
N darab '0' karakter ír a kimenetre, amit aztán átírányítunk a main program bemenetére a pipe ('|') segítségével.
python3 -c "print('0'*9)" | ./main
python3 -c "print('0'*15)" | ./main
python3 -c "print('0'*21)" | ./main
Láthatjuk, hogy nagy fenyegetést rejteget az ilyen kódok használata: Ha az alma tömbben például egy jelszót raktunk, akkor könnyen feltörhetővé válik a program. Továbbá veszélyes lehet az összes olyan függvény, aminek nem lehet valamilyen limitációt megadni, pl.: strcpy, strcat, gets... Ezek helyett ajánlott a párjukat használni, ahol meg lehet mondani hogy maximum hány karaktert másoljanak a céltömbbe:
fgets(buffer, 10, stdin);