Что такое залог?
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)
..........