プログラムをデバッグしていますが、特権を削除できない理由がよくわかりません。
Sudo
を介してroot権限があり、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 and musl)は、この複雑さを隠します。これは、Linux上のスレッドに関する既知の問題の1つであり続けています。
Go言語は、Cライブラリのメカニズムを複製しません。 これらの関数の現在の実装 はシステムコールではなく、 2014年以降 ではありません。