AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 457299
Accepted
koalo
koalo
Asked: 2018-07-20 12:36:06 +0800 CST2018-07-20 12:36:06 +0800 CST 2018-07-20 12:36:06 +0800 CST

通过添加功能而失去权限?

  • 772

我观察到以下我无法解释的现象。添加CAP_SYS_ADMIN功能后,unshare不再能够写入/proc/self/setgroups.

事实上,写入这个文件需要这个能力,但这是通过改变用户命名空间来实现的。那么为什么向父进程添加功能会阻止写入该文件呢?

me@myhost:~$ unshare -r
root@myhost:~# exit
logout

me@myhost:~$ sudo setcap cap_sys_admin=ep /usr/bin/unshare
me@myhost:~$ unshare -r
unshare: cannot open /proc/self/setgroups: Permission denied

me@myhost:~$ sudo setcap cap_sys_admin= /usr/bin/unshare
me@myhost:~$ unshare -r
root@myhost:~#

顺便说一句:我正在运行内核版本为 4.4 的 Ubuntu 16.04.4 LTS,而 util-linux(包括unshare)的版本是 2.27.1。

namespace unshare
  • 1 1 个回答
  • 1785 Views

1 个回答

  • Voted
  1. Best Answer
    filbranden
    2018-08-01T12:03:42+08:002018-08-01T12:03:42+08:00

    这里发生的是您的“取消共享”进程无权写入外部用户命名空间上的setgroups(and uid_maps, gid_maps) 文件。

    在该命名空间中,其中的伪文件/proc/<PID>将是 root 拥有的,并且好像您的有效 uid 仍然是您自己用户的,您将无权写入这些文件。

    您可以通过在后台运行进程(例如)并在文件运行时sleep检查文件的权限来轻松地可视化这一点(并且行为完全相同。)setgroupsuid_mapsgid_maps

    首先,使用没有附加功能的二进制文件:

    $ cp /usr/bin/sleep .
    $ ./sleep 10 &
    [1] 11209
    $ ls -l /proc/11209/setgroups
    -rw-r--r--. 1 myuser myuser 0 Jul 31 12:33 /proc/11209/setgroups
    [1]+  Done                    ./sleep 10
    $
    

    然后,让我们为其添加一些文件功能并查看所有权更改:

    $ sudo setcap cap_net_bind_service=ep sleep
    $ ./sleep 10 &
    [1] 11220
    $ ls -l /proc/11220/setgroups 
    -rw-r--r--. 1 root root 0 Jul 31 12:34 /proc/11220/setgroups
    [1]+  Done                    ./sleep 10
    $
    

    文件的所有权/proc/<PID>由 Linux 内核中的“dumpable”标志控制,该标志用于防止将信息从特权进程泄漏给非特权用户。

    并且考虑到您正在运行unshare附加功能但仍然使用非 root有效uid,通过操作系统的正常访问控制来防止对 root 拥有的这些伪文件的写访问。


    您可以使用prctl(2)PR_GET_DUMPABLE系统调用的命令检查“dumpable”标志的值。

    在您的描述中,PR_SET_DUMPABLE您还会发现:

    通常,此标志设置为 1。但是,/proc/sys/fs/suid_dumpable在以下情况下,它会重置为文件中包含的当前值(默认值为 0):

    [...]

    • 该进程执行 ( execve(2)) 具有文件功能的程序(请参阅capabilities(7)),但前提是获得的许可功能超过了该进程已经允许的功能。

    这正是您的情况,unshare具有文件功能的二进制文件。

    有趣的是,使用 root 拥有的 setuid 二进制文件unshare并不会遇到这个确切的问题。是的,它将清除“可转储”标志,并且其中的文件/proc/<PID>将归根用户所有。但是考虑到在运行 setuid 二进制文件时您的有效 uid也是root,访问将被允许。

    在这种情况下,您最终会遇到另一个问题,这与unshare's 的逻辑无法处理该特定设置有关(可能与有效 uid 和实际 uid 不匹配有关):

    $ cp /usr/bin/unshare .
    $ sudo setcap -r unshare
    $ sudo chown root:root unshare
    $ sudo chmod 4711 unshare
    $ ./unshare -r
    -bash: cannot set uid to 65534: effective uid 0: Invalid argument
    -bash-4.4$ 
    

    另请注意,“可转储”标志的清除是通过运行设置了文件功能的二进制文件触发的。如果您以不同的方式获得额外的功能,您可能不会遇到这个麻烦。例如,使用“环境”功能是在命名空间之外获得额外功能的好方法,同时在取消共享到新用户命名空间时仍然不会遇到麻烦。

    (不幸的是,目前还没有很多关于环境功能的工具。libcap仅在最新的 git 中提供支持,超过 2.25 版,这是目前大多数发行版中提供的版本。capsh相当低级,所以不容易获得它也对。有关使用 latest添加环境功能的详细信息,请参见此处。我也尝试过,但也无法真正设法在此处设置环境功能。无论如何,如果您确实需要功能,您可以研究一下,非根用户和用户命名空间在一起!)capshsystemd-run

    • 13

相关问题

  • 为什么我不能在用户命名空间中绑定挂载“/”?

  • 切换到网络命名空间不会改变 /sys/class/net?

  • 如何使用 Linux 命名空间执行 chroot?

  • 每个网络命名空间中的单独 DNS 配置

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve