Permissions

為什麼我不能刪除 sudo root 權限?

  • February 24, 2021

我正在調試一個程序,但不太清楚為什麼我不能放棄特權。

我有 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 年以來就沒有。

進一步閱讀

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