@@ -30,6 +30,25 @@ import (
3030 "github.com/pelicanplatform/pelican/param"
3131)
3232
33+ // rawSetuid and rawSetgid perform setuid and setgid using syscall.RawSyscall()
34+ // to avoid syscall.Setgid() and syscall.Setuid(). The latter internally use
35+ // AllThreadsSyscall(), which fails when CGO is disabled.
36+ func rawSetuid (uid int ) error {
37+ _ , _ , errno := syscall .RawSyscall (syscall .SYS_SETUID , uintptr (uid ), 0 , 0 )
38+ if errno != 0 {
39+ return errno
40+ }
41+ return nil
42+ }
43+
44+ func rawSetgid (gid int ) error {
45+ _ , _ , errno := syscall .RawSyscall (syscall .SYS_SETGID , uintptr (gid ), 0 , 0 )
46+ if errno != 0 {
47+ return errno
48+ }
49+ return nil
50+ }
51+
3352func dropPrivileges () (err error ) {
3453 log .Info ("Dropping privileges to user " , param .Server_UnprivilegedUser .GetString ())
3554 var puser config.User
@@ -45,11 +64,13 @@ func dropPrivileges() (err error) {
4564 err = errors .Errorf ("unable to drop privileges to user (user %s, group %s) with GID 0" , puser .Username , puser .Groupname )
4665 return
4766 }
48- if err = syscall .Setgid (puser .Gid ); err != nil {
67+
68+ // Use raw syscalls to avoid failures when CGO is disabled
69+ if err = rawSetgid (puser .Gid ); err != nil {
4970 err = errors .Wrap (err , "failed to drop group privileges" )
5071 return
5172 }
52- if err = syscall . Setuid (puser .Uid ); err != nil {
73+ if err = rawSetuid (puser .Uid ); err != nil {
5374 err = errors .Wrap (err , "failed to drop user privileges" )
5475 return
5576 }
0 commit comments