为什么加载seccomp过滤器后,普通用户PING不通
Why after load seccomp filter, PING will no work by normal user
我使用 seccomp 记录 'ping' 使用系统调用。当我 运行 它时,它总是注意到
socket: Operation not permitted.
我可以 运行 ping bash 非常好,但是在程序中加载 seccomp 过滤器后没有工作。
但是如果我用 root 运行 相同的程序,它会 运行 很好。
这是 运行ning 在 Ubuntu 18.04 中,带有 4.15.0-54-generic 内核。
我试过用root用户运行程序,然后在子进程中,我用setuid(1000)设置为普通用户,还是不行。
如果我不使用fork,它仍然会提示未提交。
如果我将 seccomp 默认操作更改为 SCMP_ACT_ALLOW,它仍然无效。
这是 C 的简单代码。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <signal.h>
#include <seccomp.h>
#include <unistd.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/wait.h>
void child() {
setuid(1000);
scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_LOG);
if (seccomp_load(ctx) != 0) {
printf("SCMP LAOD ERR!");
} else {
seccomp_release(ctx);
}
execl("/bin/ping", "ping", "-c", "1", "172.16.1.1", NULL);
printf("EXEC FAIL");
}
int main(){
int p = fork();
if (p < 0) {
printf("Frok ERROR!");
exit(1);
}
if ( p == 0 ) {
child();
} else {
struct rusage usage;
int status;
if (wait4(p, &status, WSTOPPED, &usage) == -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 flag。您不是直接使用 seccomp,而是通过一个库。看来图书馆正在为您设置标志。
no_new_privs 标志意味着您不能 运行 setuid 程序。好吧,您可以 运行 它们,但它们不会是 setuid。他们将 运行 作为您的用户。它无权按照 ping
要求的方式发送特殊数据包。所以 ping
失败,因为它没有 ping 权限。
我使用 seccomp 记录 'ping' 使用系统调用。当我 运行 它时,它总是注意到
socket: Operation not permitted.
我可以 运行 ping bash 非常好,但是在程序中加载 seccomp 过滤器后没有工作。
但是如果我用 root 运行 相同的程序,它会 运行 很好。
这是 运行ning 在 Ubuntu 18.04 中,带有 4.15.0-54-generic 内核。
我试过用root用户运行程序,然后在子进程中,我用setuid(1000)设置为普通用户,还是不行。
如果我不使用fork,它仍然会提示未提交。
如果我将 seccomp 默认操作更改为 SCMP_ACT_ALLOW,它仍然无效。
这是 C 的简单代码。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <signal.h>
#include <seccomp.h>
#include <unistd.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/wait.h>
void child() {
setuid(1000);
scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_LOG);
if (seccomp_load(ctx) != 0) {
printf("SCMP LAOD ERR!");
} else {
seccomp_release(ctx);
}
execl("/bin/ping", "ping", "-c", "1", "172.16.1.1", NULL);
printf("EXEC FAIL");
}
int main(){
int p = fork();
if (p < 0) {
printf("Frok ERROR!");
exit(1);
}
if ( p == 0 ) {
child();
} else {
struct rusage usage;
int status;
if (wait4(p, &status, WSTOPPED, &usage) == -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 flag。您不是直接使用 seccomp,而是通过一个库。看来图书馆正在为您设置标志。
no_new_privs 标志意味着您不能 运行 setuid 程序。好吧,您可以 运行 它们,但它们不会是 setuid。他们将 运行 作为您的用户。它无权按照 ping
要求的方式发送特殊数据包。所以 ping
失败,因为它没有 ping 权限。