프로그램을 디버깅하고 있는데 왜 권한을 삭제할 수 없는지 잘 모르겠습니다.
루트 권한이 있어 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년부터.
추가 읽기
- 조나단 데보인 폴라드(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 프로그램에서 프로세스 권한을 의미 있게 변경(권한 제거 포함)하려면 이러한 기능이 필요합니다.