Peter Asked: 2017-12-11 06:28:14 +0800 CST2017-12-11 06:28:14 +0800 CST 2017-12-11 06:28:14 +0800 CST 简而言之,OpenBSD 的承诺是什么? 772 有人可以描述一下,对于非程序员但 IT 人员,什么是承诺? 例如:有一个程序,例如:“xterm”。质押如何使其更安全?它承诺在程序代码内部,还是在操作系统本身外部? 质押在哪里?是否在程序代码中;或者操作系统是否有一个只能调用 xy 系统调用的二进制文件列表? security openbsd 3 个回答 Voted Best Answer arif 2017-12-16T14:08:54+08:002017-12-16T14:08:54+08:00 什么是质押? pledge是系统调用。 调用pledge程序就是承诺程序只会使用某些资源。 另一种说法是将程序的操作限制为其需要,例如, “我保证不使用任何其他端口,除了port 63” “我保证不使用任何其他系统调用,除了lseek()和fork()” 它如何使程序更安全? 它限制了程序的运行。例子: 您编写了一个名为xyz只需要read系统调用的程序。 然后你添加pledge只使用read但没有别的。 然后一个恶意用户发现在你的程序中存在一个可以调用rootshell 的漏洞。 利用你的程序打开一个rootshell将导致内核将终止进程SIGABRT(不能被捕获/忽略)并生成一个日志(你可以找到dmesg)。 这是因为在执行程序的其他代码之前,它首先不使用系统调用pledge以外的任何东西。read但是打开rootshell 会调用其他几个系统调用,这是被禁止的,因为它已经承诺不使用任何其他但read. 誓约在哪里? 它通常在一个程序中。OpenBSD 6.5 手册页中的用法: #include <unistd.h> int pledge(const char *promises, const char *execpromises); 示例代码:来自cat.ccat的命令示例代码 ........ #include <unistd.h> ........ int ch; if (pledge("stdio rpath", NULL) == -1) err(1, "pledge"); while ((ch = getopt(argc, argv, "benstuv")) != -1) .......... Johan Myréen 2017-12-11T07:51:43+08:002017-12-11T07:51:43+08:00 程序通常只使用一组特定的系统或库调用。您可以将pledge允许的系统调用集限制为仅此集。例如,如果程序不需要读取密码数据库,您可以禁止调用该getpwnam()函数。 这有什么用?这是针对漏洞的额外防线。如果程序包含错误,那么有人可能会利用该错误来改变程序的执行流程或向进程中注入一些额外的代码。例如,该错误可能是面向网络的守护程序中的缓冲区溢出错误,攻击者可以通过向程序发送超出其处理能力的数据来触发该错误,可能会安排程序/etc/passwd通过网络。 Neil McGuigan 2017-12-13T11:35:38+08:002017-12-13T11:35:38+08:00 您的程序“承诺”只使用功能 {A,B,C} 如果黑客可以将代码注入您的承诺进程并尝试功能 D,那么操作系统会使您的程序崩溃 例如,假设您有一个 NTP 服务器。它承诺只使用 DNS 和 CLOCK 功能。但它有一个允许远程代码执行的缺陷。黑客要求它写入文件。但pledge会检测到这一点并关闭程序并记录错误
什么是质押?
pledge
是系统调用。调用
pledge
程序就是承诺程序只会使用某些资源。另一种说法是将程序的操作限制为其需要,例如,
它如何使程序更安全?
它限制了程序的运行。例子:
xyz
只需要read
系统调用的程序。pledge
只使用read
但没有别的。root
shell 的漏洞。root
shell将导致内核将终止进程SIGABRT
(不能被捕获/忽略)并生成一个日志(你可以找到dmesg
)。这是因为在执行程序的其他代码之前,它首先不使用系统调用
pledge
以外的任何东西。read
但是打开root
shell 会调用其他几个系统调用,这是被禁止的,因为它已经承诺不使用任何其他但read
.誓约在哪里?
它通常在一个程序中。OpenBSD 6.5 手册页中的用法:
示例代码:来自cat.c
cat
的命令示例代码程序通常只使用一组特定的系统或库调用。您可以将
pledge
允许的系统调用集限制为仅此集。例如,如果程序不需要读取密码数据库,您可以禁止调用该getpwnam()
函数。这有什么用?这是针对漏洞的额外防线。如果程序包含错误,那么有人可能会利用该错误来改变程序的执行流程或向进程中注入一些额外的代码。例如,该错误可能是面向网络的守护程序中的缓冲区溢出错误,攻击者可以通过向程序发送超出其处理能力的数据来触发该错误,可能会安排程序
/etc/passwd
通过网络。您的程序“承诺”只使用功能 {A,B,C}
如果黑客可以将代码注入您的承诺进程并尝试功能 D,那么操作系统会使您的程序崩溃
例如,假设您有一个 NTP 服务器。它承诺只使用 DNS 和 CLOCK 功能。但它有一个允许远程代码执行的缺陷。黑客要求它写入文件。但
pledge
会检测到这一点并关闭程序并记录错误