OpenBSD的pledge()调用
November 3, 2018 默认分类
pledge()
(保证)是OpenBSD用于限制程序可以使用的系统调用的系统调用,和Linux内核的seccomp
类似。但是,使用了bpf的seccomp
相当复杂,即使使用libseccomp
,编写和加载规则仍有难度。同时,bpf也可能引入额外的安全隐患。而plegde()
,使用了两个包含关键词的字符串,叫做promise
和execpromise
,就可以对进程可用的系统调用加以限制。其中,前一个是对当前进程施加的限制,后一个是对pledge
后执行的新二进制映像施加的限制(如果允许execve()
)。如有违例,进程会被杀死(除非有error
关键词,此时向进程返回错误)。
通过对libc
和应用程序的分析,OpenBSD将系统调用分为若干类,每类用一个关键词表示,即使是其中允许的系统调用,也可能会有额外限制,需要另一个关键词允许。例如,mmap
和mprotect
被允许时,若要使用PROT_EXEC
使内存可执行,需要添加关键词prot_exec
。如果传入的字符串为空,则施加最严厉的限制——只允许_exit()
。和大部分降权调用一样,试图增加权限的行为会失败。
lwn上,flussence说,Linux的安全子系统似乎更注重系统管理员的饭碗安全,而不是系统安全。这些子系统需要很大的精力学习和配置。这个情况需要改变。https://lwn.net/Articles/767184/