追加読書

追加読書

プログラムをデバッグしているのに、なぜ権限を削除できないのかわかりません。

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年から

追加読書

答え2

確認できますクカ、これ公式Goライブラリそしてはい。この例はpsx.Syscall3(syscall.SYS_SETUID,...)uidを設定することです(例:@JdeBPGoが)実装を削除したとしましょうsyscall.Setuid()。これPSXライブラリはlibcapの一部です。

psxパッケージはシステムコール呼び出し用のCGoサポートAPIを提供し、各システムコールは結合Go / CGoランタイムのすべてのpthreadにミラーリングされます。 Goランタイムはすべてのpthreadを交換可能なものとして扱うため、Linux上で実行されているGoプログラムでプロセス権限を有意に変更(権限の削除を含む)するには、これらの機能が必要です。

答え3

〜のように1.16に進むsyscall.Setuid()友達はLinuxで完全にサポートされています。

つまり、Linuxでgo1.16ツールチェーンを使用してコンパイルされたこの質問で提供された再現されたプログラムは、期待どおりに機能するプログラムを構築します。動作しないことのすべての観察は、Linux上の以前のバージョンのgoツールチェーンにのみ適用されます。

これPSXパッケージを使用して、以前のGoツールチェーンで同様の作業を実行することもできます(ivzhhが指摘したように)。

関連情報