OLD | NEW |
1 // Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium OS Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // Some portions Copyright (c) 2009 The Chromium Authors. | 4 // Some portions Copyright (c) 2009 The Chromium Authors. |
5 // | 5 // |
6 // Default implementation of the Env interface. | 6 // Default implementation of the Env interface. |
7 | 7 |
8 #include "minijail/env.h" | 8 #include "minijail/env.h" |
9 | 9 |
10 #include <asm/unistd.h> | 10 #include <asm/unistd.h> |
11 #include <errno.h> | 11 #include <errno.h> |
12 #include <fcntl.h> | 12 #include <fcntl.h> |
13 #include <grp.h> | 13 #include <grp.h> |
| 14 #include <pwd.h> |
14 #include <sched.h> | 15 #include <sched.h> |
15 #include <signal.h> | 16 #include <signal.h> |
16 #include <stdarg.h> | 17 #include <stdarg.h> |
17 #include <stdbool.h> | 18 #include <stdbool.h> |
18 #include <stdio.h> | 19 #include <stdio.h> |
19 #include <stdlib.h> | 20 #include <stdlib.h> |
20 #include <string.h> | 21 #include <string.h> |
21 #include <sys/capability.h> | 22 #include <sys/capability.h> |
22 #include <sys/mount.h> | 23 #include <sys/mount.h> |
23 #include <sys/prctl.h> | 24 #include <sys/prctl.h> |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 if (prctl(PR_SET_SECUREBITS, kSecureBitsAllLocked)) { | 76 if (prctl(PR_SET_SECUREBITS, kSecureBitsAllLocked)) { |
76 PLOG(FATAL) << "Failed to set PR_SET_SECUREBITS"; | 77 PLOG(FATAL) << "Failed to set PR_SET_SECUREBITS"; |
77 } | 78 } |
78 DLOG(INFO) << "Success."; | 79 DLOG(INFO) << "Success."; |
79 return true; | 80 return true; |
80 } | 81 } |
81 | 82 |
82 bool Env::ChangeUser(uid_t uid, gid_t gid) const { | 83 bool Env::ChangeUser(uid_t uid, gid_t gid) const { |
83 // TODO(wad) support supplemental groups | 84 // TODO(wad) support supplemental groups |
84 DLOG(INFO) << "Dropping root..."; | 85 DLOG(INFO) << "Dropping root..."; |
85 if (setgroups(0, NULL)) { | 86 struct passwd* entry = getpwuid(uid); |
86 PLOG(FATAL) << "Failed to drop supplementary groups"; | 87 endpwent(); |
| 88 if (!entry) { |
| 89 LOG(INFO) << "UID is unknown. Clearing all supplemental groups"; |
| 90 PLOG_IF(FATAL, setgroups(0, NULL)) |
| 91 << "Failed to clear supplementary groups"; |
| 92 } else { |
| 93 PLOG_IF(FATAL, initgroups(entry->pw_name, entry->pw_gid)) |
| 94 << "Failed to set supplementary groups"; |
87 } | 95 } |
88 if (setresgid(gid, gid, gid)) { | 96 if (setresgid(gid, gid, gid)) { |
89 PLOG(FATAL) << "Failed to change to gid " << gid; | 97 PLOG(FATAL) << "Failed to change to gid " << gid; |
90 } | 98 } |
91 if (setresuid(uid, uid, uid)) { | 99 if (setresuid(uid, uid, uid)) { |
92 PLOG(FATAL) << "Failed to change to uid " << uid; | 100 PLOG(FATAL) << "Failed to change to uid " << uid; |
93 } | 101 } |
94 DLOG(INFO) << "Success."; | 102 DLOG(INFO) << "Success."; |
95 return true; | 103 return true; |
96 } | 104 } |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 for (char * const* arg = argv; *arg; ++arg) { | 230 for (char * const* arg = argv; *arg; ++arg) { |
223 DLOG(INFO) << "-> " << *arg; | 231 DLOG(INFO) << "-> " << *arg; |
224 } | 232 } |
225 execve(path, argv, envp); | 233 execve(path, argv, envp); |
226 PLOG(FATAL) << "failed to execute " << path; | 234 PLOG(FATAL) << "failed to execute " << path; |
227 return false; | 235 return false; |
228 } | 236 } |
229 | 237 |
230 } // namespace minijail | 238 } // namespace minijail |
231 } // namespace chromeos | 239 } // namespace chromeos |
OLD | NEW |