fix /proc/pid/mem, /proc/pid/status, /proc/pid/cmdline
This commit is contained in:
@@ -39,6 +39,8 @@
|
||||
#define MCEXEC_UP_GET_CPU 0x30a02907
|
||||
#define MCEXEC_UP_STRNCPY_FROM_USER 0x30a02908
|
||||
#define MCEXEC_UP_NEW_PROCESS 0x30a02909
|
||||
#define MCEXEC_UP_GET_CRED 0x30a0290a
|
||||
#define MCEXEC_UP_GET_CREDV 0x30a0290b
|
||||
|
||||
#define MCEXEC_UP_PREPARE_DMA 0x30a02910
|
||||
#define MCEXEC_UP_FREE_DMA 0x30a02911
|
||||
@@ -80,14 +82,7 @@ struct program_load_desc {
|
||||
int err;
|
||||
int stack_prot;
|
||||
int pgid;
|
||||
int ruid;
|
||||
int euid;
|
||||
int suid;
|
||||
int fsuid;
|
||||
int rgid;
|
||||
int egid;
|
||||
int sgid;
|
||||
int fsgid;
|
||||
int cred[8];
|
||||
unsigned long entry;
|
||||
unsigned long user_start;
|
||||
unsigned long user_end;
|
||||
|
||||
@@ -786,6 +786,40 @@ struct mckernel_exec_file {
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
int
|
||||
mcexec_getcred(unsigned long phys)
|
||||
{
|
||||
int *virt = phys_to_virt(phys);
|
||||
|
||||
virt[0] = current_uid();
|
||||
virt[1] = current_euid();
|
||||
virt[2] = current_suid();
|
||||
virt[3] = current_fsuid();
|
||||
virt[4] = current_gid();
|
||||
virt[5] = current_egid();
|
||||
virt[6] = current_sgid();
|
||||
virt[7] = current_fsgid();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
mcexec_getcredv(int __user *virt)
|
||||
{
|
||||
int wk[8];
|
||||
|
||||
wk[0] = current_uid();
|
||||
wk[1] = current_euid();
|
||||
wk[2] = current_suid();
|
||||
wk[3] = current_fsuid();
|
||||
wk[4] = current_gid();
|
||||
wk[5] = current_egid();
|
||||
wk[6] = current_sgid();
|
||||
wk[7] = current_fsgid();
|
||||
if(copy_to_user(virt, wk, sizeof(int) * 8))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mcexec_open_exec(ihk_os_t os, char * __user filename)
|
||||
{
|
||||
struct file *file;
|
||||
@@ -957,6 +991,13 @@ long __mcctrl_control(ihk_os_t os, unsigned int req, unsigned long arg,
|
||||
|
||||
case MCEXEC_UP_FREE_DMA:
|
||||
return mcexec_free_region(os, (unsigned long *)arg);
|
||||
|
||||
case MCEXEC_UP_GET_CRED:
|
||||
return mcexec_getcred((unsigned long)arg);
|
||||
|
||||
case MCEXEC_UP_GET_CREDV:
|
||||
return mcexec_getcredv((int *)arg);
|
||||
|
||||
case MCEXEC_UP_DEBUG_LOG:
|
||||
return mcexec_debug_log(os, arg);
|
||||
}
|
||||
|
||||
@@ -65,6 +65,8 @@ static struct ihk_os_user_call_handler mcctrl_uchs[] = {
|
||||
{ .request = MCEXEC_UP_FREE_DMA, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_OPEN_EXEC, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_CLOSE_EXEC, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_GET_CRED, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_GET_CREDV, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_DEBUG_LOG, .func = mcctrl_ioctl },
|
||||
};
|
||||
|
||||
|
||||
@@ -159,12 +159,6 @@ struct program_load_desc *load_elf(FILE *fp, char **interp_pathp)
|
||||
int load_addr_set = 0;
|
||||
static char interp_path[PATH_MAX];
|
||||
ssize_t ss;
|
||||
uid_t ruid;
|
||||
uid_t euid;
|
||||
uid_t suid;
|
||||
gid_t rgid;
|
||||
gid_t egid;
|
||||
gid_t sgid;
|
||||
|
||||
*interp_pathp = NULL;
|
||||
|
||||
@@ -248,18 +242,8 @@ struct program_load_desc *load_elf(FILE *fp, char **interp_pathp)
|
||||
}
|
||||
desc->pid = getpid();
|
||||
desc->pgid = getpgid(0);
|
||||
getresuid(&ruid, &euid, &suid);
|
||||
getresgid(&rgid, &egid, &sgid);
|
||||
desc->ruid = ruid;
|
||||
desc->euid = euid;
|
||||
desc->suid = suid;
|
||||
// desc->fsuid = setfsuid(-1);
|
||||
desc->rgid = rgid;
|
||||
desc->egid = egid;
|
||||
desc->sgid = sgid;
|
||||
// desc->fsgid = setfsgid(-1);
|
||||
desc->entry = hdr.e_entry;
|
||||
|
||||
ioctl(fd, MCEXEC_UP_GET_CREDV, desc->cred);
|
||||
desc->at_phdr = load_addr + hdr.e_phoff;
|
||||
desc->at_phent = sizeof(phdr);
|
||||
desc->at_phnum = hdr.e_phnum;
|
||||
@@ -2046,6 +2030,17 @@ return_execve2:
|
||||
do_syscall_return(fd, cpu, 0, 0, 0, 0, 0);
|
||||
break;
|
||||
|
||||
case __NR_setfsuid:
|
||||
if(w.sr.args[1] == 1){
|
||||
ioctl(fd, MCEXEC_UP_GET_CRED, w.sr.args[0]);
|
||||
ret = 0;
|
||||
}
|
||||
else{
|
||||
ret = setfsuid(w.sr.args[0]);
|
||||
}
|
||||
do_syscall_return(fd, cpu, ret, 0, 0, 0, 0);
|
||||
break;
|
||||
|
||||
case __NR_close:
|
||||
if(w.sr.args[0] == fd)
|
||||
ret = -EBADF;
|
||||
@@ -2055,8 +2050,8 @@ return_execve2:
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = do_generic_syscall(&w);
|
||||
do_syscall_return(fd, cpu, ret, 0, 0, 0, 0);
|
||||
ret = do_generic_syscall(&w);
|
||||
do_syscall_return(fd, cpu, ret, 0, 0, 0, 0);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user