Czym w skrócie jest obietnica OpenBSD?

18

Czy ktoś może opisać, co nie jest programistą, ale osobą IT, czym jest przyrzeczenie ?

Np .: istnieje program, np .: „xterm”. W jaki sposób zastaw może zwiększyć bezpieczeństwo? Przysięga w kodzie programu, czy na zewnątrz w samym systemie operacyjnym?

Gdzie jest zastaw? Czy to jest w kodzie programów; czy system operacyjny ma listę plików binarnych, które mogą wywoływać tylko wywołania systemowe xy?

Piotr
źródło

Odpowiedzi:

13

Co to jest zastaw?

pledge to wywołanie systemowe.

Wywołanie pledgeprogramu ma obiecać, że program będzie używał tylko niektórych zasobów.

Innym sposobem powiedzenia jest ograniczenie działania programu do jego potrzeb, np.

„Przyrzekam, że nie będę używać żadnych innych portów poza port 63
„Przysięgam, że nie będę używać żadnych innych wywołań systemowych oprócz lseek()i fork()

W jaki sposób zwiększa bezpieczeństwo programu?

Ogranicza działanie programu. Przykład:

  • Napisałeś program o nazwie, xyzktóry potrzebuje tylko readwywołania systemowego.
  • Następnie dodajesz pledgetylko do użycia, readale nic więcej.
  • Następnie złośliwy użytkownik odkrył, że w twoim programie istnieje luka, za pomocą której można wywołać rootpowłokę.
  • Wykorzystanie programu do otwarcia rootpowłoki spowoduje, że jądro zabije proces za pomocą SIGABRT(którego nie można złapać / zignorować) i wygeneruje dziennik (który można znaleźć dmesg).

Dzieje się tak, ponieważ przed wykonaniem innych kodów programu najpierw pledgenie używa się niczego innego niż readwywołanie systemowe. Ale otwarcie rootpowłoki wywoła kilka innych wywołań systemowych, co jest zabronione, ponieważ już obiecano, że nie będzie używać innych read.

Gdzie jest zastaw?

Zazwyczaj jest w programie. Użycie ze strony podręcznika OpenBSD 6.5 :

#include <unistd.h>

int pledge(const char *promises, const char *execpromises);

Przykładowy kod: Przykładowy kod catpolecenia z cat.c

........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
    err(1, "pledge");

while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........
Mahomet
źródło
5

Program zwykle wykorzystuje tylko pewien zestaw wywołań systemowych lub bibliotecznych. Za pomocą pledgemożesz ograniczyć zestaw dozwolonych wywołań systemowych tylko do tego zestawu. Na przykład, jeśli program nie musi czytać bazy danych haseł, możesz zabronić wywoływania getpwnam()funkcji.

Jak to jest przydatne? Jest to dodatkowa linia obrony przed słabymi punktami. Jeśli program zawiera błąd, ktoś może wykorzystać błąd, aby zmienić przebieg wykonywania programu lub wprowadzić dodatkowy kod do procesu. Błąd może być na przykład błędem przepełnienia bufora w demonie sieciowym, który atakujący może wyzwolić, wysyłając programowi więcej danych niż jest w stanie obsłużyć, ewentualnie organizując odczyt i przesłanie zawartości /etc/passwdpliku przez sieć.

Johan Myréen
źródło
4

Twój program „zobowiązuje się” do korzystania tylko z funkcji {A, B, C}

Jeśli haker może wstrzyknąć kod do zadeklarowanego procesu i wypróbować funkcjonalność D, system operacyjny powoduje awarię programu

Załóżmy na przykład, że masz serwer NTP. Zobowiązał się używać tylko funkcji DNS i CLOCK. Ma jednak wadę, która umożliwia zdalne wykonanie kodu. Hacker prosi o NAPISZ PLIK. Ale pledgewykryje to i zamknie program i zarejestruje błąd

Neil McGuigan
źródło