diff options
author | 蔡正龙 <zhenglong.cai@cs2c.com.cn> | 2013-12-19 21:04:10 -0500 |
---|---|---|
committer | Eric Paris <eparis@redhat.com> | 2014-03-20 10:11:09 -0400 |
commit | 015d991f7d97783f7220445960c0369b3e54ed08 (patch) | |
tree | 5efbf573e89b16595664bb0606fc7ab4324aedb9 /arch/alpha | |
parent | 099dd235113700bbb476e572cd191ddb77b9af46 (diff) |
alpha: Enable system-call auditing support.
Signed-off-by: Zhenglong.cai <zhenglong.cai@cs2c.com.cn>
Signed-off-by: Matt Turner <mattst88@gmail.com>
Diffstat (limited to 'arch/alpha')
-rw-r--r-- | arch/alpha/Kconfig | 3 | ||||
-rw-r--r-- | arch/alpha/include/asm/ptrace.h | 5 | ||||
-rw-r--r-- | arch/alpha/include/asm/thread_info.h | 2 | ||||
-rw-r--r-- | arch/alpha/kernel/Makefile | 1 | ||||
-rw-r--r-- | arch/alpha/kernel/audit.c | 60 | ||||
-rw-r--r-- | arch/alpha/kernel/entry.S | 6 | ||||
-rw-r--r-- | arch/alpha/kernel/ptrace.c | 4 |
7 files changed, 80 insertions, 1 deletions
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index d39dc9b95a2c..f23ab8ba4912 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig | |||
@@ -16,6 +16,7 @@ config ALPHA | |||
16 | select ARCH_WANT_IPC_PARSE_VERSION | 16 | select ARCH_WANT_IPC_PARSE_VERSION |
17 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | 17 | select ARCH_HAVE_NMI_SAFE_CMPXCHG |
18 | select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE | 18 | select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE |
19 | select AUDIT_ARCH | ||
19 | select GENERIC_CLOCKEVENTS | 20 | select GENERIC_CLOCKEVENTS |
20 | select GENERIC_SMP_IDLE_THREAD | 21 | select GENERIC_SMP_IDLE_THREAD |
21 | select GENERIC_STRNCPY_FROM_USER | 22 | select GENERIC_STRNCPY_FROM_USER |
@@ -76,6 +77,8 @@ config GENERIC_ISA_DMA | |||
76 | source "init/Kconfig" | 77 | source "init/Kconfig" |
77 | source "kernel/Kconfig.freezer" | 78 | source "kernel/Kconfig.freezer" |
78 | 79 | ||
80 | config AUDIT_ARCH | ||
81 | bool | ||
79 | 82 | ||
80 | menu "System setup" | 83 | menu "System setup" |
81 | 84 | ||
diff --git a/arch/alpha/include/asm/ptrace.h b/arch/alpha/include/asm/ptrace.h index 21128505ddbe..9047c2fe8f23 100644 --- a/arch/alpha/include/asm/ptrace.h +++ b/arch/alpha/include/asm/ptrace.h | |||
@@ -19,4 +19,9 @@ | |||
19 | 19 | ||
20 | #define force_successful_syscall_return() (current_pt_regs()->r0 = 0) | 20 | #define force_successful_syscall_return() (current_pt_regs()->r0 = 0) |
21 | 21 | ||
22 | static inline unsigned long regs_return_value(struct pt_regs *regs) | ||
23 | { | ||
24 | return regs->r0; | ||
25 | } | ||
26 | |||
22 | #endif | 27 | #endif |
diff --git a/arch/alpha/include/asm/thread_info.h b/arch/alpha/include/asm/thread_info.h index 453597b91f3a..3d6ce6d56fc9 100644 --- a/arch/alpha/include/asm/thread_info.h +++ b/arch/alpha/include/asm/thread_info.h | |||
@@ -70,6 +70,7 @@ register struct thread_info *__current_thread_info __asm__("$8"); | |||
70 | #define TIF_NOTIFY_RESUME 1 /* callback before returning to user */ | 70 | #define TIF_NOTIFY_RESUME 1 /* callback before returning to user */ |
71 | #define TIF_SIGPENDING 2 /* signal pending */ | 71 | #define TIF_SIGPENDING 2 /* signal pending */ |
72 | #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ | 72 | #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ |
73 | #define TIF_SYSCALL_AUDIT 4 /* syscall audit active */ | ||
73 | #define TIF_DIE_IF_KERNEL 9 /* dik recursion lock */ | 74 | #define TIF_DIE_IF_KERNEL 9 /* dik recursion lock */ |
74 | #define TIF_MEMDIE 13 /* is terminating due to OOM killer */ | 75 | #define TIF_MEMDIE 13 /* is terminating due to OOM killer */ |
75 | 76 | ||
@@ -77,6 +78,7 @@ register struct thread_info *__current_thread_info __asm__("$8"); | |||
77 | #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) | 78 | #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) |
78 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) | 79 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) |
79 | #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) | 80 | #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) |
81 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) | ||
80 | 82 | ||
81 | /* Work to do on interrupt/exception return. */ | 83 | /* Work to do on interrupt/exception return. */ |
82 | #define _TIF_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \ | 84 | #define _TIF_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \ |
diff --git a/arch/alpha/kernel/Makefile b/arch/alpha/kernel/Makefile index 0d54650e78fc..3ecac0106c8a 100644 --- a/arch/alpha/kernel/Makefile +++ b/arch/alpha/kernel/Makefile | |||
@@ -17,6 +17,7 @@ obj-$(CONFIG_SRM_ENV) += srm_env.o | |||
17 | obj-$(CONFIG_MODULES) += module.o | 17 | obj-$(CONFIG_MODULES) += module.o |
18 | obj-$(CONFIG_PERF_EVENTS) += perf_event.o | 18 | obj-$(CONFIG_PERF_EVENTS) += perf_event.o |
19 | obj-$(CONFIG_RTC_DRV_ALPHA) += rtc.o | 19 | obj-$(CONFIG_RTC_DRV_ALPHA) += rtc.o |
20 | obj-$(CONFIG_AUDIT) += audit.o | ||
20 | 21 | ||
21 | ifdef CONFIG_ALPHA_GENERIC | 22 | ifdef CONFIG_ALPHA_GENERIC |
22 | 23 | ||
diff --git a/arch/alpha/kernel/audit.c b/arch/alpha/kernel/audit.c new file mode 100644 index 000000000000..96a9d18ff4c4 --- /dev/null +++ b/arch/alpha/kernel/audit.c | |||
@@ -0,0 +1,60 @@ | |||
1 | #include <linux/init.h> | ||
2 | #include <linux/types.h> | ||
3 | #include <linux/audit.h> | ||
4 | #include <asm/unistd.h> | ||
5 | |||
6 | static unsigned dir_class[] = { | ||
7 | #include <asm-generic/audit_dir_write.h> | ||
8 | ~0U | ||
9 | }; | ||
10 | |||
11 | static unsigned read_class[] = { | ||
12 | #include <asm-generic/audit_read.h> | ||
13 | ~0U | ||
14 | }; | ||
15 | |||
16 | static unsigned write_class[] = { | ||
17 | #include <asm-generic/audit_write.h> | ||
18 | ~0U | ||
19 | }; | ||
20 | |||
21 | static unsigned chattr_class[] = { | ||
22 | #include <asm-generic/audit_change_attr.h> | ||
23 | ~0U | ||
24 | }; | ||
25 | |||
26 | static unsigned signal_class[] = { | ||
27 | #include <asm-generic/audit_signal.h> | ||
28 | ~0U | ||
29 | }; | ||
30 | |||
31 | int audit_classify_arch(int arch) | ||
32 | { | ||
33 | return 0; | ||
34 | } | ||
35 | |||
36 | int audit_classify_syscall(int abi, unsigned syscall) | ||
37 | { | ||
38 | switch(syscall) { | ||
39 | case __NR_open: | ||
40 | return 2; | ||
41 | case __NR_openat: | ||
42 | return 3; | ||
43 | case __NR_execve: | ||
44 | return 5; | ||
45 | default: | ||
46 | return 0; | ||
47 | } | ||
48 | } | ||
49 | |||
50 | static int __init audit_classes_init(void) | ||
51 | { | ||
52 | audit_register_class(AUDIT_CLASS_WRITE, write_class); | ||
53 | audit_register_class(AUDIT_CLASS_READ, read_class); | ||
54 | audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class); | ||
55 | audit_register_class(AUDIT_CLASS_CHATTR, chattr_class); | ||
56 | audit_register_class(AUDIT_CLASS_SIGNAL, signal_class); | ||
57 | return 0; | ||
58 | } | ||
59 | |||
60 | __initcall(audit_classes_init); | ||
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index a969b95ee5ac..98703d99b565 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S | |||
@@ -465,7 +465,11 @@ entSys: | |||
465 | .cfi_rel_offset $16, SP_OFF+24 | 465 | .cfi_rel_offset $16, SP_OFF+24 |
466 | .cfi_rel_offset $17, SP_OFF+32 | 466 | .cfi_rel_offset $17, SP_OFF+32 |
467 | .cfi_rel_offset $18, SP_OFF+40 | 467 | .cfi_rel_offset $18, SP_OFF+40 |
468 | blbs $3, strace | 468 | #ifdef CONFIG_AUDITSYSCALL |
469 | lda $6, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | ||
470 | and $3, $6, $3 | ||
471 | #endif | ||
472 | bne $3, strace | ||
469 | beq $4, 1f | 473 | beq $4, 1f |
470 | ldq $27, 0($5) | 474 | ldq $27, 0($5) |
471 | 1: jsr $26, ($27), alpha_ni_syscall | 475 | 1: jsr $26, ($27), alpha_ni_syscall |
diff --git a/arch/alpha/kernel/ptrace.c b/arch/alpha/kernel/ptrace.c index 2a4a80ff4a20..86d835157b54 100644 --- a/arch/alpha/kernel/ptrace.c +++ b/arch/alpha/kernel/ptrace.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/security.h> | 14 | #include <linux/security.h> |
15 | #include <linux/signal.h> | 15 | #include <linux/signal.h> |
16 | #include <linux/tracehook.h> | 16 | #include <linux/tracehook.h> |
17 | #include <linux/audit.h> | ||
17 | 18 | ||
18 | #include <asm/uaccess.h> | 19 | #include <asm/uaccess.h> |
19 | #include <asm/pgtable.h> | 20 | #include <asm/pgtable.h> |
@@ -316,15 +317,18 @@ long arch_ptrace(struct task_struct *child, long request, | |||
316 | asmlinkage unsigned long syscall_trace_enter(void) | 317 | asmlinkage unsigned long syscall_trace_enter(void) |
317 | { | 318 | { |
318 | unsigned long ret = 0; | 319 | unsigned long ret = 0; |
320 | struct pt_regs *regs = current_pt_regs(); | ||
319 | if (test_thread_flag(TIF_SYSCALL_TRACE) && | 321 | if (test_thread_flag(TIF_SYSCALL_TRACE) && |
320 | tracehook_report_syscall_entry(current_pt_regs())) | 322 | tracehook_report_syscall_entry(current_pt_regs())) |
321 | ret = -1UL; | 323 | ret = -1UL; |
324 | audit_syscall_entry(AUDIT_ARCH_ALPHA, regs->r0, regs->r16, regs->r17, regs->r18, regs->r19); | ||
322 | return ret ?: current_pt_regs()->r0; | 325 | return ret ?: current_pt_regs()->r0; |
323 | } | 326 | } |
324 | 327 | ||
325 | asmlinkage void | 328 | asmlinkage void |
326 | syscall_trace_leave(void) | 329 | syscall_trace_leave(void) |
327 | { | 330 | { |
331 | audit_syscall_exit(current_pt_regs()); | ||
328 | if (test_thread_flag(TIF_SYSCALL_TRACE)) | 332 | if (test_thread_flag(TIF_SYSCALL_TRACE)) |
329 | tracehook_report_syscall_exit(current_pt_regs(), 0); | 333 | tracehook_report_syscall_exit(current_pt_regs(), 0); |
330 | } | 334 | } |