bzero(3)

NAZWA
bzero, explicit_bzero - zeruje łańcuch bajtów

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

SKŁADNIA
#include <strings.h>

void bzero(void s[.n], size_t n);

#include <string.h>

void explicit_bzero(void s[.n], size_t n);

OPIS
Funkcja bzero() usuwa dane w n bajtach pamięci, zaczynając od położenia wskazanego przez s, zapisując do tego obszaru zera (bajty zawierające '\0').

Funkcja explicit_bzero() wykonuje to samo zadanie co bzero(). Różni się od bzero() tym, że występuje tu gwarancja, iż operacja usuwania nie zostanie pominięta ze względu na wydedukowanie przez optymalizacje kompilatora, że jest „niepotrzebna”.

WARTOŚĆ ZWRACANA
Brak.

ATRYBUTY
Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).
Interfejs | Atrybut | Wartość
bzero(), explicit_bzero() | Bezpieczeństwo wątkowe | MT-bezpieczne

STANDARDY
Brak.

HISTORIA

explicit_bzero()
    glibc 2.25.

    Funkcja explicit_bzero() jest rozszerzeniem niestandardowym, obecnym również w niektórych BSD. Niektóre inne implementacje posiadają podobną funkcję np. memset_explicit() lub memset_s().

bzero()
    4.3BSD.

    Oznaczone jako LEGACY (przestarzałe) w POSIX.1-2001. Usunięta w POSIX.1-2008.

UWAGI
Funkcja explicit_bzero() odpowiada na problem, na który mogą natknąć się aplikacje zwracające uwagę na bezpieczeństwo, przy używaniu bzero(): jeśli kompilator może wywnioskować, że położenie, które ma zostać wyzerowane, nie będzie nigdy więcej osiągnięte przez program correct, może zupełnie usunąć wywołanie bzero(). Jest to problemem, gdy wywołanie bzero() miało usunąć wrażliwe dane (np. hasła), aby zapobiec możliwości wycieku danych przez niepoprawny lub przełamany program. Wywołania do explicit_bzero() nigdy nie są optymalizowane przez kompilator.

Funkcja explicit_bzero() nie rozwiązuje jednak wszystkich problemów związanych z usuwaniem wrażliwych danych:

•   Funkcja explicit_bzero() nie gwarantuje całkowitego usunięcia wrażliwych danych z pamięci (jest to prawdziwe również w przypadku bzero()). Kopie wrażliwych danych mogą być na przykład przechowywane w rejestrze i w przestrzeniach „scratch” stosu. Funkcja explicit_bzero() nie jest świadoma ich istnienia i nie może ich usunąć.

•   W niektórych okolicznościach, explicit_bzero() może pogorszyć bezpieczeństwo. Jeśli kompilator dojdzie do wniosku, że zmienna przechowująca wrażliwe dane może być zoptymalizowana przez przechowanie w rejestrze (ponieważ jest na tyle mała, że może się zmieścić w rejestrze, a do pobrania adresu zmiennej nie jest konieczne operacja inna niż wywołanie explicit_bzero()), to wywołanie explicit_bzero() wymusi skopiowanie danych z rejestru do położenia w RAM-ie, które jest następnie niezwłocznie usuwane (natomiast kopia w rejestrze pozostaje nienaruszona). Problemem jest tu fakt, że dane w RAM-ie mogą być łatwiej odsłonięte przez błąd, niż dane w rejestrze, zatem wywołanie explicit_bzero() tworzy krótkie okno czasowe, gdy wrażliwe dane są bardziej narażone, niż byłyby gdyby nie próbowano usunąć danych.

Proszę zauważyć, że deklarowanie wrażliwych zmiennych kwalifikatorem volatile nie eliminuje powyższych problemów. W rzeczywistości pogarsza je, ponieważ może na przykład wymusić sytuację, gdy zmienna, która zostałaby zoptymalizowana do rejestru, będzie w zamian utrzymywana w (bardziej narażonej) pamięci RAM, przez cały swój okres istnienia.

Jednak pomimo powyższych detali, aplikacje zwracające uwagę na bezpieczeństwo powinny raczej korzystać z explicit_bzero(), niż tego nie robić. Deweloperzy explicit_bzero() spodziewają się, że przyszłe kompilatory będą rozpoznawały wywołania do explicit_bzero() i podejmą kroki, aby upewnić się, że wszystkie kopie wrażliwych danych zostały usunięte, w tym także kopie w rejestrze i w obszarach „scratch” stosu.

ZOBACZ TAKŻE
bstring(3), memset(3), swab(3)

TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Adam Byrtek <alpha@irc.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.