Added support for username/groupname

Added support for username/groupname to seuid, setgid, chroot.
This commit is contained in:
z3APA3A 2018-04-17 18:46:01 +03:00
parent 68e05d54d7
commit 5149996b20
2 changed files with 63 additions and 11 deletions

View File

@ -931,21 +931,21 @@ configuration within one minute. Any number of files may be monitored.
.B setuid .B setuid
<uid> <uid>
.br .br
calls setuid(uid), uid must be numeric. Unix only. Warning: under some Linux calls setuid(uid), uid can be numeric or since 0.9 username. Unix only. Warning: under some Linux
kernels setuid() works onle for current thread. It makes it impossible to suid kernels setuid() works for current thread only. It makes it impossible to suid
for all threads. for all threads.
.br .br
.B setgid .B setgid
<gid> <gid>
.br .br
calls setgid(gid), gid must be numeric. Unix only. calls setgid(gid), gid can be numeric or since 0.9 groupname. Unix only.
.br .br
.B chroot .B chroot
<path> <path> [<uid>] [<gid>]
.br .br
calls chroot(path). Unix only. calls chroot(path) and sets gid/uid. Unix only. uid/gid supported since 0.9, can be numeric or username/groupname
.br .br
.B stacksize .B stacksize

View File

@ -9,6 +9,8 @@
#include "proxy.h" #include "proxy.h"
#ifndef _WIN32 #ifndef _WIN32
#include <sys/resource.h> #include <sys/resource.h>
#include <pwd.h>
#include <grp.h>
#ifndef NOPLUGINS #ifndef NOPLUGINS
#include <dlfcn.h> #include <dlfcn.h>
#endif #endif
@ -1398,9 +1400,23 @@ static int h_plugin(int argc, unsigned char **argv){
} }
#ifndef _WIN32 #ifndef _WIN32
uid_t strtouid(unsigned char *str){
uid_t res = 0;
if(!isnumber(*(char *)str)){
struct passwd *pw;
pw = getpwnam((char *)str);
if(pw) res = pw->pw_uid;
}
else res = atoi((char *)str);
return res;
}
static int h_setuid(int argc, unsigned char **argv){ static int h_setuid(int argc, unsigned char **argv){
int res; uid_t res = 0;
res = atoi((char *)argv[1]); res = strtouid(argv[1]);
if(!res || setreuid(res,res)) { if(!res || setreuid(res,res)) {
fprintf(stderr, "Unable to set uid %d", res); fprintf(stderr, "Unable to set uid %d", res);
return(1); return(1);
@ -1408,10 +1424,21 @@ static int h_setuid(int argc, unsigned char **argv){
return 0; return 0;
} }
static int h_setgid(int argc, unsigned char **argv){ gid_t strtogid(unsigned char *str){
int res; gid_t res;
res = atoi((char *)argv[1]); if(!isnumber(*(char *)str)){
struct group *gr;
gr = getgrnam((char *)str);
if(gr) res = gr->gr_gid;
}
else res = atoi((char *)str);
}
static int h_setgid(int argc, unsigned char **argv){
gid_t res = 0;
res = strtogid(argv[1]);
if(!res || setregid(res,res)) { if(!res || setregid(res,res)) {
fprintf(stderr, "Unable to set gid %d", res); fprintf(stderr, "Unable to set gid %d", res);
return(1); return(1);
@ -1421,6 +1448,22 @@ static int h_setgid(int argc, unsigned char **argv){
static int h_chroot(int argc, unsigned char **argv){ static int h_chroot(int argc, unsigned char **argv){
uid_t uid = 0;
gid_t gid = 0;
if(argc > 2) {
uid = strtouid(argv[2]);
if(!uid){
fprintf(stderr, "Unable to resolve uid %s", argv[2]);
return(2);
}
}
if(argc > 3) {
gid = strtogid(argv[3]);
if(!gid){
fprintf(stderr, "Unable to resolve gid %s", argv[3]);
return(3);
}
}
if(!chrootp){ if(!chrootp){
char *p; char *p;
if(chroot((char *)argv[1])) { if(chroot((char *)argv[1])) {
@ -1434,6 +1477,15 @@ static int h_chroot(int argc, unsigned char **argv){
} }
chrootp = mystrdup((char *)argv[1]); chrootp = mystrdup((char *)argv[1]);
} }
if (gid && setregid(gid,gid)) {
fprintf(stderr, "Unable to set gid %d", (int)gid);
return(4);
}
if (uid && setreuid(uid,uid)) {
fprintf(stderr, "Unable to set uid %d", (int)uid);
return(5);
}
return 0; return 0;
} }
#endif #endif
@ -1443,7 +1495,7 @@ struct commands specificcommands[]={
#ifndef _WIN32 #ifndef _WIN32
{specificcommands+1, "setuid", h_setuid, 2, 2}, {specificcommands+1, "setuid", h_setuid, 2, 2},
{specificcommands+2, "setgid", h_setgid, 2, 2}, {specificcommands+2, "setgid", h_setgid, 2, 2},
{specificcommands+3, "chroot", h_chroot, 2, 2}, {specificcommands+3, "chroot", h_chroot, 2, 4},
#endif #endif
{NULL, "", h_noop, 1, 0} {NULL, "", h_noop, 1, 0}
}; };