[go: up one dir, main page]

File: ptrace.c

package info (click to toggle)
trinity 1.3-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 3,252 kB
  • ctags: 2,738
  • sloc: ansic: 24,011; sh: 322; makefile: 141
file content (53 lines) | stat: -rw-r--r-- 1,669 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
 * SYSCALL_DEFINE4(ptrace, long, request, long, pid, long, addr, long, data)
 */
#include <stdlib.h>
#include <linux/ptrace.h>
#include "sanitise.h"
#include "shm.h"
#include "compat.h"
#include "arch.h"


static void sanitise_ptrace(int childno)
{
	unsigned int i;

	/* We must be careful to not give out ARG_PID to ptrace,
	 * because we might end up tracing the parent process, or screen/tmux,
	 * or god knows what else that we don't control, but are allowed to trace.
	 * As we can't send it a CONT, it'll just hang forever.
	 * So we just send ptrace commands to child processes.
	 * The parent will get a WIFSTOPPED, and send a CONT, and the world keeps turning.
	 *
	 * Or at least, that's the theory. In reality, this is currently causing 'no such process' errors.
	 *  but broken is at least better than hanging.
	 */
	i  = rand() % shm->running_childs;
	shm->a2[childno] = shm->pids[i];
}


struct syscall syscall_ptrace = {
	.name = "ptrace",
	.num_args = 4,
	.arg1name = "request",
	.arg1type = ARG_OP,
	.arg1list = {
		.num = 25,
		.values = { PTRACE_TRACEME, PTRACE_PEEKTEXT, PTRACE_PEEKDATA, PTRACE_PEEKUSR,
				PTRACE_POKETEXT, PTRACE_POKEDATA, PTRACE_POKEUSR, PTRACE_GETREGS,
				PTRACE_GETFPREGS, PTRACE_GETSIGINFO, PTRACE_SETREGS, PTRACE_SETFPREGS,
				PTRACE_SETSIGINFO, PTRACE_SETOPTIONS, PTRACE_GETEVENTMSG, PTRACE_CONT,
				PTRACE_SYSCALL, PTRACE_SINGLESTEP, PTRACE_SYSEMU, PTRACE_SYSEMU_SINGLESTEP,
				PTRACE_KILL, PTRACE_ATTACH, PTRACE_DETACH, PTRACE_GETSIGMASK,
				PTRACE_SETSIGMASK },
	},
	.arg2name = "pid",
	.arg3name = "addr",
	.arg3type = ARG_ADDRESS,
	.arg4name = "data",
	.sanitise = sanitise_ptrace,

	.flags = AVOID_SYSCALL,
};