Коротше, в чому полягає застава OpenBSD?


18

Чи може хтось, будь ласка, описати для непрограміста, але ІТ-людини, що таке застава ?

Наприклад: є програма, напр .: "xterm". Як застава може зробити це більш безпечним? Це застава всередині програмного коду чи зовні в самій ОС?

Де застава? Чи в коді програми; чи в ОС є список бінарних файлів, які можуть викликати лише xy-систематичні дзвінки?

Відповіді:


13

Що таке застава?

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)
..........

5

Програма зазвичай використовує лише певний набір системних або бібліотечних викликів. З pledgeвами можна обмежити набір допустимих системних викликів тільки цей набір. Наприклад, якщо програмі не потрібно читати базу даних паролів, ви можете заборонити виклик getpwnam()функції.

Чим це корисно? Це додаткова лінія захисту від вразливих місць. Якщо програма містить помилку, хтось, можливо, зможе скористатися експлуатувати помилку, щоб змінити потік виконання програми або ввести додатковий код у процес. Помилка може бути, наприклад, помилкою переповнення буфера в мережі, що стоїть перед демоном, який може зчинити зловмисник, надіславши програмі більше даних, ніж вона може обробляти, можливо, організувавши програму для читання та надсилання вмісту /etc/passwdфайлу через мережа.


4

Ваша програма "зобов'язується" використовувати лише функціональні можливості {A, B, C}

Якщо хакер міг ввести код у ваш покладений процес і спробувати функціонал D, ОС перерве вашу програму

Наприклад, скажіть, що у вас є сервер NTP. Він пообіцяв використовувати лише функції DNS та CLOCK. Але у нього є недолік, який дозволяє віддалене виконання коду. Хакер просить його НАписати файл. Але pledgeвиявить це і вимкне програму і введе помилку

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.