oracular (3) explicit_bzero.3.gz

Provided by: manpages-pl-dev_4.23.1-1_all bug

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).

       ┌───────────────────────────────────────────────────────────────┬────────────────────────┬───────────────┐
       │InterfejsAtrybutWartość       │
       ├───────────────────────────────────────────────────────────────┼────────────────────────┼───────────────┤
       │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⟩.