Linux-Mint

回顯到 gid_map 失敗但 uid_map 成功

  • February 26, 2022

我正在嘗試通過寫入 uid_map 和 gid_map 文件來映射新命名空間中的使用者和組 ID。

所以在終端 1我正在做

vaibhav@vaibhav:~$ unshare -U /bin/sh
$ id
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
$ echo $$
2506

然後我打開新終端,即終端 2,然後我做

vaibhav@vaibhav:~$ echo '0 1000 1' > /proc/2506/
uid_map
vaibhav@vaibhav:~$ echo '0 1000 1' > /proc/2506/
gid_map
-bash: echo: write error: Operation not permitted

現在如果我檢查終端 1

$ id
uid=0(root) gid=65534(nogroup) groups=65534(nogroup)

我知道我們只能寫入一次 uid_map 和 gid_map 文件,但它在第一次寫入時失敗。

我想知道為什麼寫入 gid_map 失敗。我在用著Linux Mint 20.3

自 Linux 3.19 起,在嘗試映射使用者組時,對非特權使用者添加了一個特定限制:他們必須放棄更改補充組的權利。這通常是為了防​​止使用者自己從組中刪除,該組充當具有所有權的文件的拒絕過濾器,例如someuser:denygroup和 mode u=rw,g=,o=r

如果沒有此限制,使用者可以呼叫setgroups(2)並清空其補充組列表。

這記錄在user_namespaces(7)

/proc/[pid]/setgroups在寫入之前向文件 寫入“拒絕”/proc/[pid]/gid_map將在使用者命名空間中永久禁用setgroups(2),並允許在/proc/[pid]/gid_map沒有父使用者命名空間中的 CAP_SETGID 功能的情況下進行寫入。

所以對於OP的情況:

echo deny > /proc/2506/setgroups

將失去對補充組的控制權,並允許完成:

echo '0 1000 1' > /proc/2506/gid_map

筆記:

  • 使用者只能將自己的 uid/gid 映射到另一個,唯一有趣的值是它自己或root。要獲得更多可能性,可以使用 setuid-root 幫助程序並在newuidmapnewgidmap中使用每個使用者分配的範圍。這是使用者非特權容器如何能夠實際工作的一部分:使用特權助手。/etc/subuid/etc/subgid
  • 作為安全說明,正如特權命令在繼續之前newgidmap寫入的那樣,只要讓這個命令可用,就可以無論如何都可以逃脫拒絕組“監獄”。此命令在使用者可以執行自己的非特權容器的環境中無處不在。allow``/proc/[pid]/setgroups

引用自:https://unix.stackexchange.com/questions/692177