추가 읽기

추가 읽기

프로그램을 디버깅하고 있는데 왜 권한을 삭제할 수 없는지 잘 모르겠습니다.

루트 권한이 있어 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의 스레드와 관련하여 알려진 문제 중 하나로 남아 있습니다.

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가 지적한 대로).

관련 정보