【问题标题】:Why after load seccomp filter, PING will no work by normal user为什么加载 seccomp 过滤器后,普通用户无法 PING
【发布时间】:2019-08-14 02:55:15
【问题描述】:

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

socket:不允许操作。

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

但是如果我用root运行同样的程序,它会运行得很好。

这是在带有 4.15.0-54-generic 内核的 Ubuntu 18.04 中运行的。

我试过用Root用户运行程序,然后在子进程中,我用setuid(1000)设置为普通用户,还是不行。

如果我不使用fork,它仍然会注意到no premitted。

如果我将 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编译它。

英语不是我的第一语言,我很抱歉我的语法问题。

【问题讨论】:

标签: c linux seccomp


【解决方案1】:

ping 只能作为 root 工作。通常它以 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 的权限。

【讨论】:

  • 了解了更多关于seccompno_new_privs 标志的信息,谢谢。
  • 你是对的,但是我发现``` mtr ``` 命令权限是 ``` -rwxr-xr-x 1 root root 73664 Nov 2 2017 /usr/bin/mtr ` ``,当我在程序中运行它时,它会注意到“无法打开 IPv4 套接字:不允许操作”。你知道吗?
  • @boxjan mtr execs mtr-packet 这是setuid
  • @immibis 真诚感谢您的回答,但我注意到另一件事,我使用strace ping 192.168.1.1 -c 1,它仍然没有权限,但strace mtr -r ping 运行良好。我认为 strace 没有设置 no_new_privs_flag ,我尝试使用 strace -ff strace -ff ping 192.168.1.1 -c 1 来跟踪它,我找不到任何东西 prctl 调用。
  • @boxjan strace 调用 ptrace(并且不显示 ptrace)并且 ptrace 的进程也不能使用 setuid。这是一个不同的标志。
猜你喜欢
  • 2020-11-06
  • 1970-01-01
  • 2020-06-28
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
相关资源
最近更新 更多