diff options
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Libraries/LibC/unistd.cpp | 15 | ||||
-rw-r--r-- | Userland/Libraries/LibC/unistd.h | 2 | ||||
-rw-r--r-- | Userland/Utilities/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Userland/Utilities/chroot.cpp | 107 |
4 files changed, 1 insertions, 125 deletions
diff --git a/Userland/Libraries/LibC/unistd.cpp b/Userland/Libraries/LibC/unistd.cpp index 2b4beee700..fa22393b3e 100644 --- a/Userland/Libraries/LibC/unistd.cpp +++ b/Userland/Libraries/LibC/unistd.cpp @@ -763,21 +763,6 @@ int set_process_name(const char* name, size_t name_length) __RETURN_WITH_ERRNO(rc, rc, -1); } -int chroot(const char* path) -{ - return chroot_with_mount_flags(path, -1); -} - -int chroot_with_mount_flags(const char* path, int mount_flags) -{ - if (!path) { - errno = EFAULT; - return -1; - } - int rc = syscall(SC_chroot, path, strlen(path), mount_flags); - __RETURN_WITH_ERRNO(rc, rc, -1); -} - int pledge(const char* promises, const char* execpromises) { Syscall::SC_pledge_params params { diff --git a/Userland/Libraries/LibC/unistd.h b/Userland/Libraries/LibC/unistd.h index 20a856f2e0..e681ae1b6a 100644 --- a/Userland/Libraries/LibC/unistd.h +++ b/Userland/Libraries/LibC/unistd.h @@ -46,8 +46,6 @@ int execvp(const char* filename, char* const argv[]); int execl(const char* filename, const char* arg, ...); int execle(const char* filename, const char* arg, ...); int execlp(const char* filename, const char* arg, ...); -int chroot(const char* path); -int chroot_with_mount_flags(const char* path, int mount_flags); void sync(); __attribute__((noreturn)) void _exit(int status); pid_t getsid(pid_t); diff --git a/Userland/Utilities/CMakeLists.txt b/Userland/Utilities/CMakeLists.txt index 4952f0bf57..35bc9423f1 100644 --- a/Userland/Utilities/CMakeLists.txt +++ b/Userland/Utilities/CMakeLists.txt @@ -1,7 +1,7 @@ file(GLOB CMD_SOURCES CONFIGURE_DEPENDS "*.cpp") list(APPEND SPECIAL_TARGETS test install) list(APPEND REQUIRED_TARGETS - arp base64 basename cat chmod chown chroot clear comm cp cut date dd df dirname dmesg du echo env expr false fgrep + arp base64 basename cat chmod chown clear comm cp cut date dd df dirname dmesg du echo env expr false fgrep file find grep groups head host hostname id ifconfig kill killall ln ls mkdir mount mv nproc pgrep pidof ping pmap ps readlink realpath reboot rm rmdir seq shutdown sleep sort stat stty su tail test touch tr true umount uname uniq uptime w wc which whoami xargs yes less diff --git a/Userland/Utilities/chroot.cpp b/Userland/Utilities/chroot.cpp deleted file mode 100644 index 0141232bc4..0000000000 --- a/Userland/Utilities/chroot.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2020, Sergey Bugaev <bugaevc@serenityos.org> - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include <AK/StringView.h> -#include <LibCore/ArgsParser.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -int main(int argc, char** argv) -{ - int flags = -1; - uid_t chroot_user = 0; - gid_t chroot_group = 0; - const char* path = nullptr; - const char* program = "/bin/Shell"; - const char* userspec = "0:0"; - - Core::ArgsParser args_parser; - args_parser.set_general_help( - "Run a program in a chroot sandbox. During execution, the program " - "sees the given path as '/', and cannot access files outside of it."); - args_parser.add_positional_argument(path, "New root directory", "path"); - args_parser.add_positional_argument(program, "Program to run", "program", Core::ArgsParser::Required::No); - - Core::ArgsParser::Option userspec_option { - true, - "The uid:gid to use", - "userspec", - 'u', - "userpec", - [&userspec](const char* s) { - Vector<StringView> parts = StringView(s).split_view(':', true); - if (parts.size() != 2) - return false; - userspec = s; - return true; - } - }; - args_parser.add_option(move(userspec_option)); - - Core::ArgsParser::Option mount_options { - true, - "Mount options", - "options", - 'o', - "options", - [&flags](const char* s) { - flags = 0; - Vector<StringView> parts = StringView(s).split_view(','); - for (auto& part : parts) { - if (part == "defaults") - continue; - else if (part == "nodev") - flags |= MS_NODEV; - else if (part == "noexec") - flags |= MS_NOEXEC; - else if (part == "nosuid") - flags |= MS_NOSUID; - else if (part == "ro") - flags |= MS_RDONLY; - else if (part == "remount") - flags |= MS_REMOUNT; - else if (part == "bind") - warnln("Ignoring -o bind, as it doesn't make sense for chroot"); - else - return false; - } - return true; - } - }; - args_parser.add_option(move(mount_options)); - args_parser.parse(argc, argv); - - if (chroot_with_mount_flags(path, flags) < 0) { - perror("chroot"); - return 1; - } - - if (chdir("/") < 0) { - perror("chdir(/)"); - return 1; - } - - // Failed parsing will silently fail open (uid=0; gid=0); - // 0:0 is also the default when no --userspec argument is provided. - auto parts = String(userspec).split(':', true); - chroot_user = (uid_t)strtol(parts[0].characters(), nullptr, 10); - chroot_group = (uid_t)strtol(parts[1].characters(), nullptr, 10); - - if (setresgid(chroot_group, chroot_group, chroot_group)) { - perror("setgid"); - return 1; - } - - if (setresuid(chroot_user, chroot_user, chroot_user)) { - perror("setuid"); - return 1; - } - - execl(program, program, nullptr); - perror("execl"); - return 1; -} |