访问 /proc/pid/ns/net 而不以 root 身份运行查询进程?

访问 /proc/pid/ns/net 而不以 root 身份运行查询进程?

在程序中,我通过扫描(符号)链接来枚举网络名称/proc/pid/空间ns/net。该程序在主机本身的“根”命名空间(原始 init)内运行。通常,我需要以 root 身份运行扫描仪部分,否则我对其他进程/proc/pid/信息的访问权限将受到限制。如果可能的话,我想避免以 root 身份运行扫描仪,并且我想避免删除权限的麻烦。

我需要为我的扫描程序设置哪些 Linux 功能,以便它可以由非 root 用户运行,并且仍然可以看到完整的/proc/pid/树并读取网络命名空间链接?

答案1

经过一番尝试和错误,我发现实际上CAP_SYS_PTRACE是需要的。

相反,CAP_DAC_READ_SEARCHCAP_DAC_OVERRIDE提供所需的访问权限,其中包括readlink()和 类似的操作。

我所看到的情况可以相互印证:首先,ptrace.c给出了必要的线索__ptrace_may_access()

/* May we inspect the given task?
 * This check is used both for attaching with ptrace
 * and for allowing access to sensitive information in /proc.
 *
 * ptrace_attach denies several cases that /proc allows
 * because setting up the necessary parent/child relationship
 * or halting the specified task is impossible.
 */

其次是nsfs相关的函数,比如proc_ns_readlink()(间接)调用__ptrace_may_access().

最后,人7命名空间提到:

该子目录中的符号链接如下: [...] 取消引用或读取 (readlink(2)) 这些符号链接的权限由 ptrace 访问模式 PTRACE_MODE_READ_FSCREDS 检查控制;请参阅 ptrace(2)。

答案2

准确地说:进入网络命名空间需要CAP_SYS_PTRACE和CAP_SYS_ADMIN,这里是一个例子:

# docker run -it --rm --pid host --cap-add CAP_SYS_PTRACE --cap-add CAP_SYS_ADMIN debian:bullseye-slim bash
root@8b40f2f48808:/# nsenter --net=/proc/1/ns/net bash

也可以看看这个答案

相关内容