В чем суть 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обнаружит это и выключит программу и зарегистрирует ошибку

Нил Макгиган
источник