From 3887b98a7d89f2555ed0b25fc74ea2a643e28feb Mon Sep 17 00:00:00 2001 From: apio Date: Sat, 8 Apr 2023 16:32:56 +0200 Subject: [PATCH] kernel: Support setuid binaries You still have to run "chmod 4755 /bin/su" as root inside Luna for now, as this is not done by the install scripts. --- kernel/src/fs/VFS.cpp | 10 ++++++++++ kernel/src/fs/VFS.h | 2 ++ kernel/src/sys/exec.cpp | 3 +++ 3 files changed, 15 insertions(+) diff --git a/kernel/src/fs/VFS.cpp b/kernel/src/fs/VFS.cpp index 1d6f251d..11a75a19 100644 --- a/kernel/src/fs/VFS.cpp +++ b/kernel/src/fs/VFS.cpp @@ -86,4 +86,14 @@ namespace VFS return inode->mode() & S_IROTH; } + + bool is_setuid(SharedPtr inode) + { + return inode->mode() & S_ISUID; + } + + bool is_setgid(SharedPtr inode) + { + return inode->mode() & S_ISGID; + } } diff --git a/kernel/src/fs/VFS.h b/kernel/src/fs/VFS.h index c6b22a8d..34361c4d 100644 --- a/kernel/src/fs/VFS.h +++ b/kernel/src/fs/VFS.h @@ -178,6 +178,8 @@ namespace VFS bool can_execute(SharedPtr inode, Credentials auth); bool can_read(SharedPtr inode, Credentials auth); bool can_write(SharedPtr inode, Credentials auth); + bool is_setuid(SharedPtr inode); + bool is_setgid(SharedPtr inode); Inode& root_inode(); } diff --git a/kernel/src/sys/exec.cpp b/kernel/src/sys/exec.cpp index 725002e5..eb351e34 100644 --- a/kernel/src/sys/exec.cpp +++ b/kernel/src/sys/exec.cpp @@ -76,6 +76,9 @@ Result sys_execve(Registers* regs, SyscallArgs args) MMU::delete_userspace_page_directory(current->directory); + if (VFS::is_setuid(inode)) current->auth.euid = current->auth.suid = inode->uid(); + if (VFS::is_setgid(inode)) current->auth.egid = current->auth.sgid = inode->gid(); + current->name = path.chars(); image->apply(current);