Commit 699a33e1 authored by Pavel Emelyanov's avatar Pavel Emelyanov

creds: Dump creds with the help of parasite

Currently move there the secbits dumping, which is not dumped
via misc-dumping command. This patch is required to support
per-task groups dumping (setgroups/getgroups) -- we'll have to
drain the groups from parasite.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 7db199c7
...@@ -20,6 +20,13 @@ ...@@ -20,6 +20,13 @@
#include <linux/major.h> #include <linux/major.h>
#include "protobuf.h"
#include "protobuf/fdinfo.pb-c.h"
#include "protobuf/fs.pb-c.h"
#include "protobuf/mm.pb-c.h"
#include "protobuf/creds.pb-c.h"
#include "protobuf/core.pb-c.h"
#include "types.h" #include "types.h"
#include "list.h" #include "list.h"
#include "file-ids.h" #include "file-ids.h"
...@@ -50,13 +57,6 @@ ...@@ -50,13 +57,6 @@
#include "tty.h" #include "tty.h"
#include "net.h" #include "net.h"
#include "protobuf.h"
#include "protobuf/fdinfo.pb-c.h"
#include "protobuf/fs.pb-c.h"
#include "protobuf/mm.pb-c.h"
#include "protobuf/creds.pb-c.h"
#include "protobuf/core.pb-c.h"
#ifndef CONFIG_X86_64 #ifndef CONFIG_X86_64
# error No x86-32 support yet # error No x86-32 support yet
#endif #endif
...@@ -442,18 +442,17 @@ err: ...@@ -442,18 +442,17 @@ err:
return ret; return ret;
} }
static int dump_task_creds(pid_t pid, const struct parasite_dump_misc *misc, static int dump_task_creds(struct parasite_ctl *ctl, const struct cr_fdset *fds)
const struct cr_fdset *fds)
{ {
int ret; int ret;
struct proc_status_creds cr; struct proc_status_creds cr;
CredsEntry ce = CREDS_ENTRY__INIT; CredsEntry ce = CREDS_ENTRY__INIT;
pr_info("\n"); pr_info("\n");
pr_info("Dumping creds for %d)\n", pid); pr_info("Dumping creds for %d)\n", ctl->pid);
pr_info("----------------------------------------\n"); pr_info("----------------------------------------\n");
ret = parse_pid_status(pid, &cr); ret = parse_pid_status(ctl->pid, &cr);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -477,7 +476,8 @@ static int dump_task_creds(pid_t pid, const struct parasite_dump_misc *misc, ...@@ -477,7 +476,8 @@ static int dump_task_creds(pid_t pid, const struct parasite_dump_misc *misc,
ce.n_cap_bnd = CR_CAP_SIZE; ce.n_cap_bnd = CR_CAP_SIZE;
ce.cap_bnd = cr.cap_bnd; ce.cap_bnd = cr.cap_bnd;
ce.secbits = misc->secbits; if (parasite_dump_creds(ctl, &ce) < 0)
return -1;
return pb_write_one(fdset_fd(fds, CR_FD_CREDS), &ce, PB_CREDS); return pb_write_one(fdset_fd(fds, CR_FD_CREDS), &ce, PB_CREDS);
} }
...@@ -1531,21 +1531,21 @@ static int dump_one_task(struct pstree_item *item) ...@@ -1531,21 +1531,21 @@ static int dump_one_task(struct pstree_item *item)
goto err_cure; goto err_cure;
} }
ret = parasite_cure_seized(parasite_ctl); ret = dump_task_creds(parasite_ctl, cr_fdset);
if (ret) { if (ret) {
pr_err("Can't cure (pid: %d) from parasite\n", pid); pr_err("Dump creds (pid: %d) failed with %d\n", pid, ret);
goto err; goto err;
} }
ret = dump_task_mappings(pid, &vma_area_list, cr_fdset); ret = parasite_cure_seized(parasite_ctl);
if (ret) { if (ret) {
pr_err("Dump mappings (pid: %d) failed with %d\n", pid, ret); pr_err("Can't cure (pid: %d) from parasite\n", pid);
goto err; goto err;
} }
ret = dump_task_creds(pid, &misc, cr_fdset); ret = dump_task_mappings(pid, &vma_area_list, cr_fdset);
if (ret) { if (ret) {
pr_err("Dump creds (pid: %d) failed with %d\n", pid, ret); pr_err("Dump mappings (pid: %d) failed with %d\n", pid, ret);
goto err; goto err;
} }
......
...@@ -30,6 +30,7 @@ extern int parasite_dump_itimers_seized(struct parasite_ctl *ctl, struct cr_fdse ...@@ -30,6 +30,7 @@ extern int parasite_dump_itimers_seized(struct parasite_ctl *ctl, struct cr_fdse
struct parasite_dump_misc; struct parasite_dump_misc;
extern int parasite_dump_misc_seized(struct parasite_ctl *ctl, struct parasite_dump_misc *misc); extern int parasite_dump_misc_seized(struct parasite_ctl *ctl, struct parasite_dump_misc *misc);
extern int parasite_dump_creds(struct parasite_ctl *ctl, CredsEntry *ce);
extern int parasite_dump_pages_seized(struct parasite_ctl *ctl, extern int parasite_dump_pages_seized(struct parasite_ctl *ctl,
struct list_head *vma_area_list, struct list_head *vma_area_list,
struct cr_fdset *cr_fdset); struct cr_fdset *cr_fdset);
......
...@@ -29,6 +29,7 @@ enum { ...@@ -29,6 +29,7 @@ enum {
PARASITE_CMD_DUMP_SIGACTS, PARASITE_CMD_DUMP_SIGACTS,
PARASITE_CMD_DUMP_ITIMERS, PARASITE_CMD_DUMP_ITIMERS,
PARASITE_CMD_DUMP_MISC, PARASITE_CMD_DUMP_MISC,
PARASITE_CMD_DUMP_CREDS,
PARASITE_CMD_DUMP_TID_ADDR, PARASITE_CMD_DUMP_TID_ADDR,
PARASITE_CMD_DRAIN_FDS, PARASITE_CMD_DRAIN_FDS,
PARASITE_CMD_GET_PROC_FD, PARASITE_CMD_GET_PROC_FD,
...@@ -71,7 +72,6 @@ struct parasite_dump_itimers_args { ...@@ -71,7 +72,6 @@ struct parasite_dump_itimers_args {
*/ */
struct parasite_dump_misc { struct parasite_dump_misc {
unsigned int secbits;
unsigned long brk; unsigned long brk;
k_rtsigset_t blocked; k_rtsigset_t blocked;
...@@ -80,6 +80,10 @@ struct parasite_dump_misc { ...@@ -80,6 +80,10 @@ struct parasite_dump_misc {
u32 pgid; u32 pgid;
}; };
struct parasite_dump_creds {
unsigned int secbits;
};
struct parasite_dump_tid_info { struct parasite_dump_tid_info {
unsigned int *tid_addr; unsigned int *tid_addr;
int tid; int tid;
......
...@@ -4,6 +4,11 @@ ...@@ -4,6 +4,11 @@
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/mman.h> #include <sys/mman.h>
#include "protobuf.h"
#include "protobuf/sa.pb-c.h"
#include "protobuf/itimer.pb-c.h"
#include "protobuf/creds.pb-c.h"
#include "syscall.h" #include "syscall.h"
#include "ptrace.h" #include "ptrace.h"
#include "processor-flags.h" #include "processor-flags.h"
...@@ -14,10 +19,6 @@ ...@@ -14,10 +19,6 @@
#include "namespaces.h" #include "namespaces.h"
#include "pstree.h" #include "pstree.h"
#include "protobuf.h"
#include "protobuf/sa.pb-c.h"
#include "protobuf/itimer.pb-c.h"
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
...@@ -531,6 +532,18 @@ int parasite_dump_misc_seized(struct parasite_ctl *ctl, struct parasite_dump_mis ...@@ -531,6 +532,18 @@ int parasite_dump_misc_seized(struct parasite_ctl *ctl, struct parasite_dump_mis
return 0; return 0;
} }
int parasite_dump_creds(struct parasite_ctl *ctl, CredsEntry *ce)
{
struct parasite_dump_creds *pc;
pc = parasite_args(ctl, sizeof(*pc));
if (parasite_execute(PARASITE_CMD_DUMP_CREDS, ctl) < 0)
return -1;
ce->secbits = pc->secbits;
return 0;
}
/* /*
* This routine drives parasite code (been previously injected into a victim * This routine drives parasite code (been previously injected into a victim
* process) and tells it to dump pages into the file. * process) and tells it to dump pages into the file.
......
...@@ -302,7 +302,6 @@ static int reset_blocked = 0; ...@@ -302,7 +302,6 @@ static int reset_blocked = 0;
static int dump_misc(struct parasite_dump_misc *args) static int dump_misc(struct parasite_dump_misc *args)
{ {
args->secbits = sys_prctl(PR_GET_SECUREBITS, 0, 0, 0, 0);
args->brk = sys_brk(0); args->brk = sys_brk(0);
args->blocked = old_blocked; args->blocked = old_blocked;
...@@ -313,6 +312,12 @@ static int dump_misc(struct parasite_dump_misc *args) ...@@ -313,6 +312,12 @@ static int dump_misc(struct parasite_dump_misc *args)
return 0; return 0;
} }
static int dump_creds(struct parasite_dump_creds *args)
{
args->secbits = sys_prctl(PR_GET_SECUREBITS, 0, 0, 0, 0);
return 0;
}
static int dump_tid_info(struct parasite_dump_tid_info *args) static int dump_tid_info(struct parasite_dump_tid_info *args)
{ {
int ret; int ret;
...@@ -474,6 +479,8 @@ int __used parasite_service(unsigned int cmd, void *args) ...@@ -474,6 +479,8 @@ int __used parasite_service(unsigned int cmd, void *args)
return dump_itimers((struct parasite_dump_itimers_args *)args); return dump_itimers((struct parasite_dump_itimers_args *)args);
case PARASITE_CMD_DUMP_MISC: case PARASITE_CMD_DUMP_MISC:
return dump_misc((struct parasite_dump_misc *)args); return dump_misc((struct parasite_dump_misc *)args);
case PARASITE_CMD_DUMP_CREDS:
return dump_creds((struct parasite_dump_creds *)args);
case PARASITE_CMD_DUMP_TID_ADDR: case PARASITE_CMD_DUMP_TID_ADDR:
return dump_tid_info((struct parasite_dump_tid_info *)args); return dump_tid_info((struct parasite_dump_tid_info *)args);
case PARASITE_CMD_DRAIN_FDS: case PARASITE_CMD_DRAIN_FDS:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment