简而言之,OpenBSD的承诺是什么?


18

可有人请说明,对于一个非程序员,但它的人,有什么承诺

例如:有一个程序,例如:“ xterm”。保证书如何使它更安全?它承诺在程序代码内部,还是在操作系统本身外部?

承诺在哪里?是在程序代码中吗?还是操作系统具有只能调用xy syscall的二进制文件列表?

Answers:


13

什么是承诺?

pledge 是系统调用。

调用pledge程序是为了保证该程序将仅使用某些资源。

另一种说法是将程序的操作限制为满足其需要,例如,

“我保证不使用任何其他端口,除了port 63
“我保证不使用任何其他系统调用,除了lseek()fork()

它如何使程序更安全?

它限制了程序的运行。例:

  • 您编写了一个xyz仅需要read系统调用的程序。
  • 然后,您pledge只添加要使用的内容,read而别无其他。
  • 然后,恶意用户发现您的程序中存在一个漏洞,可以通过该漏洞调用rootshell。
  • 利用您的程序打开root外壳程序将导致内核使用SIGABRT(无法捕获/忽略)杀死进程并生成日志(可以使用找到dmesg)。

发生这种情况的原因是,在执行程序的其他代码之前,它首先pledge不要使用read系统调用以外的任何东西。但是打开rootshell会调用其他几个系统调用,这是被禁止的,因为它已经承诺不会使用其他任何系统调用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)
..........

5

程序通常仅使用一组特定的系统或库调用。使用pledge可以将允许的系统调用的集合限制为仅此集合。例如,如果程序不需要读取密码数据库,则可以禁止调用该getpwnam()函数。

这有什么用?这是针对漏洞的另一道防线。如果程序包含错误,则可能有人可以利用利用该错误来更改程序的执行流程或向流程中注入一些额外的代码。例如,该错误可能是面对网络的守护程序中的缓冲区溢出错误,攻击者可以通过向程序发送超出其处理能力的数据来触发该错误,并可能安排该程序通过该程序读取和发送/etc/passwd文件的内容。网络。


4

您的程序“保证”仅使用功能{A,B,C}

如果黑客可以将代码注入您承诺的进程中并尝试功能D,则OS会使您的程序崩溃

例如,假设您有一个NTP服务器。它已承诺仅使用DNS和CLOCK功能。但是它具有允许远程执行代码的缺陷。黑客要求它写入文件。但是pledge会检测到并关闭程序并记录错误

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.