我正在调试一个程序,不太清楚为什么我不能放弃特权。
我有 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
答案1
你的编程语言根本不支持这些东西。
由于 Linux 的架构,在 Linux 上做这些事情很复杂。 C 库(例如 GNU 和 musl)隐藏了这种复杂性。它仍然是 Linux 上线程的已知问题之一。
Go 语言没有复制 C 库的机制。 目前这些功能的实现不是系统调用,也没有被自2014年起。
进一步阅读
- 乔纳森·德博因·波拉德 (2010)。Linux 上线程的已知问题。常见答案。
- 米哈乌·德卡茨 (2011-01-21)。syscall:Setuid/Setgid 不适用于 Linux 上的所有线程。去错误 #1435