diff options
author | Oleg Nesterov <[email protected]> | 2012-03-23 15:02:39 -0700 |
---|---|---|
committer | Linus Torvalds <[email protected]> | 2012-03-23 16:58:40 -0700 |
commit | 15cab952139404d0e593cb1aaab0a3547ac0f95b (patch) | |
tree | 0b8554db2eadd6782774e4448e43fb40dcc11c35 | |
parent | d533df07c20c7b59b0559a3ac38fb45c81ffd6bb (diff) |
ptrace: the killed tracee should not enter the syscall
Another old/known problem. If the tracee is killed after it reports
syscall_entry, it starts the syscall and debugger can't control this.
This confuses the users and this creates the security problems for
ptrace jailers.
Change tracehook_report_syscall_entry() to return non-zero if killed,
this instructs syscall_trace_enter() to abort the syscall.
Reported-by: Chris Evans <[email protected]>
Tested-by: Indan Zupancic <[email protected]>
Signed-off-by: Oleg Nesterov <[email protected]>
Cc: Denys Vlasenko <[email protected]>
Cc: Tejun Heo <[email protected]>
Cc: Pedro Alves <[email protected]>
Cc: Jan Kratochvil <[email protected]>
Cc: Steven Rostedt <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
-rw-r--r-- | include/linux/tracehook.h | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h index a71a2927a6a0..51bd91d911c3 100644 --- a/include/linux/tracehook.h +++ b/include/linux/tracehook.h @@ -54,12 +54,12 @@ struct linux_binprm; /* * ptrace report for syscall entry and exit looks identical. */ -static inline void ptrace_report_syscall(struct pt_regs *regs) +static inline int ptrace_report_syscall(struct pt_regs *regs) { int ptrace = current->ptrace; if (!(ptrace & PT_PTRACED)) - return; + return 0; ptrace_notify(SIGTRAP | ((ptrace & PT_TRACESYSGOOD) ? 0x80 : 0)); @@ -72,6 +72,8 @@ static inline void ptrace_report_syscall(struct pt_regs *regs) send_sig(current->exit_code, current, 1); current->exit_code = 0; } + + return fatal_signal_pending(current); } /** @@ -96,8 +98,7 @@ static inline void ptrace_report_syscall(struct pt_regs *regs) static inline __must_check int tracehook_report_syscall_entry( struct pt_regs *regs) { - ptrace_report_syscall(regs); - return 0; + return ptrace_report_syscall(regs); } /** |