From 17e5fc301be1d30cb18e2f0b22ada84485ecd1c3 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 20 Jan 2020 22:23:18 +0100 Subject: [PATCH] WindowServer: Use unveil() WindowServer needs persistent access to a few things: - /res (for themes, fonts, cursors, apps, wallpapers, etc.) - /etc/passwd (for username lookup, not sure this is actually needed..) - /home/anon/WindowManager.ini (FIXME: this should not be hard-coded..) These things are unveiled temporarily, and then dropped: - /tmp (for setting up sockets) - /dev (for opening input and framebuffer devices) This leaves WindowServer running with a very limited view of the file system, how neat is that! --- Servers/WindowServer/main.cpp | 43 +++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/Servers/WindowServer/main.cpp b/Servers/WindowServer/main.cpp index 34e95df599..48323e39ff 100644 --- a/Servers/WindowServer/main.cpp +++ b/Servers/WindowServer/main.cpp @@ -41,6 +41,34 @@ int main(int, char**) return 1; } + if (unveil("/res", "r") < 0) { + perror("unveil"); + return 1; + } + + if (unveil("/etc/passwd", "r") < 0) { + perror("unveil"); + return 1; + } + + if (unveil("/tmp", "cw") < 0) { + perror("unveil"); + return 1; + } + + // FIXME: WindowServer should obviously not hardcode this. + // Instead, we should have a ConfigServer or similar that allows programs + // to get/set user settings over IPC without giving them access to any files. + if (unveil("/home/anon/WindowManager.ini", "rwc") < 0) { + perror("unveil"); + return 1; + } + + if (unveil("/dev", "rw") < 0) { + perror("unveil"); + return 1; + } + struct sigaction act; memset(&act, 0, sizeof(act)); act.sa_flags = SA_NOCLDWAIT; @@ -72,6 +100,21 @@ int main(int, char**) auto wm = WSWindowManager::construct(*palette); auto mm = WSMenuManager::construct(); + if (unveil("/tmp", "") < 0) { + perror("unveil"); + return 1; + } + + if (unveil("/dev", "") < 0) { + perror("unveil"); + return 1; + } + + if (unveil(nullptr, nullptr) < 0) { + perror("unveil"); + return 1; + } + dbgprintf("Entering WindowServer main loop.\n"); loop.exec(); ASSERT_NOT_REACHED();