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