プログラムをデバッグしているのに、なぜ権限を削除できないのかわかりません。
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でこれらのタスクを実行することは、アーキテクチャのため複雑です。 GNUやmuslなどのCライブラリは、この複雑さを隠します。これはLinuxのスレッドに関して知られている問題の1つです。
Go言語にはCライブラリをコピーするメカニズムはありません。 この機能の現在の実装システムコールでもなく、2014年から。
追加読書
- ジョナサンデボインポラード(2010)。Linuxのスレッドに関する既知の問題。一般的な答え。
- ミハウデカーク(2011-01-21)。syscall: Setuid/Setgid は Linux のすべてのスレッドに対して機能しません。。バグ#1435に行く
答え2
確認できますクカ、これ公式Goライブラリそしてはい。この例はpsx.Syscall3(syscall.SYS_SETUID,...)
uidを設定することです(例:@JdeBPGoが)実装を削除したとしましょうsyscall.Setuid()
。これPSXライブラリはlibcapの一部です。
psxパッケージはシステムコール呼び出し用のCGoサポートAPIを提供し、各システムコールは結合Go / CGoランタイムのすべてのpthreadにミラーリングされます。 Goランタイムはすべてのpthreadを交換可能なものとして扱うため、Linux上で実行されているGoプログラムでプロセス権限を有意に変更(権限の削除を含む)するには、これらの機能が必要です。