From 4308317ea521f5ec2da2a916eea4b345841c4814 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 24 Aug 2024 21:53:05 -0300 Subject: [PATCH] execve: SUID and SGID --- kernel-src/include/kernel/cred.h | 1 + kernel-src/sys/cred.c | 12 ++++++++++++ kernel-src/sys/syscalls/execve.c | 16 ++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/kernel-src/include/kernel/cred.h b/kernel-src/include/kernel/cred.h index b3cb6dac..7455d5b1 100644 --- a/kernel-src/include/kernel/cred.h +++ b/kernel-src/include/kernel/cred.h @@ -17,5 +17,6 @@ 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); +void cred_doexec(cred_t *cred, int suid, int sgid); #endif diff --git a/kernel-src/sys/cred.c b/kernel-src/sys/cred.c index 72c8f762..969bc419 100644 --- a/kernel-src/sys/cred.c +++ b/kernel-src/sys/cred.c @@ -1,5 +1,6 @@ #include #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)) @@ -27,6 +28,17 @@ int cred_setgids(cred_t *cred, int gid, int egid, int sgid) { return 0; } +void cred_doexec(cred_t *cred, int suid, int sgid) { + if (suid > -1) + cred->euid = suid; + + if (sgid > -1) + cred->egid = sgid; + + cred->suid = cred->euid; + cred->sgid = cred->egid; +} + void cred_getuids(cred_t *cred, int *uidp, int *euidp, int *suidp) { *uidp = cred->uid; *euidp = cred->euid; diff --git a/kernel-src/sys/syscalls/execve.c b/kernel-src/sys/syscalls/execve.c index d312a993..7326c726 100644 --- a/kernel-src/sys/syscalls/execve.c +++ b/kernel-src/sys/syscalls/execve.c @@ -262,6 +262,11 @@ static syscallret_t execve(context_t *context, char *upath, char *uargv[], char goto error; } + vattr_t vattr; + ret.errno = VOP_GETATTR(node, &vattr, NULL); + if (ret.errno) + goto error; + ret.ret = 0; sched_stopotherthreads(); @@ -281,6 +286,17 @@ static syscallret_t execve(context_t *context, char *upath, char *uargv[], char CTX_SP(context) = (uint64_t)stack; CTX_IP(context) = (uint64_t)entry; + int suid = -1; + int sgid = -1; + + if (vattr.mode & V_ATTR_MODE_SUID) + suid = vattr.uid; + + if (vattr.mode & V_ATTR_MODE_SGID) + sgid = vattr.gid; + + cred_doexec(&_cpu()->thread->proc->cred, suid, sgid); + error: free(path); if (argv)