|
8 | 8 | "os/user"
|
9 | 9 | "path"
|
10 | 10 | "runtime"
|
| 11 | + "strconv" |
11 | 12 | "strings"
|
12 | 13 | "syscall"
|
13 | 14 | "time"
|
@@ -67,6 +68,17 @@ func Cli(cfg *config.Config, args []string) error {
|
67 | 68 | cmd.Stdout = os.Stdout
|
68 | 69 | cmd.Stdin = os.Stdin
|
69 | 70 | cmd.SysProcAttr = &syscall.SysProcAttr{}
|
| 71 | + |
| 72 | + // permissions drop |
| 73 | + if isRoot() && !cfg.Exec.NoRootDrop && os.Getenv("SUDO_UID") != "" && os.Getenv("SUDO_GID") != "" { |
| 74 | + creds, err := generateCredentialsDrop() |
| 75 | + if err != nil { |
| 76 | + logrus.Errorf("failed to drop permissions, %q", err) |
| 77 | + } else { |
| 78 | + cmd.SysProcAttr.Credential = creds |
| 79 | + } |
| 80 | + } |
| 81 | + |
70 | 82 | cmd.SysProcAttr.Setpgid = true
|
71 | 83 | err := cmd.Start()
|
72 | 84 | if err != nil {
|
@@ -103,7 +115,7 @@ func Cli(cfg *config.Config, args []string) error {
|
103 | 115 | func waitForProcessToExit(cmd *exec.Cmd) {
|
104 | 116 | sigc := make(chan struct{})
|
105 | 117 |
|
106 |
| - go func(){ |
| 118 | + go func() { |
107 | 119 | cmd.Wait()
|
108 | 120 | }()
|
109 | 121 |
|
@@ -135,7 +147,7 @@ func performChecks(spyName string) error {
|
135 | 147 |
|
136 | 148 | if runtime.GOOS == "darwin" {
|
137 | 149 | if !isRoot() {
|
138 |
| - logrus.Error("on macOS you're required to run the agent with sudo") |
| 150 | + logrus.Fatal("on macOS you're required to run the agent with sudo") |
139 | 151 | }
|
140 | 152 | }
|
141 | 153 |
|
@@ -173,10 +185,29 @@ func armMessage() string {
|
173 | 185 | return ""
|
174 | 186 | }
|
175 | 187 |
|
176 |
| -func generateSeed(args []string) string{ |
| 188 | +func generateSeed(args []string) string { |
177 | 189 | path, err := os.Getwd()
|
178 | 190 | if err != nil {
|
179 | 191 | path = "<unknown>"
|
180 | 192 | }
|
181 | 193 | return path + "|" + strings.Join(args, "&")
|
182 | 194 | }
|
| 195 | + |
| 196 | +func generateCredentialsDrop() (*syscall.Credential, error) { |
| 197 | + sudoUser := os.Getenv("SUDO_USER") |
| 198 | + sudoUid := os.Getenv("SUDO_UID") |
| 199 | + sudoGid := os.Getenv("SUDO_GID") |
| 200 | + |
| 201 | + logrus.Infof("dropping permissions, running command as %q (%s/%s)", sudoUser, sudoUid, sudoGid) |
| 202 | + |
| 203 | + uid, err := strconv.Atoi(sudoUid) |
| 204 | + if err != nil { |
| 205 | + return nil, err |
| 206 | + } |
| 207 | + gid, err := strconv.Atoi(sudoGid) |
| 208 | + if err != nil { |
| 209 | + return nil, err |
| 210 | + } |
| 211 | + |
| 212 | + return &syscall.Credential{Uid: uint32(uid), Gid: uint32(gid)}, nil |
| 213 | +} |
0 commit comments