有人可以描述一下,对于非程序员但 IT 人员,什么是承诺?
例如:有一个程序,例如:“xterm”。质押如何使其更安全?它承诺在程序代码内部,还是在操作系统本身之外?
承诺在哪里?是否在程序代码中;或者操作系统是否有一个只能调用 xy 系统调用的二进制文件列表?
ari*_*rif 15
什么是誓约?
pledge
是系统调用。
调用pledge
一个程序就是承诺该程序将只使用某些资源。
另一种说法是将程序的操作限制为它的需要,例如,
“我保证不使用任何其他端口,除了
port 63
”
“我保证不使用任何其他系统调用,除了lseek()
和fork()
”
它如何使程序更安全?
它限制了程序的运行。例子:
xyz
,它只需要read
系统调用。pledge
到 use onlyread
而没有别的。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);
Run Code Online (Sandbox Code Playgroud)
示例代码:cat
来自cat.c的命令示例代码
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........
Run Code Online (Sandbox Code Playgroud)
程序通常只使用一组特定的系统或库调用。随着pledge
您可以限制该允许系统调用的只有这一套。例如,如果程序不需要读取密码数据库,则可以禁止调用该getpwnam()
函数。
这有什么用?它是抵御漏洞的额外防线。如果程序包含错误,有人可能会利用该错误来改变程序的执行流程或向进程注入一些额外的代码。例如,该漏洞可能是面向网络的守护进程中的缓冲区溢出错误,攻击者可以通过向程序发送超出其处理能力的数据来触发该错误,可能会安排程序通过网络读取和发送/etc/passwd
文件内容。网络。
您的程序“承诺”仅使用功能 {A,B,C}
如果黑客可以将代码注入到您承诺的进程中并尝试功能 D,那么操作系统就会使您的程序崩溃
例如,假设您有一个 NTP 服务器。它承诺仅使用 DNS 和 CLOCK 功能。但它有一个缺陷,允许远程执行代码。黑客要求它写入文件。但pledge
会检测到这一点并关闭程序并记录错误