我处在一个困难的境地,我不知道一个进程需要工作的Linux功能.什么是最好的方法,或任何方式找出所需的上限?
我现在唯一能想到的就是使用capsh并放弃进程上的所有上限.然后该过程失败,我开始添加大写(通过删除--drop = CAP_XZY),直到它工作.
有更好的建议吗?
在Linux系统中,无特权的用户启动程序.创建的进程CAP_NET_RAW,CAP_NET_ADMIN具有模式为的功能effective,permitted,inheritable.然后,此过程通过调用fork和 execv调用另一个程序udhcpc来创建子进程,但子进程不会CAP_NET_RAW,CAP_NET_ADMIN按预期继承这些功能.即使在设置我调用的功能之前prctl(PR_SET_KEEPCAPS, 1).
什么任何建议做非特权继承父进程的能力,在fork后面execve?
我正在调试一个使用的程序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从调试器继承该功能.
有什么微不足道的我遗失或者这真的不能做到吗?
在C程序中,您可以使用cap_set_procfrom 编辑功能libcap.如何在Perl程序中实现相同的功能?
有人可以向我解释如何在c中使用或设置CAP_SYS_ADMIN吗?我需要这种能力来卸载USB驱动器但不知道如何使用它.
我想知道是否有可能在没有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也无济于事.
我试图在一个使用非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容器中运行程序?
我想让系统在没有setuid文件“+p”功能的情况下可用,并且通常没有在我设置PR_SET_NO_NEW_PRIVS时禁用的东西。
使用这种方法(init集合PR_SET_NO_NEW_PRIVS和基于文件系统的能力提升不再可能),您无法“重新填充”您的能力,只需要小心不要“泼洒”它们。
如何在execve不“飞溅”任何授予的功能的情况下进行其他处理(例如新程序的文件是否为setcap =ei)?只是“我相信这个新过程就像我相信自己一样”。例如,赋予用户一项能力(并且用户想在他启动的任何程序中行使它)......
我可以永久制作整个文件系统=ei吗?我想让文件系统不干扰该方案,不能授予或撤销功能;通过父->子事物控制一切。
在我的自定义环境拦截库预装它运行一个特殊的实施bind(),connect()等电话.
我看到的问题是,无论何时使用命令显式启用应用程序setcap,执行应用程序都无法预加载拦截器库并调用默认的libc connect().
这是预期的行为吗?如果是,可能是什么原因禁用LD_PRELOAD?
是否有任何调整或方法可用于成功预加载启用功能的库.
我正在尝试编写一个需要提升功能的程序(而不是简单地使用 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)