Mercurial > hg > dhcpcd
changeset 5312:b336a280de82 draft
privsep: Set resource limits when dropping privs
Disables forking, new files, sockets and writing large files.
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Fri, 05 Jun 2020 12:24:44 +0100 |
| parents | fd78486b12a7 |
| children | 9aa7c5f01a8b |
| files | src/privsep.c |
| diffstat | 1 files changed, 22 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/privsep.c Fri Jun 05 12:23:51 2020 +0100 +++ b/src/privsep.c Fri Jun 05 12:24:44 2020 +0100 @@ -39,6 +39,7 @@ * this in a script or something. */ +#include <sys/resource.h> #include <sys/socket.h> #include <sys/stat.h> #include <sys/types.h> @@ -112,6 +113,7 @@ ps_dropprivs(struct dhcpcd_ctx *ctx) { struct passwd *pw = ctx->ps_user; + struct rlimit rzero = { .rlim_cur = 0, .rlim_max = 0 }; if (!(ctx->options & DHCPCD_FORKED)) logdebugx("chrooting to `%s' as %s", pw->pw_dir, pw->pw_name); @@ -128,6 +130,26 @@ return -1; } + /* Prohibit new files, sockets, etc */ + if (setrlimit(RLIMIT_NOFILE, &rzero) == -1) { + logerr("setrlimit RLIMIT_NOFILE"); + return -1; + } + + /* Prohibit large files */ + if (setrlimit(RLIMIT_FSIZE, &rzero) == -1) { + logerr("setrlimit RLIMIT_FSIZE"); + return -1; + } + +#ifdef RLIMIT_NPROC + /* Prohibit forks */ + if (setrlimit(RLIMIT_NPROC, &rzero) == -1) { + logerr("setrlimit RLIMIT_NPROC"); + return -1; + } +#endif + return 0; }
