有人可以描述一下,对于一个非程序员但 IT 人员来说,什么是保证?
例如:有一个程序,例如:“xterm”。质押如何才能更安全?它在程序代码内部,还是在操作系统本身外部?
承诺在哪里?是否在程序代码中?或者操作系统是否有一个只能调用 xy 系统调用的二进制文件列表?
答案1
什么是质押?
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
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........
答案2
程序通常仅使用一组特定的系统或库调用。您pledge
可以将允许的系统调用集限制为仅此集。例如,如果程序不需要读取密码数据库,则可以禁止调用该getpwnam()
函数。
这有什么用?这是针对漏洞的额外防线。如果程序包含错误,有人可能能够利用该错误来改变程序的执行流程或向进程中注入一些额外的代码。例如,该错误可能是面向网络的守护程序中的缓冲区溢出错误,攻击者可以通过向程序发送超出其处理能力的数据来触发该错误,可能会安排程序通过网络读取和发送文件内容/etc/passwd
。网络。
答案3
您的程序“承诺”仅使用功能 {A,B,C}
如果黑客可以将代码注入您承诺的进程并尝试功能 D,那么操作系统就会使您的程序崩溃
例如,假设您有一个 NTP 服务器。它承诺仅使用 DNS 和 CLOCK 功能。但它有一个缺陷,允许远程执行代码。黑客要求它写入文件。但pledge
会检测到这一点并关闭程序并记录错误