Permissions
為什麼我不能刪除 sudo root 權限?
我正在調試一個程序,但不太清楚為什麼我不能放棄特權。
我有 root 權限
sudo
,我可以呼叫setgid/setuid
,但[is]
不支持該操作。重現的基本程式碼(golang):
package main import ( "fmt" "os" "strconv" "syscall" ) func main() { if os.Getuid() != 0 { fmt.Println("run as root") os.Exit(1) } uid, err := strconv.Atoi(os.Getenv("SUDO_UID")) check("", err) gid, err := strconv.Atoi(os.Getenv("SUDO_GID")) check("", err) fmt.Printf("uid: %d, gid: %d\n", uid, gid) check("gid", syscall.Setgid(gid)) check("uid", syscall.Setuid(uid)) } func check(message string, err error) { if err != nil { fmt.Printf("%s: %s\n", message, err) os.Exit(1) } }
範例輸出:
$ sudo ./drop-sudo uid: 1000, gid: 1000 gid: operation not supported
系統資訊:
$ uname -a Linux user2460234 4.15.0-34-generic #37-Ubuntu SMP Mon Aug 27 15:21:48 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
您的程式語言根本不支持這些東西。
由於 Linux 的體系結構,在 Linux 上做這些事情很複雜。C 庫(例如 GNU 和 musl)隱藏了這種複雜性。它仍然是 Linux 上執行緒的已知問題之一。
Go 語言沒有複製 C 庫的機制。 這些函式的目前實現不是系統呼叫,自 2014 年以來就沒有。
進一步閱讀
- 喬納森·德博因·波拉德 (2010)。Linux 上執行緒的已知問題。經常給出答案。
- 米哈烏德卡茲 (2011-01-21)。系統呼叫:Setuid/Setgid 不適用於 Linux 上的所有執行緒。去錯誤 #1435