Co to jest zastaw?
pledge
to wywołanie systemowe.
Wywołanie pledge
programu 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,
xyz
który potrzebuje tylko read
wywołania systemowego.
- Następnie dodajesz
pledge
tylko do użycia, read
ale 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ć
root
powłokę.
- Wykorzystanie programu do otwarcia
root
powł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 pledge
nie używa się niczego innego niż read
wywołanie systemowe. Ale otwarcie root
powł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 cat
polecenia z cat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........