BEZPIECZEŃSTWO KODU A ŁAŃCUCHY 135 $ ./a.out niepoprawne Podales bledne haslo. $ ./a.out poprawne Witaj, wprowadziles poprawne haslo. Jednak okazuje się, że z powodu użycia funkcji strcpy włamywacz nie musi znać hasła, aby program uznał, że zna hasło, np.: $ ./a.out 11111111111111111111111111111111 Witaj, wprowadziles poprawne haslo. Co się stało? Podaliśmy ciąg jedynek dłuższy niż miejsce przewidziane na hasło. Funkcja strcpy() kopiując znaki z argv1 do tablicy (bufora) haslo przekroczyła przewidziane dla niego miejsce i szła dalej — gdzie znajdowała się zmienna haslo poprawne. strcpy() kopio- wała znaki już tam, gdzie znajdowały się inne dane — między innymi wpisała jedynkę do haslo poprawne. Podany przykład może się różnie zachowywać w zależności od kompilatora, jakim zo- stał skompilowany, i systemu, na jakim działa, ale ogólnie mamy do czynienia z poważnym niebezpieczeństwem. Taką sytuację nazywamy przepełnieniem bufora. Może umożliwić dostęp do kompute- ra osobom nieuprzywilejowanym. Należy wystrzegać się tego typu konstrukcji, a w miejsce niebezpiecznej funkcji strcpy stosować bardziej bezpieczną strncpy. Oto bezpieczna wersja poprzedniego programu: #include #include #include int main(int argc, char **argv) { char haslo_poprawne = 0; char haslo[16]; if (argc!=2) { fprintf(stderr, "uzycie: %s haslo", argv[0]); return EXIT_FAILURE; } strncpy(haslo, argv[1], sizeof haslo - 1); haslo[sizeof haslo - 1] = 0; if (!strcmp(haslo, "poprawne")) { haslo_poprawne = 1; } if (!haslo_poprawne) { fputs("Podales bledne haslo.\n", stderr); return EXIT_FAILURE; } puts("Witaj, wprowadziles poprawne haslo."); return EXIT_SUCCESS; }
... zobacz całą notatkę
Komentarze użytkowników (0)