bzero(3) Library Functions Manual bzero(3) NAZWA bzero, explicit_bzero - zeruje lancuch bajtow BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include void bzero(void s[.n], size_t n); #include void explicit_bzero(void s[.n], size_t n); OPIS Funkcja bzero() usuwa dane w n bajtach pamieci, zaczynajac od polozenia wskazanego przez s, zapisujac do tego obszaru zera (bajty zawierajace '\0'). Funkcja explicit_bzero() wykonuje to samo zadanie co bzero(). Rozni sie od bzero() tym, ze wystepuje tu gwarancja, iz operacja usuwania nie zostanie pominieta ze wzgledu na wydedukowanie przez optymalizacje kompilatora, ze jest ,,niepotrzebna". WARTOSC ZWRACANA Brak. ATRYBUTY Informacje o pojeciach uzywanych w tym rozdziale mozna znalezc w podreczniku attributes(7). +---------------------------+--------------------------+---------------+ |Interfejs | Atrybut | Wartosc | +---------------------------+--------------------------+---------------+ |bzero(), explicit_bzero() | Bezpieczenstwo watkowe | MT-bezpieczne | +---------------------------+--------------------------+---------------+ STANDARDY Brak. HISTORIA explicit_bzero() glibc 2.25. Funkcja explicit_bzero() jest rozszerzeniem niestandardowym, obecnym rowniez w niektorych BSD. Niektore inne implementacje posiadaja podobna funkcje np. memset_explicit() lub memset_s(). bzero() 4.3BSD. Oznaczone jako LEGACY (przestarzale) w POSIX.1-2001. Usunieta w POSIX.1-2008. UWAGI Funkcja explicit_bzero() odpowiada na problem, na ktory moga natknac sie aplikacje zwracajace uwage na bezpieczenstwo, przy uzywaniu bzero(): jesli kompilator moze wywnioskowac, ze polozenie, ktore ma zostac wyzerowane, nie bedzie nigdy wiecej osiagniete przez program correct, moze zupelnie usunac wywolanie bzero(). Jest to problemem, gdy wywolanie bzero() mialo usunac wrazliwe dane (np. hasla), aby zapobiec mozliwosci wycieku danych przez niepoprawny lub przelamany program. Wywolania do explicit_bzero() nigdy nie sa optymalizowane przez kompilator. Funkcja explicit_bzero() nie rozwiazuje jednak wszystkich problemow zwiazanych z usuwaniem wrazliwych danych: o Funkcja explicit_bzero() nie gwarantuje calkowitego usuniecia wrazliwych danych z pamieci (jest to prawdziwe rowniez w przypadku bzero()). Kopie wrazliwych danych moga byc na przyklad przechowywane w rejestrze i w przestrzeniach ,,scratch" stosu. Funkcja explicit_bzero() nie jest swiadoma ich istnienia i nie moze ich usunac. o W niektorych okolicznosciach, explicit_bzero() moze pogorszyc bezpieczenstwo. Jesli kompilator dojdzie do wniosku, ze zmienna przechowujaca wrazliwe dane moze byc zoptymalizowana przez przechowanie w rejestrze (poniewaz jest na tyle mala, ze moze sie zmiescic w rejestrze, a do pobrania adresu zmiennej nie jest konieczne operacja inna niz wywolanie explicit_bzero()), to wywolanie explicit_bzero() wymusi skopiowanie danych z rejestru do polozenia w RAM-ie, ktore jest nastepnie niezwlocznie usuwane (natomiast kopia w rejestrze pozostaje nienaruszona). Problemem jest tu fakt, ze dane w RAM-ie moga byc latwiej odsloniete przez blad, niz dane w rejestrze, zatem wywolanie explicit_bzero() tworzy krotkie okno czasowe, gdy wrazliwe dane sa bardziej narazone, niz bylyby gdyby nie probowano usunac danych. Prosze zauwazyc, ze deklarowanie wrazliwych zmiennych kwalifikatorem volatile nie eliminuje powyzszych problemow. W rzeczywistosci pogarsza je, poniewaz moze na przyklad wymusic sytuacje, gdy zmienna, ktora zostalaby zoptymalizowana do rejestru, bedzie w zamian utrzymywana w (bardziej narazonej) pamieci RAM, przez caly swoj okres istnienia. Jednak pomimo powyzszych detali, aplikacje zwracajace uwage na bezpieczenstwo powinny raczej korzystac z explicit_bzero(), niz tego nie robic. Deweloperzy explicit_bzero() spodziewaja sie, ze przyszle kompilatory beda rozpoznawaly wywolania do explicit_bzero() i podejma kroki, aby upewnic sie, ze wszystkie kopie wrazliwych danych zostaly usuniete, w tym takze kopie w rejestrze i w obszarach ,,scratch" stosu. ZOBACZ TAKZE bstring(3), memset(3), swab(3) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Adam Byrtek , Andrzej Krzysztofowicz , Robert Luberda i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.12 23 lipca 2024 r. bzero(3)