Answers:
什么是承诺?
pledge
是系统调用。
调用pledge
程序是为了保证该程序将仅使用某些资源。
另一种说法是将程序的操作限制为满足其需要,例如,
“我保证不使用任何其他端口,除了
port 63
”
“我保证不使用任何其他系统调用,除了lseek()
和fork()
”
它如何使程序更安全?
它限制了程序的运行。例:
xyz
仅需要read
系统调用的程序。pledge
只添加要使用的内容,read
而别无其他。root
shell。root
外壳程序将导致内核使用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)
..........
程序通常仅使用一组特定的系统或库调用。使用pledge
可以将允许的系统调用的集合限制为仅此集合。例如,如果程序不需要读取密码数据库,则可以禁止调用该getpwnam()
函数。
这有什么用?这是针对漏洞的另一道防线。如果程序包含错误,则可能有人可以利用利用该错误来更改程序的执行流程或向流程中注入一些额外的代码。例如,该错误可能是面对网络的守护程序中的缓冲区溢出错误,攻击者可以通过向程序发送超出其处理能力的数据来触发该错误,并可能安排该程序通过该程序读取和发送/etc/passwd
文件的内容。网络。