This patch provides functionality to audit system call events on the ARM platform. The implementation was based off the structure of the MIPS platform and information in this (http://lists.fedoraproject.org/pipermail/arm/2009-October/000382.html) mailing list thread. The required audit_syscall_exit and audit_syscall_entry checks were added to ptrace using the standard registers for system call values (r0 through r3). A thread information flag was added for auditing (TIF_SYSCALL_AUDIT) and a meta-flag was added (_TIF_SYSCALL_WORK) to simplify modifications to the syscall entry/exit. Now, if either the TRACE flag is set or the AUDIT flag is set, the syscall_trace function will be executed. The prober changes were made to Kconfig to allow CONFIG_AUDITSYSCALL to be enabled.
Due to platform availability limitations, this patch was only tested on the Android platform running the modified "android-goldfish-2.6.29" kernel. A test compile was performed using Code Sourcery's cross-compilation toolset and the current linux-3.0 stable kernel. The changes compile without error. I'm hoping, due to the simple modifications, the patch is "obviously correct". Signed-off-by: Nathaniel Husted <[email protected]> --- diff -uprN -X linux-3.0-vanilla/Documentation/dontdiff linux-3.0-vanilla/arch/arm/include/asm/thread_info.h linux-3.0-modified/arch/arm/include/asm/thread_info.h --- linux-3.0-vanilla/arch/arm/include/asm/thread_info.h 2011-07-21 19:17:23.000000000 -0700 +++ linux-3.0-modified/arch/arm/include/asm/thread_info.h 2011-08-02 14:04:29.005599252 -0700 @@ -129,6 +129,7 @@ extern void vfp_flush_hwstate(struct thr /* * thread information flags: * TIF_SYSCALL_TRACE - syscall trace active + * TIF_SYSCAL_AUDIT - syscall auditing active * TIF_SIGPENDING - signal pending * TIF_NEED_RESCHED - rescheduling necessary * TIF_NOTIFY_RESUME - callback before returning to user @@ -139,6 +140,7 @@ extern void vfp_flush_hwstate(struct thr #define TIF_NEED_RESCHED 1 #define TIF_NOTIFY_RESUME 2 /* callback before returning to user */ #define TIF_SYSCALL_TRACE 8 +#define TIF_SYSCALL_AUDIT 9 #define TIF_POLLING_NRFLAG 16 #define TIF_USING_IWMMXT 17 #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ @@ -150,12 +152,17 @@ extern void vfp_flush_hwstate(struct thr #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) +#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) + #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) #define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) #define _TIF_FREEZE (1 << TIF_FREEZE) #define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) #define _TIF_SECCOMP (1 << TIF_SECCOMP) +/* Checks for any syscall work in entry-common.S */ +#define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT) + /* * Change these and you break ASM code in entry-common.S */ diff -uprN -X linux-3.0-vanilla/Documentation/dontdiff linux-3.0-vanilla/arch/arm/kernel/entry-common.S linux-3.0-modified/arch/arm/kernel/entry-common.S --- linux-3.0-vanilla/arch/arm/kernel/entry-common.S 2011-07-21 19:17:23.000000000 -0700 +++ linux-3.0-modified/arch/arm/kernel/entry-common.S 2011-08-02 14:01:28.747720225 -0700 @@ -87,7 +87,7 @@ ENTRY(ret_from_fork) get_thread_info tsk ldr r1, [tsk, #TI_FLAGS] @ check for syscall tracing mov why, #1 - tst r1, #_TIF_SYSCALL_TRACE @ are we tracing syscalls? + tst r1, #_TIF_SYSCALL_WORK @ are we tracing syscalls? beq ret_slow_syscall mov r1, sp mov r0, #1 @ trace exit [IP = 1] @@ -443,7 +443,7 @@ ENTRY(vector_swi) 1: #endif - tst r10, #_TIF_SYSCALL_TRACE @ are we tracing syscalls? + tst r10, #_TIF_SYSCALL_WORK @ are we tracing syscalls? bne __sys_trace cmp scno, #NR_syscalls @ check upper syscall limit diff -uprN -X linux-3.0-vanilla/Documentation/dontdiff linux-3.0-vanilla/arch/arm/kernel/ptrace.c linux-3.0-modified/arch/arm/kernel/ptrace.c --- linux-3.0-vanilla/arch/arm/kernel/ptrace.c 2011-07-21 19:17:23.000000000 -0700 +++ linux-3.0-modified/arch/arm/kernel/ptrace.c 2011-08-02 14:44:09.949722828 -0700 @@ -926,11 +926,6 @@ asmlinkage int syscall_trace(int why, st { unsigned long ip; - if (!test_thread_flag(TIF_SYSCALL_TRACE)) - return scno; - if (!(current->ptrace & PT_PTRACED)) - return scno; - /* * Save IP. IP is used to denote syscall entry/exit: * IP = 0 -> entry, = 1 -> exit @@ -938,6 +933,25 @@ asmlinkage int syscall_trace(int why, st ip = regs->ARM_ip; regs->ARM_ip = why; + /* perform a secure computing check first */ + if (regs->ARM_ip) + secure_computing(scno); + + if (unlikely(current->audit_context)) { + if (!ip) + audit_syscall_exit(AUDITSC_RESULT(regs->ARM_r0), + regs->ARM_r0); + else + audit_syscall_entry(AUDIT_ARCH_ARMEB, scno, + regs->ARM_r0, regs->ARM_r1, + regs->ARM_r2, regs->ARM_r3); + } + + if (!test_thread_flag(TIF_SYSCALL_TRACE)) + return scno; + if (!(current->ptrace & PT_PTRACED)) + return scno; + current_thread_info()->syscall = scno; /* the 0x80 provides a way for the tracing parent to distinguish diff -uprN -X linux-3.0-vanilla/Documentation/dontdiff linux-3.0-vanilla/init/Kconfig linux-3.0-modified/init/Kconfig --- linux-3.0-vanilla/init/Kconfig 2011-07-21 19:17:23.000000000 -0700 +++ linux-3.0-modified/init/Kconfig 2011-08-02 14:02:06.359364526 -0700 @@ -355,7 +355,7 @@ config AUDIT config AUDITSYSCALL bool "Enable system-call auditing support" - depends on AUDIT && (X86 || PPC || S390 || IA64 || UML || SPARC64 || SUPERH) + depends on AUDIT && (X86 || PPC || S390 || IA64 || UML || SPARC64 || SUPERH || ARM) default y if SECURITY_SELINUX help Enable low-overhead system-call auditing infrastructure that -- Linux-audit mailing list [email protected] https://www.redhat.com/mailman/listinfo/linux-audit
