Make sure we can't restore root after setuid

This commit is contained in:
emersion 2019-01-16 22:33:14 +01:00
parent 762e3f32ef
commit 3bdf58a455
No known key found for this signature in database
GPG Key ID: 0FDE7BE0E88F5E48

View File

@ -21,7 +21,7 @@ static void clear_buffer(void *buf, size_t bytes) {
} }
} }
void run_child(void) { static void run_child(void) {
/* This code runs as root */ /* This code runs as root */
struct passwd *pwent = getpwuid(getuid()); struct passwd *pwent = getpwuid(getuid());
if (!pwent) { if (!pwent) {
@ -46,6 +46,9 @@ void run_child(void) {
if (setuid(getuid()) != 0) { if (setuid(getuid()) != 0) {
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (setuid(0) != -1) {
exit(EXIT_FAILURE);
}
/* This code does not run as root */ /* This code does not run as root */
swaylock_log(LOG_DEBUG, "prepared to authorize user %s", pwent->pw_name); swaylock_log(LOG_DEBUG, "prepared to authorize user %s", pwent->pw_name);
@ -127,6 +130,11 @@ void initialize_pw_backend(void) {
swaylock_log_errno(LOG_ERROR, "Unable to drop root"); swaylock_log_errno(LOG_ERROR, "Unable to drop root");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (setuid(0) != -1) {
swaylock_log_errno(LOG_ERROR, "Unable to drop root (we shouldn't be "
"able to restore it after setuid)");
return false;
}
} }
bool attempt_password(struct swaylock_password *pw) { bool attempt_password(struct swaylock_password *pw) {