diff --git a/distro-files/etc/issue b/distro-files/etc/issue new file mode 100644 index 00000000..da0fc0e7 --- /dev/null +++ b/distro-files/etc/issue @@ -0,0 +1,3 @@ + +Password for the root user is: root +To start a graphical environment, run: startwm diff --git a/distro-files/etc/passwd b/distro-files/etc/passwd index 1904db9e..5eb85f74 100644 --- a/distro-files/etc/passwd +++ b/distro-files/etc/passwd @@ -1,2 +1,2 @@ -root::0:0:root:/root:/usr/bin/bash +root:$6$Y60.qkhq.v3jWUVR$UyDvutrBYQNNhX1VvIrX2O7CcRPxuZ8EqyBktx7RG1nXzgXi7QHj3khzl14jxfKx45DpbVMIOXJziW2GqsOss.:0:0:root:/root:/usr/bin/bash sshd::100:100:sshd privsep:/var/lib/ssh:/usr/bin/false diff --git a/kernel-src/arch/x86-64/syscall.asm b/kernel-src/arch/x86-64/syscall.asm index 8aacea20..dba9bf8e 100644 --- a/kernel-src/arch/x86-64/syscall.asm +++ b/kernel-src/arch/x86-64/syscall.asm @@ -78,6 +78,10 @@ extern syscall_ppoll extern syscall_pread extern syscall_pwrite extern syscall_mknodat +extern syscall_getresuid +extern syscall_getresgid +extern syscall_setresuid +extern syscall_setresgid syscalltab: dq syscall_print dq syscall_mmap @@ -158,7 +162,11 @@ dq syscall_ppoll dq syscall_pread dq syscall_pwrite dq syscall_mknodat -syscallcount equ 79 +dq syscall_getresuid +dq syscall_getresgid +dq syscall_setresuid +dq syscall_setresgid +syscallcount equ 83 section .text global arch_syscall_entry ; on entry: diff --git a/kernel-src/arch/x86-64/syscalllog.c b/kernel-src/arch/x86-64/syscalllog.c index 6f626754..2526f177 100644 --- a/kernel-src/arch/x86-64/syscalllog.c +++ b/kernel-src/arch/x86-64/syscalllog.c @@ -5,7 +5,7 @@ #ifdef SYSCALL_LOGGING -#define SYSCALL_COUNT 79 +#define SYSCALL_COUNT 83 #define LOGSTR(x) arch_e9_puts(x) static char *name[] = { @@ -87,7 +87,11 @@ static char *name[] = { "ppoll", "pread", "pwrite", - "mknodat" + "mknodat", + "getresuid", + "getresgid", + "setresuid", + "setresgid" }; static char *args[] = { @@ -169,7 +173,11 @@ static char *args[] = { "fds %p nfds %d timeout %p sigmask %p", // ppoll "fd %d buffer %p count %lu offset %lu\n", // pread "fd %d buffer %p count %lu offset %lu\n", // pwrite - "dirfd %d path %s mode %o dev %x\n" // mknodat + "dirfd %d path %s mode %o dev %x\n", // mknodat + "uidp %p euidp %p suidp %p", // getresuid + "gidp %p egidp %p sgidp %p", // getresgid + "uid %d euid %d suid %d", // setresuid + "gid %d egid %d sgid %d" // setresgid }; #endif diff --git a/kernel-src/include/kernel/cred.h b/kernel-src/include/kernel/cred.h new file mode 100644 index 00000000..cf5f4bf3 --- /dev/null +++ b/kernel-src/include/kernel/cred.h @@ -0,0 +1,21 @@ +#ifndef _CRED_H +#define _CRED_H + +#define CRED_PERM_SUPERUSER (1l << 63) + +#include + +typedef struct { + int uid, euid, suid; + int gid, egid, sgid; + + uintmax_t allow; + uintmax_t deny; +} cred_t; + +int cred_setuids(cred_t *cred, int uid, int euid, int suid); +int cred_setgids(cred_t *cred, int uid, int euid, int suid); +void cred_getuids(cred_t *cred, int *uidp, int *euidp, int *suidp); +void cred_getgids(cred_t *cred, int *gidp, int *egidp, int *sgidp); + +#endif diff --git a/kernel-src/sys/cred.c b/kernel-src/sys/cred.c new file mode 100644 index 00000000..0ac7d03b --- /dev/null +++ b/kernel-src/sys/cred.c @@ -0,0 +1,40 @@ +#include +#include + +int cred_setuids(cred_t *cred, int uid, int euid, int suid) { + if (uid < -1 || euid < -1 || suid < -1 || (uid == -1 && euid == -1 && suid == -1)) + return EINVAL; + + // TODO do permission check to see if its possible + + cred->uid = uid; + cred->euid = euid; + cred->suid = suid; + + return 0; +} + +int cred_setgids(cred_t *cred, int gid, int egid, int sgid) { + if (gid < -1 || egid < -1 || sgid < -1 || (gid == -1 && egid == -1 && sgid == -1)) + return EINVAL; + + // TODO do permission check to see if its possible + + cred->gid = gid; + cred->egid = egid; + cred->sgid = sgid; + + return 0; +} + +void cred_getuids(cred_t *cred, int *uidp, int *euidp, int *suidp) { + *uidp = cred->uid; + *euidp = cred->euid; + *suidp = cred->suid; +} + +void cred_getgids(cred_t *cred, int *gidp, int *egidp, int *sgidp) { + *gidp = cred->gid; + *egidp = cred->egid; + *sgidp = cred->sgid; +} diff --git a/kernel-src/sys/syscalls/fork.c b/kernel-src/sys/syscalls/fork.c index 8a60dc85..de966e14 100644 --- a/kernel-src/sys/syscalls/fork.c +++ b/kernel-src/sys/syscalls/fork.c @@ -44,6 +44,7 @@ syscallret_t syscall_fork(context_t *ctx) { MUTEX_RELEASE(&proc->mutex); nproc->umask = _cpu()->thread->proc->umask; + nproc->cred = _cpu()->thread->proc->cred; nproc->root = sched_getroot(); nproc->cwd = sched_getcwd(); nproc->threadlist = nthread; diff --git a/kernel-src/sys/syscalls/getresgid.c b/kernel-src/sys/syscalls/getresgid.c new file mode 100644 index 00000000..a07ca4c6 --- /dev/null +++ b/kernel-src/sys/syscalls/getresgid.c @@ -0,0 +1,29 @@ +#include +#include +#include + +syscallret_t syscall_getresgid(context_t *, gid_t *gidp, gid_t *egidp, gid_t *sgidp) { + syscallret_t ret = { + .ret = -1 + }; + + int gid, egid, sgid; + cred_getgids(&_cpu()->thread->proc->cred, &gid, &egid, &sgid); + + ret.errno = usercopy_touser(gidp, &gid, sizeof(gid)); + if (ret.errno) + goto leave; + + ret.errno = usercopy_touser(egidp, &egid, sizeof(egid)); + if (ret.errno) + goto leave; + + ret.errno = usercopy_touser(sgidp, &sgid, sizeof(sgid)); + if (ret.errno) + goto leave; + + ret.ret = 0; + + leave: + return ret; +} diff --git a/kernel-src/sys/syscalls/getresuid.c b/kernel-src/sys/syscalls/getresuid.c new file mode 100644 index 00000000..708d6fae --- /dev/null +++ b/kernel-src/sys/syscalls/getresuid.c @@ -0,0 +1,29 @@ +#include +#include +#include + +syscallret_t syscall_getresuid(context_t *, uid_t *uidp, uid_t *euidp, uid_t *suidp) { + syscallret_t ret = { + .ret = -1 + }; + + int uid, euid, suid; + cred_getuids(&_cpu()->thread->proc->cred, &uid, &euid, &suid); + + ret.errno = usercopy_touser(uidp, &uid, sizeof(uid)); + if (ret.errno) + goto leave; + + ret.errno = usercopy_touser(euidp, &euid, sizeof(euid)); + if (ret.errno) + goto leave; + + ret.errno = usercopy_touser(suidp, &suid, sizeof(suid)); + if (ret.errno) + goto leave; + + ret.ret = 0; + + leave: + return ret; +} diff --git a/kernel-src/sys/syscalls/setresgid.c b/kernel-src/sys/syscalls/setresgid.c new file mode 100644 index 00000000..14dd8040 --- /dev/null +++ b/kernel-src/sys/syscalls/setresgid.c @@ -0,0 +1,12 @@ +#include +#include +#include + +syscallret_t syscall_setresgid(context_t *, gid_t gid, gid_t egid, gid_t sgid) { + syscallret_t ret; + + ret.errno = cred_setgids(&_cpu()->thread->proc->cred, gid, egid, sgid); + ret.ret = ret.errno ? -1 : 0; + + return ret; +} diff --git a/kernel-src/sys/syscalls/setresuid.c b/kernel-src/sys/syscalls/setresuid.c new file mode 100644 index 00000000..434b9ff1 --- /dev/null +++ b/kernel-src/sys/syscalls/setresuid.c @@ -0,0 +1,12 @@ +#include +#include +#include + +syscallret_t syscall_setresuid(context_t *, uid_t uid, uid_t euid, uid_t suid) { + syscallret_t ret; + + ret.errno = cred_setuids(&_cpu()->thread->proc->cred, uid, euid, suid); + ret.ret = ret.errno ? -1 : 0; + + return ret; +} diff --git a/patches/mlibc/jinx-working-patch.patch b/patches/mlibc/jinx-working-patch.patch index 88ee41e9..859c0510 100644 --- a/patches/mlibc/jinx-working-patch.patch +++ b/patches/mlibc/jinx-working-patch.patch @@ -1,5 +1,5 @@ diff --git mlibc-clean/abis/linux/in.h mlibc-workdir/abis/linux/in.h -index eb7be7b..eb83b56 100644 +index 87bc25f..d7370d0 100644 --- mlibc-clean/abis/linux/in.h +++ mlibc-workdir/abis/linux/in.h @@ -109,6 +109,9 @@ struct group_source_req { @@ -101,10 +101,10 @@ index fc34a3b..b1a95a9 100644 #include diff --git mlibc-clean/options/posix/generic/unistd-stubs.cpp mlibc-workdir/options/posix/generic/unistd-stubs.cpp -index a40c6dc..acbe0ba 100644 +index 16ab8b7..688908c 100644 --- mlibc-clean/options/posix/generic/unistd-stubs.cpp +++ mlibc-workdir/options/posix/generic/unistd-stubs.cpp -@@ -1254,6 +1254,7 @@ void encrypt(char[64], int) { +@@ -1257,6 +1257,7 @@ void encrypt(char[64], int) { } #endif @@ -112,7 +112,7 @@ index a40c6dc..acbe0ba 100644 #if __MLIBC_BSD_OPTION void *sbrk(intptr_t increment) { if(increment) { -@@ -1270,3 +1271,4 @@ void *sbrk(intptr_t increment) { +@@ -1273,3 +1274,4 @@ void *sbrk(intptr_t increment) { return out; } #endif @@ -207,10 +207,10 @@ index 0000000..e5b087a + diff --git mlibc-workdir/sysdeps/astral/generic/generic.cpp mlibc-workdir/sysdeps/astral/generic/generic.cpp new file mode 100644 -index 0000000..6eb771e +index 0000000..cfb7dfd --- /dev/null +++ mlibc-workdir/sysdeps/astral/generic/generic.cpp -@@ -0,0 +1,957 @@ +@@ -0,0 +1,970 @@ +#include +#include +#include @@ -227,11 +227,6 @@ index 0000000..6eb771e +#include +#include + -+static int gid; -+static int egid; -+static int uid; -+static int euid; -+ +#ifndef MLIBC_BUILDING_RTLD +// (s)brk is emulated in the libc rather than being +// an actual system call. @@ -271,63 +266,81 @@ index 0000000..6eb771e +} +#endif + -+namespace mlibc { -+ int sys_setuid(uid_t id) { -+ // TODO UNSTUB -+ uid = id; ++namespace mlibc { ++ int sys_getsockopt(int fd, int layer, int number, ++ void *__restrict buffer, socklen_t *__restrict size) { ++ // TODO unstub ++ mlibc::infoLogger() << "getsockopt: " << fd << " " << layer << " " << number << frg::endlog; + return 0; + } + -+ int sys_setgid(gid_t id) { -+ // TODO UNSTUB -+ gid = id; -+ return 0; -+ } -+ -+ uid_t sys_getuid() { -+ // TODO UNSTUB -+ return uid; -+ } -+ -+ gid_t sys_getgid() { -+ // TODO UNSTUB -+ return gid; -+ } -+ -+ uid_t sys_geteuid() { -+ // TODO UNSTUB -+ return euid; -+ } -+ -+ gid_t sys_getegid() { -+ // TODO UNSTUB -+ return egid; -+ } -+ + int sys_setgroups(size_t size, const gid_t *list) { + // TODO unstub + return 0; + } + ++ int sys_setuid(uid_t id) { ++ return sys_setresuid(id, -1, -1); ++ } ++ ++ int sys_setgid(gid_t id) { ++ return sys_setresgid(id, -1, -1); ++ } ++ ++ int sys_seteuid(uid_t id) { ++ return sys_setresuid(-1, id, -1); ++ } ++ ++ int sys_setegid(gid_t id) { ++ return sys_setresgid(-1, id, -1); ++ } ++ ++ uid_t sys_getuid() { ++ uid_t r, e, s; ++ sys_getresuid(&r, &e, &s); ++ ++ return r; ++ } ++ ++ uid_t sys_geteuid() { ++ uid_t r, e, s; ++ sys_getresuid(&r, &e, &s); ++ ++ return e; ++ } ++ ++ gid_t sys_getgid() { ++ gid_t r, e, s; ++ sys_getresgid(&r, &e, &s); ++ ++ return r; ++ } ++ ++ gid_t sys_getegid() { ++ gid_t r, e, s; ++ sys_getresgid(&r, &e, &s); ++ ++ return e; ++ } ++ + int sys_setresuid(uid_t _ruid, uid_t _euid, uid_t _suid) { -+ // TODO unstub -+ uid = _ruid; -+ euid = _euid; -+ return 0; ++ long ret; ++ return syscall(SYSCALL_SETRESUID, &ret, _ruid, _euid, _suid); + } + + int sys_setresgid(gid_t _rgid, gid_t _egid, gid_t _sgid) { -+ // TODO unstub -+ gid = _rgid; -+ egid = _egid; -+ return 0; ++ long ret; ++ return syscall(SYSCALL_SETRESGID, &ret, _rgid, _egid, _sgid); + } + -+ int sys_getsockopt(int fd, int layer, int number, -+ void *__restrict buffer, socklen_t *__restrict size) { -+ // TODO unstub -+ mlibc::infoLogger() << "getsockopt: " << fd << " " << layer << " " << number << frg::endlog; -+ return 0; ++ int sys_getresuid(uid_t *ruid, uid_t *euid, uid_t *suid) { ++ long ret; ++ return syscall(SYSCALL_GETRESUID, &ret, (uint64_t)ruid, (uint64_t)euid, (uint64_t)suid); ++ } ++ ++ int sys_getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid) { ++ long ret; ++ return syscall(SYSCALL_GETRESGID, &ret, (uint64_t)rgid, (uint64_t)egid, (uint64_t)sgid); + } + + int sys_mknodat(int dirfd, const char *path, int mode, int dev) { @@ -569,14 +582,14 @@ index 0000000..6eb771e + long ret; + long error = syscall(SYSCALL_GETSID, &ret, pid); + *pgid = ret; -+ return 0; ++ return error; + } + + int sys_getpgid(pid_t pid, pid_t *pgid) { + long ret; + long error = syscall(SYSCALL_GETPGID, &ret, pid); + *pgid = ret; -+ return 0; ++ return error; + } + + int sys_gethostname(char *buffer, size_t bufsize) { @@ -1187,10 +1200,10 @@ index 0000000..990eca0 +#endif diff --git mlibc-workdir/sysdeps/astral/include/astral/syscall.h mlibc-workdir/sysdeps/astral/include/astral/syscall.h new file mode 100644 -index 0000000..4a93549 +index 0000000..6db5755 --- /dev/null +++ mlibc-workdir/sysdeps/astral/include/astral/syscall.h -@@ -0,0 +1,102 @@ +@@ -0,0 +1,106 @@ +#ifndef _SYSCALL_H_INCLUDE +#define _SYSCALL_H_INCLUDE + @@ -1273,6 +1286,10 @@ index 0000000..4a93549 +#define SYSCALL_PREAD 76 +#define SYSCALL_PWRITE 77 +#define SYSCALL_MKNODAT 78 ++#define SYSCALL_GETRESUID 79 ++#define SYSCALL_GETRESGID 80 ++#define SYSCALL_SETRESUID 81 ++#define SYSCALL_SETRESGID 82 + +#include +#include diff --git a/patches/shadow/jinx-working-patch.patch b/patches/shadow/jinx-working-patch.patch index 1a098d24..8de38631 100644 --- a/patches/shadow/jinx-working-patch.patch +++ b/patches/shadow/jinx-working-patch.patch @@ -1,3 +1,16 @@ +diff --git shadow-clean/etc/login.defs shadow-workdir/etc/login.defs +index 33622c2..adc6025 100644 +--- shadow-clean/etc/login.defs ++++ shadow-workdir/etc/login.defs +@@ -93,7 +93,7 @@ MOTD_FILE /etc/motd + # + # If defined, this file will be output before each login(1) prompt. + # +-#ISSUE_FILE /etc/issue ++ISSUE_FILE /etc/issue + + # + # If defined, file which maps tty line to TERM environment parameter. diff --git shadow-clean/lib/freezero.c shadow-workdir/lib/freezero.c index c565f43..a6adf98 100644 --- shadow-clean/lib/freezero.c