标签: linux-capabilities

如何找出一个进程需要工作的Linux功能?

我处在一个困难的境地,我不知道一个进程需要工作的Linux功能.什么是最好的方法,或任何方式找出所需的上限?

我现在唯一能想到的就是使用capsh并放弃进程上的所有上限.然后该过程失败,我开始添加大写(通过删除--drop = CAP_XZY),直到它工作.

有更好的建议吗?

linux debugging linux-kernel linux-capabilities

9
推荐指数
3
解决办法
7891
查看次数

fork和execve继承非特权父进程的功能

在Linux系统中,无特权的用户启动程序.创建的进程CAP_NET_RAW,CAP_NET_ADMIN具有模式为的功能effective,permitted,inheritable.然后,此过程通过调用forkexecv调用另一个程序udhcpc来创建子进程,但子进程不会CAP_NET_RAW,CAP_NET_ADMIN按预期继承这些功能.即使在设置我调用的功能之前prctl(PR_SET_KEEPCAPS, 1).

什么任何建议做非特权继承父进程的能力,在fork后面execve

linux linux-capabilities

8
推荐指数
1
解决办法
4661
查看次数

gdb似乎忽略了可执行功能

我正在调试一个使用的程序libnetfilter_queue.该文档指出用户空间队列处理应用程序需要CAP_NET_ADMIN能够运行.我使用该setcap实用程序完成了以下操作:

$ sudo setcap cap_net_raw,cap_net_admin=eip ./a.out
Run Code Online (Sandbox Code Playgroud)

我已经验证了这些功能是否正确应用为a)程序正常工作,b)getcap返回以下输出:

$ getcap ./a.out
./a.out = cap_net_admin,cap_net_raw+eip
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用gdb(例如$ gdb ./a.out)命令行调试此程序时,由于没有设置正确的权限,它会失败.调试功能gdb完全正常工作,并按照正常情况进行调试.

我甚至试图将这些功能应用于gdb二进制本身无济于事.我这样做了(正如manpages所记载的那样," i"标志可能允许debugee从调试器继承该功能.

有什么微不足道的我遗失或者这真的不能做到吗?

linux gdb network-programming sniffing linux-capabilities

7
推荐指数
3
解决办法
2757
查看次数

在Perl中编辑linux功能

在C程序中,您可以使用cap_set_procfrom 编辑功能libcap.如何在Perl程序中实现相同的功能?

linux perl linux-capabilities

7
推荐指数
1
解决办法
312
查看次数

如何使用CAP_SYS_ADMIN

有人可以向我解释如何在c中使用或设置CAP_SYS_ADMIN吗?我需要这种能力来卸载USB驱动器但不知道如何使用它.

c linux-capabilities

7
推荐指数
1
解决办法
7699
查看次数

没有root的Python Scapy嗅闻

我想知道是否有可能在没有root权限的情况下运行Scapy的'sniff(...)'.

它用于捕获某些包的应用程序中.但我不想用root权限运行整个应用程序或在scapy itselfe上更改任何内容.

提前致谢!

编辑:

为了测试,我使用以下代码:

from scapy.all import *

def arp_monitor_callback(pkt):
    if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at
        return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%")

sniff(prn=arp_monitor_callback, filter="arp", store=0)
Run Code Online (Sandbox Code Playgroud)

我只能用sudo运行它.

我试着设置功能sudo setcap 'cap_net_admin=+eip' test.py.但它没有显示出任何影响.即使是能力all也无济于事.

sniffing scapy python-2.7 linux-capabilities

7
推荐指数
2
解决办法
5571
查看次数

在docker容器中运行app作为具有功能的非root用户

我试图在一个使用非root用户的docker容器内的端口507上运行一个简单的python UDP echo-server.Dockerfile看起来像这样:

FROM docker.io/centos

RUN yum -y install iputils iproute
COPY echo-server.py /tmp/
USER 1000
CMD ["python", "/tmp/echo-server.py"]
Run Code Online (Sandbox Code Playgroud)

由于507是一个众所周知的端口,我也发出搬运工运行,但我仍然得到一个错误,当增加了功能NET_BIND_SERVICE:

# docker run --cap-add=NET_BIND_SERVICE 4d1c2301b166
Traceback (most recent call last):
  File "/tmp/echo-server.py", line 12, in <module>
    s.bind(('', port))
  File "/usr/lib64/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 13] Permission denied
Run Code Online (Sandbox Code Playgroud)

在检查功能时,我可以看到使用非root用户时未设置有效功能.

[root@srv-tcn-01 ha-service]# docker run --cap-add=NET_BIND_SERVICE 4d1c2301b166 grep Cap /proc/self/status
CapInh: 00000000a80425fb
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 00000000a80425fb
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何在具有非root用户和某些功能的Docker容器中运行程序?

docker linux-capabilities

7
推荐指数
0
解决办法
596
查看次数

尽管缺少基于文件系统的功能,如何执行进程并保留功能?

我想让系统在没有setuid文件“+p”功能的情况下可用,并且通常没有在我设置PR_SET_NO_NEW_PRIVS时禁用的东西。

使用这种方法(init集合PR_SET_NO_NEW_PRIVS和基于文件系统的能力提升不再可能),您无法“重新填充”您的能力,只需要小心不要“泼洒”它们。

如何在execve不“飞溅”任何授予的功能的情况下进行其他处理(例如新程序的文件是否为setcap =ei)?只是“我相信这个新过程就像我相信自己一样”。例如,赋予用户一项能力(并且用户想在他启动的任何程序中行使它)......

我可以永久制作整个文件系统=ei吗?我想让文件系统不干扰该方案,不能授予或撤销功能;通过父->子事物控制一切。

linux execve linux-capabilities

6
推荐指数
1
解决办法
3326
查看次数

使用Linux功能是否会禁用LD_PRELOAD

在我的自定义环境拦截库预装它运行一个特殊的实施bind(),connect()等电话.

我看到的问题是,无论何时使用命令显式启用应用程序setcap,执行应用程序都无法预加载拦截器库并调用默认的libc connect().

这是预期的行为吗?如果是,可能是什么原因禁用LD_PRELOAD

是否有任何调整或方法可用于成功预加载启用功能的库.

c linux shared-libraries linux-kernel linux-capabilities

6
推荐指数
1
解决办法
3597
查看次数

文件功能一旦执行就不会转移到进程

我正在尝试编写一个需要提升功能的程序(而不是简单地使用 sudo 运行它)。但是,我使用 setcap 设置的所有功能似乎都不会在执行后转移到进程中。跨多个可执行文件并使用不同的功能会发生此问题。

此代码使用 cap_set_file() 为作为 CLA 传递的文件提供 CAP_NET_RAW 功能。(不要问我为什么需要这个。)

#include <stdio.h>
#include <stdlib.h>
#include <sys/prctl.h>
#include <sys/capability.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

#define handle_error(msg) \ 
    do { printf("%s: %s\n", msg, strerror(errno)); exit(EXIT_FAILURE); } while (0)

void print_cap_buf(cap_t cur) {
    char *buf;
    buf = cap_to_text(cur, NULL);
    printf("%s\n", buf);
    cap_free(buf);
}

void get_and_print_cap_buf() {
    cap_t cur = cap_get_proc();
    print_cap_buf(cur);
    cap_free(cur);
}

int main(int argc, char *argv[]) {
    cap_t file_cap;

    printf("Process capabilities: ");
    get_and_print_cap_buf(); // Print the …
Run Code Online (Sandbox Code Playgroud)

linux linux-capabilities

6
推荐指数
1
解决办法
1051
查看次数