为什么我不能删除 sudo root 权限?

use*_*234 6 root setuid permissions sudo system-calls

我正在调试一个程序,但不太清楚为什么我不能删除权限。

我有 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

$ sudo ./drop-sudo 
uid: 1000, gid: 1000
gid: operation not supported
Run Code Online (Sandbox Code Playgroud)

系统信息:

$ 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
Run Code Online (Sandbox Code Playgroud)

Jde*_*eBP 8

您的编程语言根本不支持这些东西。

由于 Linux 的架构,在 Linux 上做这些事情很复杂。C 库(例如 GNU 和 musl)隐藏了这种复杂性。它仍然是 Linux 上线程的已知问题之一。

Go 语言没有复制 C 库的机制。 这些函数的当前实现不是系统调用,并且自 2014 年以来一直没有。

进一步阅读