Що таке застава?
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)
..........