为什么加载seccomp过滤器后,PING将无法由普通用户执行

为什么加载seccomp过滤器后,PING将无法由普通用户执行,c,linux,seccomp,C,Linux,Seccomp,我使用seccomp记录“ping”用于系统调用。当我运行它时,它总是会注意到 插座:不允许操作 我可以在bash中很好地运行ping,但在程序中加载seccomp过滤器后就没有工作了 但是如果我用root运行同一个程序,它会运行得很好 这是在Ubuntu 18.04和4.15.0-54-generic内核中运行的 我曾尝试使用Root用户运行该程序,然后在子进程中,我使用setuid(1000)设置为普通用户,但仍然无法运行 如果我不使用叉子,它仍然会注意到没有预设 如果我将seccomp默认

我使用seccomp记录“ping”用于系统调用。当我运行它时,它总是会注意到

插座:不允许操作

我可以在bash中很好地运行ping,但在程序中加载seccomp过滤器后就没有工作了

但是如果我用root运行同一个程序,它会运行得很好

这是在Ubuntu 18.04和4.15.0-54-generic内核中运行的

我曾尝试使用Root用户运行该程序,然后在子进程中,我使用setuid(1000)设置为普通用户,但仍然无法运行

如果我不使用叉子,它仍然会注意到没有预设

如果我将seccomp默认操作更改为SCMP\u ACT\u ALLOW,它仍然不起作用

下面是C编写的一个简单代码

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效子项(){
setuid(1000);
scmp\u filter\u ctx ctx=seccomp\u init(scmp\u ACT\u LOG);
如果(秒压缩负载(ctx)!=0){
printf(“SCMP LAOD ERR!”);
}否则{
seccomp_发布(ctx);
}
execl(“/bin/ping”,“ping”,“-c”,“1”,“172.16.1.1”,NULL);
printf(“执行失败”);
}
int main(){
int p=fork();
if(p<0){
printf(“Frok错误!”);
出口(1);
}
如果(p==0){
child();
}否则{
结构图像使用;
智力状态;
如果(wait4(p、状态和使用情况)=-1){
kill(p,SIGKILL);
}
}
}
我使用
gcc main.c-o main.out-lseccomp
来编译它


英语不是我的第一语言,我对我的语法感到抱歉。

ping
只能作为根。通常它以root用户身份运行,因为它在其文件权限中设置了setuid位:

-rwsr-xr-x 1 root root 44168 May  8  2014 /bin/ping
   ^         ^^^^
   |
this 's' is called 'setuid' and means it wants to run as the user which owns it, which is root
除非您是root用户或设置了。您不是直接使用seccomp,而是通过库使用。看起来库正在为您设置标志


no_new_privs标志意味着您不能运行setuid程序。好吧,你可以运行它们,但它们不是setuid。它们将作为您的用户运行。没有权限按照
ping
要求的方式发送特殊数据包。因此,
ping
失败,因为它没有ping的权限。

不确定,但引起了我的注意。(从那些了解Linux内核的人那里)比我以前了解的更多地了解了
seccomp
no\u new\u privs
标志,谢谢。你是对的,但是我发现,``mtr``命令权限I是`rwxr-xr-x 1 root root 73664 Nov 2017/usr/bin/mtr``,当我在程序中运行它时,它注意到“无法打开IPv4套接字:不允许操作”。你知道这件事吗?@boxjan
mtr
execs
mtr packet
哪个是setuid@immibis衷心感谢您的回答,但我注意到另一件事,我使用的是
strace-ping 192.168.1.1-c1
,它仍然没有得到许可,但是
strace-mtr-r-ping
工作正常。我认为strace没有设置
no_new_priv_flag
,我尝试使用
strace-ff strace-ff ping 192.168.1.1-c1
来跟踪它,我找不到任何东西
prctl
调用。@boxjan strace调用ptrace(并且不显示ptrace),ptrace的进程也不能使用setuid。这是另一面旗。