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