Security
簡而言之,OpenBSD 的承諾是什麼?
有人可以描述一下,對於非程序員但 IT 人員,什麼是承諾?
例如:有一個程序,例如:“xterm”。質押如何使其更安全?它承諾在程式碼內部,還是在作業系統本身外部?
質押在哪裡?是否在程式碼中;或者作業系統是否有一個只能呼叫 xy 系統呼叫的二進製文件列表?
什麼是質押?
pledge
是系統呼叫。呼叫
pledge
程序就是承諾程序只會使用某些資源。另一種說法是將程序的操作限制為其需要,例如,
“我保證不使用任何其他埠,除了
port 63
”“我保證不使用任何其他系統呼叫,除了
lseek()
和fork()
”它如何使程序更安全?
它限制了程序的執行。例子:
- 您編寫了一個名為
xyz
只需要read
係統呼叫的程序。- 然後你添加
pledge
只使用read
但沒有別的。- 然後一個惡意使用者發現在你的程序中存在一個可以呼叫
root
shell 的漏洞。- 利用你的程序打開一個
root
shell將導致核心將終止程序SIGABRT
(不能被擷取/忽略)並生成一個日誌(你可以找到dmesg
)。這是因為在執行程序的其他程式碼之前,它首先不使用系統呼叫
pledge
以外的任何東西。read
但是打開root
shell 會呼叫其他幾個系統呼叫,這是被禁止的,因為它已經承諾不使用任何其他但read
.誓約在哪裡?
它通常在一個程序中。OpenBSD 6.5 手冊頁中的用法:
#include <unistd.h> int pledge(const char *promises, const char *execpromises);
範常式式碼:來自cat.c
cat
的命令範常式式碼........ #include <unistd.h> ........ int ch; if (pledge("stdio rpath", NULL) == -1) err(1, "pledge"); while ((ch = getopt(argc, argv, "benstuv")) != -1) ..........