diff options
-rw-r--r-- | arch/sparc64/kernel/entry.S | 10 | ||||
-rw-r--r-- | arch/sparc64/kernel/ptrace.c | 32 | ||||
-rw-r--r-- | include/asm-sparc64/thread_info.h | 8 | ||||
-rw-r--r-- | include/linux/audit.h | 2 | ||||
-rw-r--r-- | init/Kconfig | 2 |
5 files changed, 41 insertions, 13 deletions
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index 8b7ed760c50e..d781f10adc52 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S | |||
@@ -1552,7 +1552,7 @@ sys_ptrace: add %sp, PTREGS_OFF, %o0 | |||
1552 | nop | 1552 | nop |
1553 | .align 32 | 1553 | .align 32 |
1554 | 1: ldx [%curptr + TI_FLAGS], %l5 | 1554 | 1: ldx [%curptr + TI_FLAGS], %l5 |
1555 | andcc %l5, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP), %g0 | 1555 | andcc %l5, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %g0 |
1556 | be,pt %icc, rtrap | 1556 | be,pt %icc, rtrap |
1557 | clr %l6 | 1557 | clr %l6 |
1558 | add %sp, PTREGS_OFF, %o0 | 1558 | add %sp, PTREGS_OFF, %o0 |
@@ -1679,7 +1679,7 @@ linux_sparc_syscall32: | |||
1679 | 1679 | ||
1680 | srl %i5, 0, %o5 ! IEU1 | 1680 | srl %i5, 0, %o5 ! IEU1 |
1681 | srl %i2, 0, %o2 ! IEU0 Group | 1681 | srl %i2, 0, %o2 ! IEU0 Group |
1682 | andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP), %g0 ! IEU0 Group | 1682 | andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %g0 |
1683 | bne,pn %icc, linux_syscall_trace32 ! CTI | 1683 | bne,pn %icc, linux_syscall_trace32 ! CTI |
1684 | mov %i0, %l5 ! IEU1 | 1684 | mov %i0, %l5 ! IEU1 |
1685 | call %l7 ! CTI Group brk forced | 1685 | call %l7 ! CTI Group brk forced |
@@ -1702,7 +1702,7 @@ linux_sparc_syscall: | |||
1702 | 1702 | ||
1703 | mov %i3, %o3 ! IEU1 | 1703 | mov %i3, %o3 ! IEU1 |
1704 | mov %i4, %o4 ! IEU0 Group | 1704 | mov %i4, %o4 ! IEU0 Group |
1705 | andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP), %g0 ! IEU1 Group+1 bubble | 1705 | andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %g0 |
1706 | bne,pn %icc, linux_syscall_trace ! CTI Group | 1706 | bne,pn %icc, linux_syscall_trace ! CTI Group |
1707 | mov %i0, %l5 ! IEU0 | 1707 | mov %i0, %l5 ! IEU0 |
1708 | 2: call %l7 ! CTI Group brk forced | 1708 | 2: call %l7 ! CTI Group brk forced |
@@ -1730,7 +1730,7 @@ ret_sys_call: | |||
1730 | 1: | 1730 | 1: |
1731 | cmp %o0, -ERESTART_RESTARTBLOCK | 1731 | cmp %o0, -ERESTART_RESTARTBLOCK |
1732 | bgeu,pn %xcc, 1f | 1732 | bgeu,pn %xcc, 1f |
1733 | andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP), %l6 | 1733 | andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %l6 |
1734 | 80: | 1734 | 80: |
1735 | /* System call success, clear Carry condition code. */ | 1735 | /* System call success, clear Carry condition code. */ |
1736 | andn %g3, %g2, %g3 | 1736 | andn %g3, %g2, %g3 |
@@ -1745,7 +1745,7 @@ ret_sys_call: | |||
1745 | /* System call failure, set Carry condition code. | 1745 | /* System call failure, set Carry condition code. |
1746 | * Also, get abs(errno) to return to the process. | 1746 | * Also, get abs(errno) to return to the process. |
1747 | */ | 1747 | */ |
1748 | andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP), %l6 | 1748 | andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %l6 |
1749 | sub %g0, %o0, %o0 | 1749 | sub %g0, %o0, %o0 |
1750 | or %g3, %g2, %g3 | 1750 | or %g3, %g2, %g3 |
1751 | stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] | 1751 | stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] |
diff --git a/arch/sparc64/kernel/ptrace.c b/arch/sparc64/kernel/ptrace.c index c57dc9ea731b..23ad839d113f 100644 --- a/arch/sparc64/kernel/ptrace.c +++ b/arch/sparc64/kernel/ptrace.c | |||
@@ -19,6 +19,8 @@ | |||
19 | #include <linux/smp.h> | 19 | #include <linux/smp.h> |
20 | #include <linux/smp_lock.h> | 20 | #include <linux/smp_lock.h> |
21 | #include <linux/security.h> | 21 | #include <linux/security.h> |
22 | #include <linux/seccomp.h> | ||
23 | #include <linux/audit.h> | ||
22 | #include <linux/signal.h> | 24 | #include <linux/signal.h> |
23 | 25 | ||
24 | #include <asm/asi.h> | 26 | #include <asm/asi.h> |
@@ -633,10 +635,22 @@ asmlinkage void syscall_trace(struct pt_regs *regs, int syscall_exit_p) | |||
633 | /* do the secure computing check first */ | 635 | /* do the secure computing check first */ |
634 | secure_computing(regs->u_regs[UREG_G1]); | 636 | secure_computing(regs->u_regs[UREG_G1]); |
635 | 637 | ||
636 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | 638 | if (unlikely(current->audit_context) && syscall_exit_p) { |
637 | return; | 639 | unsigned long tstate = regs->tstate; |
640 | int result = AUDITSC_SUCCESS; | ||
641 | |||
642 | if (unlikely(tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) | ||
643 | result = AUDITSC_FAILURE; | ||
644 | |||
645 | audit_syscall_exit(current, result, regs->u_regs[UREG_I0]); | ||
646 | } | ||
647 | |||
638 | if (!(current->ptrace & PT_PTRACED)) | 648 | if (!(current->ptrace & PT_PTRACED)) |
639 | return; | 649 | goto out; |
650 | |||
651 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | ||
652 | goto out; | ||
653 | |||
640 | ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) | 654 | ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) |
641 | ? 0x80 : 0)); | 655 | ? 0x80 : 0)); |
642 | 656 | ||
@@ -649,4 +663,16 @@ asmlinkage void syscall_trace(struct pt_regs *regs, int syscall_exit_p) | |||
649 | send_sig(current->exit_code, current, 1); | 663 | send_sig(current->exit_code, current, 1); |
650 | current->exit_code = 0; | 664 | current->exit_code = 0; |
651 | } | 665 | } |
666 | |||
667 | out: | ||
668 | if (unlikely(current->audit_context) && !syscall_exit_p) | ||
669 | audit_syscall_entry(current, | ||
670 | (test_thread_flag(TIF_32BIT) ? | ||
671 | AUDIT_ARCH_SPARC : | ||
672 | AUDIT_ARCH_SPARC64), | ||
673 | regs->u_regs[UREG_G1], | ||
674 | regs->u_regs[UREG_I0], | ||
675 | regs->u_regs[UREG_I1], | ||
676 | regs->u_regs[UREG_I2], | ||
677 | regs->u_regs[UREG_I3]); | ||
652 | } | 678 | } |
diff --git a/include/asm-sparc64/thread_info.h b/include/asm-sparc64/thread_info.h index 6b2fbb89bb63..a1d25c06f92a 100644 --- a/include/asm-sparc64/thread_info.h +++ b/include/asm-sparc64/thread_info.h | |||
@@ -221,7 +221,7 @@ register struct thread_info *current_thread_info_reg asm("g6"); | |||
221 | #define TIF_32BIT 7 /* 32-bit binary */ | 221 | #define TIF_32BIT 7 /* 32-bit binary */ |
222 | #define TIF_NEWCHILD 8 /* just-spawned child process */ | 222 | #define TIF_NEWCHILD 8 /* just-spawned child process */ |
223 | #define TIF_SECCOMP 9 /* secure computing */ | 223 | #define TIF_SECCOMP 9 /* secure computing */ |
224 | #define TIF_POLLING_NRFLAG 10 | 224 | #define TIF_SYSCALL_AUDIT 10 /* syscall auditing active */ |
225 | #define TIF_SYSCALL_SUCCESS 11 | 225 | #define TIF_SYSCALL_SUCCESS 11 |
226 | /* NOTE: Thread flags >= 12 should be ones we have no interest | 226 | /* NOTE: Thread flags >= 12 should be ones we have no interest |
227 | * in using in assembly, else we can't use the mask as | 227 | * in using in assembly, else we can't use the mask as |
@@ -229,6 +229,7 @@ register struct thread_info *current_thread_info_reg asm("g6"); | |||
229 | */ | 229 | */ |
230 | #define TIF_ABI_PENDING 12 | 230 | #define TIF_ABI_PENDING 12 |
231 | #define TIF_MEMDIE 13 | 231 | #define TIF_MEMDIE 13 |
232 | #define TIF_POLLING_NRFLAG 14 | ||
232 | 233 | ||
233 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) | 234 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) |
234 | #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) | 235 | #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) |
@@ -240,9 +241,10 @@ register struct thread_info *current_thread_info_reg asm("g6"); | |||
240 | #define _TIF_32BIT (1<<TIF_32BIT) | 241 | #define _TIF_32BIT (1<<TIF_32BIT) |
241 | #define _TIF_NEWCHILD (1<<TIF_NEWCHILD) | 242 | #define _TIF_NEWCHILD (1<<TIF_NEWCHILD) |
242 | #define _TIF_SECCOMP (1<<TIF_SECCOMP) | 243 | #define _TIF_SECCOMP (1<<TIF_SECCOMP) |
243 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | 244 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) |
244 | #define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING) | ||
245 | #define _TIF_SYSCALL_SUCCESS (1<<TIF_SYSCALL_SUCCESS) | 245 | #define _TIF_SYSCALL_SUCCESS (1<<TIF_SYSCALL_SUCCESS) |
246 | #define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING) | ||
247 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | ||
246 | 248 | ||
247 | #define _TIF_USER_WORK_MASK ((0xff << TI_FLAG_WSAVED_SHIFT) | \ | 249 | #define _TIF_USER_WORK_MASK ((0xff << TI_FLAG_WSAVED_SHIFT) | \ |
248 | (_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | \ | 250 | (_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | \ |
diff --git a/include/linux/audit.h b/include/linux/audit.h index bf2ad3ba72eb..68aba0c02e49 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
@@ -165,7 +165,7 @@ | |||
165 | #define AUDIT_ARCH_SH64 (EM_SH|__AUDIT_ARCH_64BIT) | 165 | #define AUDIT_ARCH_SH64 (EM_SH|__AUDIT_ARCH_64BIT) |
166 | #define AUDIT_ARCH_SHEL64 (EM_SH|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) | 166 | #define AUDIT_ARCH_SHEL64 (EM_SH|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) |
167 | #define AUDIT_ARCH_SPARC (EM_SPARC) | 167 | #define AUDIT_ARCH_SPARC (EM_SPARC) |
168 | #define AUDIT_ARCH_SPARC64 (EM_SPARC64|__AUDIT_ARCH_64BIT) | 168 | #define AUDIT_ARCH_SPARC64 (EM_SPARCV9|__AUDIT_ARCH_64BIT) |
169 | #define AUDIT_ARCH_V850 (EM_V850|__AUDIT_ARCH_LE) | 169 | #define AUDIT_ARCH_V850 (EM_V850|__AUDIT_ARCH_LE) |
170 | #define AUDIT_ARCH_X86_64 (EM_X86_64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) | 170 | #define AUDIT_ARCH_X86_64 (EM_X86_64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE) |
171 | 171 | ||
diff --git a/init/Kconfig b/init/Kconfig index b1091d7542ce..75755ef50c89 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -174,7 +174,7 @@ config AUDIT | |||
174 | 174 | ||
175 | config AUDITSYSCALL | 175 | config AUDITSYSCALL |
176 | bool "Enable system-call auditing support" | 176 | bool "Enable system-call auditing support" |
177 | depends on AUDIT && (X86 || PPC || PPC64 || ARCH_S390 || IA64 || UML) | 177 | depends on AUDIT && (X86 || PPC || PPC64 || ARCH_S390 || IA64 || UML || SPARC64) |
178 | default y if SECURITY_SELINUX | 178 | default y if SECURITY_SELINUX |
179 | help | 179 | help |
180 | Enable low-overhead system-call auditing infrastructure that | 180 | Enable low-overhead system-call auditing infrastructure that |