Wywołania systemowe dostarczające entropię

Wywołania systemowe dostarczające entropię to wywołania systemowe w jądrach systemów operacyjnych typu Unix, za pomocą których procesy mogą uzyskiwać dane entropiczne lub losowe. Pierwszym z nich była getentropy , wprowadzona do systemu operacyjnego OpenBSD w wersji 5.6 (listopad 2014), jako refaktoryzacja podejścia sysctl(3) KERN_ARND używanego od 1997 roku. Linux oferuje bardzo podobne wywołanie systemowe, getrandom , które było oparte na getentropia . Po raz pierwszy był dostępny w Linuksie 3.17, wydanym w październiku 2014 r. W lipcu 2015 r. Solaris wprowadził nieco zmodyfikowane wersje getentropy i getrandom . W sierpniu 2015 roku FreeBSD wprowadził wywołanie systemowe read_random do uzyskiwania losowych danych z jądra.

Te wywołania systemowe umożliwiają procesom dostęp do losowych danych wysokiej jakości bez otwierania i odczytywania z pseudourządzeń losowości .

Microsoft Windows CryptGenRandom i SecRandom API Apple iOS bardzo podobne. Nie są one jednak implementowane jako wywołania systemowe.

Motywacja

Tradycyjnie systemy operacyjne typu Unix dostarczają losowe dane za pośrednictwem dwóch pseudourządzeń : /dev/random i /dev/urandom . Jednak bezpieczne i niezawodne odczytywanie losowych danych z tych urządzeń może być trudne i skomplikowane. Na przykład osoba atakująca może ingerować w dostęp procesu do pseudourządzeń, otwierając wszystkie dostępne deskryptory plików lub stosując podobną formę ataku polegającego na wyczerpaniu zasobów . Korzystanie z tych urządzeń utrudnia również cofnięcie uprawnień . Nieuprzywilejowanym procesom często odmawia się możliwości otwierania i odczytywania plików i urządzeń, a losowe urządzenia nie są nawet widoczne dla procesów chrootowanych .

Trudność w korzystaniu z pseudourządzeń losowości często prowadzi programistów do używania zamiast nich standardowych funkcji bibliotecznych. Niektóre z nich, takie jak rand() języka programowania C , random () POSIX i drand48() , są bardzo niebezpieczne, gdy są używane w kryptografii lub podobnych aplikacjach, ponieważ te algorytmy są w rzeczywistości deterministyczne, ponieważ zostały celowo okaleczone aby spełnić wymagania dotyczące ponownego wykorzystania materiału siewnego za pośrednictwem interfejsów srand() , srandom() i srand48() .

Istnieje znacząca różnica między tymi wywołaniami: getentropy() gwarantuje, że liczby losowe zostaną zwrócone natychmiast, bez żadnego blokowania. Wymaga wsparcia operacyjnego, które gwarantuje losową inicjalizację strumienia danych przy najbliższej okazji. Aby zachęcić inne systemy operacyjne do podążania za tym modelem, getentropy() nie może wskazywać aplikacji błędów. Inne opisane tutaj wywołania mogą zamiast tego zwracać błędy lub blokować w nieokreślony sposób. Taka semantyka blokowania wiąże się z poważnymi problemami.

Ponieważ bezpieczeństwo staje się coraz bardziej powszechnym priorytetem w rozwoju oprogramowania, losowość jakości jest stosowana coraz częściej iw większej liczbie kontekstów. Z tego powodu zapewnienie losowości jakości jest coraz częściej uważane za podstawową odpowiedzialność jądra. Wywołania systemowe to tradycyjny interfejs, przez który proces korzysta z podstawowych usług jądra , dlatego też jądra obsługują losowość dostępu poprzez wywołania systemowe.

Stosowanie

Ponieważ jest szybszy i dodaje kolejną warstwę mieszania entropii, zwykle sugeruje się, aby procesy wykorzystywały dane tych wywołań systemowych za pośrednictwem kryptograficznie bezpiecznego generatora liczb pseudolosowych (CSPRNG) w przestrzeni użytkownika, zamiast przypisywać pobrane dane bezpośrednio do zmiennych. W tym celu standardowa biblioteka C OpenBSD zawiera funkcję arc4random , którą programy powinny wywoływać, gdy potrzebują losowych danych. Podobnie jak getentropy , arc4random również może nie blokować ani nie zwracać błędu.

Takie podejście pozwala programowi pobierać mniej entropii z jądra bez zmniejszania siły jego losowych danych. Wywołanie getentropy jest zaprojektowane w oparciu o to założenie, dostarczając nie więcej niż 256 bajtów na wywołanie.

Zobacz też

Linki zewnętrzne