~kennylevinsen/seatd

17cdbe0ad2d0aa563e269cd23c770c75b312bbcb — Kenny Levinsen a month ago 60c370d
seatd-launch: Set socket permissions directly

Instead of relying on seatd's user/group arguments, which require
turning our UID back into a username, just chmod/chown the socket
ourselves once seatd is ready.

We also reduce the permissions to just user access, instead of user and
group like seatd specifies.
1 files changed, 26 insertions(+), 20 deletions(-)

M seatd-launch/seatd-launch.c
M seatd-launch/seatd-launch.c => seatd-launch/seatd-launch.c +26 -20
@@ 1,13 1,12 @@
#include <errno.h>
#include <poll.h>
#include <pwd.h>
#include <signal.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>



@@ 66,29 65,13 @@ int main(int argc, char *argv[]) {
		char pipebuf[8];
		sprintf(pipebuf, "%d", fds[1]);

		struct passwd *user = getpwuid(getuid());
		if (!user) {
			perror("getpwuid failed");
			_exit(1);
		}

		// TODO: Make seatd accept the numeric UID
		execlp("seatd", "seatd", "-n", pipebuf, "-u", user->pw_name, "-s", sockpath, NULL);
		execlp("seatd", "seatd", "-n", pipebuf, "-s", sockpath, NULL);
		perror("Could not start seatd");
		_exit(1);
	}
	close(fds[1]);

	// Drop privileges
	if (setgid(getgid()) == -1) {
		perror("Could not set gid to drop privileges");
		goto error_seatd;
	}
	if (setuid(getuid()) == -1) {
		perror("Could not set uid to drop privileges");
		goto error_seatd;
	}

	// Wait for seatd to be ready
	char buf[1] = {0};
	while (true) {
		pid_t p = waitpid(seatd_child, NULL, WNOHANG);


@@ 127,6 110,29 @@ int main(int argc, char *argv[]) {
	}
	close(fds[0]);

	uid_t uid = getuid();
	gid_t gid = getgid();

	// Restrict access to the socket to just us
	if (chown(sockpath, uid, gid) == -1) {
		perror("Could not chown seatd socket");
		goto error_seatd;
	}
	if (chmod(sockpath, 0700) == -1) {
		perror("Could not chmod socket");
		goto error;
	}

	// Drop privileges
	if (setgid(gid) == -1) {
		perror("Could not set gid to drop privileges");
		goto error_seatd;
	}
	if (setuid(uid) == -1) {
		perror("Could not set uid to drop privileges");
		goto error_seatd;
	}

	pid_t child = fork();
	if (child == -1) {
		perror("Could not fork target process");