【问题标题】:Linux inheritable capability cleared on program startLinux 可继承功能在程序启动时清除
【发布时间】:2019-03-30 16:06:36
【问题描述】:

我正在尝试启动一个具有网络权限的程序,以便它可以执行 iptables 而不是 root 用户。我需要CAP_NET_ADMIN 是可继承和允许的。似乎在启动可执行文件时清除了可继承标志,但无效或不允许:

Script started on Thu 25 Oct 2018 11:09:45 PM UTC
[ec2-user@ip-172-31-16-197 cap_question]$ cat caps.c 
#include <stdio.h>
#include <stdlib.h>
#include <sys/capability.h>

int main(int argc, char **argv) {
    cap_t caps = cap_get_proc();
    printf("Inside the executable [%s]\n", argv[0]);
    char *cap_text = cap_to_text(caps, NULL);
    printf("capabilities %s\n", cap_text);
    cap_free(cap_text);
    cap_free(caps);
}
[ec2-user@ip-172-31-16-197 cap_question]$ cc caps.c -o caps -lcap
[ec2-user@ip-172-31-16-197 cap_question]$ sudo setcap cap_net_admin=eip caps
[ec2-user@ip-172-31-16-197 cap_question]$ getcap caps
caps = cap_net_admin+eip
[ec2-user@ip-172-31-16-197 cap_question]$ ./caps
Inside the executable [./caps]
capabilities = cap_net_admin+ep
[ec2-user@ip-172-31-16-197 cap_question]$ exit

Script done on Thu 25 Oct 2018 11:10:25 PM UTC

如您所见,可执行文件为cap_net_admin=eip。但是当我实际运行它时,权限集是cap_net_admin=ep。我不明白为什么可执行文件在启动时会丢弃可继承。如果我去fork/exec iptables,它不会收到这些权限。

我已经多次阅读threads like theseman capabilities,我能想到的最好解释是我的shell 没有cap_net_admin=i,所以子进程没有。如何根据需要设置可继承标志来启动进程?

【问题讨论】:

    标签: c linux permissions file-permissions linux-capabilities


    【解决方案1】:

    根据capabilities(7)

    execve(2) 期间,内核使用以下算法计算进程的新能力:

       P'(permitted) = (P(inheritable) & F(inheritable)) |
                        (F(permitted) & cap_bset)
    
       P'(effective) = F(effective) ? P'(permitted) : 0
    
       P'(inheritable) = P(inheritable)    [i.e., unchanged]
    

    P(inheritable)表示进程中的可继承位,F(inheritable)是正在执行的文件的可继承位。可以看到,F(inheritable)只是用来确定进程允许的能力,不用来确定可继承的能力。

    文件的可继承功能与进程的可继承功能进行“与”运算——这允许您使用此标志防止在新进程中设置某些功能,它不用于向新进程添加任何内容。

    如果您想从您的流程中继承该功能,您可以致电cap_set_proc()。当一个能力被允许时,你就可以使其可继承。

    【讨论】:

    • 我试过这个。如果我在二进制文件上设置cap_net_admin,cap_net_raw=pcap_set_proc 在尝试将功能设置为可继承时将失败。如果我申请cap_setpcap=ep,它确实有效,但那时我也可能是 root。
    • 我不知道为什么。手册页说,允许集是可以添加到可继承集的限制。因此,如果您有 cap_net_admin=ep,您应该能够使其可继承。
    • 再次测试——你是对的。实际问题是将错误的长度 ncap 传递给 cap_set_flag。你回答的最后一句话帮助很大!
    猜你喜欢
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多