Что такое залог?
pledge это системный вызов.
Вызов pledgeв программе означает, что программа будет использовать только определенные ресурсы.
Другой способ сказать - ограничить работу программы ее потребностями, например:
«Я обязуюсь не использовать никакие другие порты, кроме port 63«
Я обещаю не использовать любые другие системные вызовы, кроме lseek()и fork()»
Как это делает программу более безопасной?
Это ограничивает работу программы. Пример:
- Вы написали программу с именем,
xyzкоторая требует только readсистемного вызова.
- Тогда вы добавляете
pledgeтолько для использования, readно ничего больше.
- Затем злонамеренный пользователь обнаружил, что в вашей программе есть уязвимость, с помощью которой можно вызвать
rootоболочку.
- Использование вашей программы для открытия
rootоболочки приведет к тому, что ядро завершит процесс SIGABRT(который не может быть перехвачен / проигнорирован) и сгенерирует журнал (который вы можете найти с помощью dmesg).
Это происходит потому, что перед выполнением других кодов вашей программы сначала pledgeне нужно использовать ничего, кроме readсистемного вызова. Но открытие rootоболочки вызовет несколько других системных вызовов, что запрещено, потому что уже обещано не использовать ничего другого, кроме read.
Где залог?
Обычно в программе. Использование из справочной страницы OpenBSD 6.5 :
#include <unistd.h>
int pledge(const char *promises, const char *execpromises);
Пример кода: Пример кода catкоманды из cat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........