Linux-Mint
回顯到 gid_map 失敗但 uid_map 成功
我正在嘗試通過寫入 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
和 modeu=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 幫助程序並在
newuidmap
和newgidmap
中使用每個使用者分配的範圍。這是使用者非特權容器如何能夠實際工作的一部分:使用特權助手。/etc/subuid
/etc/subgid
- 作為安全說明,正如特權命令在繼續之前
newgidmap
寫入的那樣,只要讓這個命令可用,就可以無論如何都可以逃脫拒絕組“監獄”。此命令在使用者可以執行自己的非特權容器的環境中無處不在。allow``/proc/[pid]/setgroups