Security

簡而言之,OpenBSD 的承諾是什麼?

  • June 4, 2019

有人可以描述一下,對於非程序員但 IT 人員,什麼是承諾

例如:有一個程序,例如:“xterm”。質押如何使其更安全?它承諾在程式碼內部,還是在作業系統本身外部?

質押在哪裡?是否在程式碼中;或者作業系統是否有一個只能呼叫 xy 系統呼叫的二進製文件列表?

什麼是質押?

pledge是系統呼叫。

呼叫pledge程序就是承諾程序只會使用某些資源。

另一種說法是將程序的操作限制為其需要,例如,

“我保證不使用任何其他埠,除了port 63

“我保證不使用任何其他系統呼叫,除了lseek()fork()

它如何使程序更安全?

它限制了程序的執行。例子:

  • 您編寫了一個名為xyz只需要read係統呼叫的程序。
  • 然後你添加pledge只使用read但沒有別的。
  • 然後一個惡意使用者發現在你的程序中存在一個可以呼叫rootshell 的漏洞。
  • 利用你的程序打開一個rootshell將導致核心將終止程序SIGABRT(不能被擷取/忽略)並生成一個日誌(你可以找到dmesg)。

這是因為在執行程序的其他程式碼之前,它首先不使用系統呼叫pledge以外的任何東西。read但是打開rootshell 會呼叫其他幾個系統呼叫,這是被禁止的,因為它已經承諾不使用任何其他但read.

誓約在哪裡?

它通常在一個程序中。OpenBSD 6.5 手冊頁中的用法:

#include <unistd.h>

int pledge(const char *promises, const char *execpromises);

範常式式碼:來自cat.ccat的命令範常式式碼

........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
   err(1, "pledge");

while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........

引用自:https://unix.stackexchange.com/questions/410056