Skip to content

Instantly share code, notes, and snippets.

@hnakamur
Created November 18, 2015 16:07
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hnakamur/724b519a90074f4b4ea5 to your computer and use it in GitHub Desktop.
Save hnakamur/724b519a90074f4b4ea5 to your computer and use it in GitHub Desktop.
golang StartProcess with setuid
package main
import (
"flag"
"os"
"syscall"
)
func main() {
var uid uint
flag.UintVar(&uid, "uid", 0, "user id")
flag.Parse()
attr := &os.ProcAttr{
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
Sys: &syscall.SysProcAttr{
Credential: &syscall.Credential{
Uid: uint32(uid),
},
},
}
args := []string{
"/usr/bin/whoami",
}
process, err := os.StartProcess("/usr/bin/whoami", args, attr)
if err != nil {
panic(err)
}
_, err = process.Wait()
if err != nil {
panic(err)
}
}
@hnakamur
Copy link
Author

example session

$ grep '^_uucp' /etc/passwd
_uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
$ sudo go run main.go -uid 4
_uucp
$ go version
go version go1.5.1 darwin/amd64

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment