parisc: add kernel auditing feature
Subsystems (2)
Helge Deller
maintainerPATCH 1/1 parisc: add kernel auditing feature
Still untested as additional work - which is ongoing - is needed in the upstream auditd tool.
Signed-off-by Helge Deller <[email protected]>
arch/parisc/Kconfig +4 -0
@@ -287,6 +287,10 @@ config SYSVIPC_COMPAT def_bool y depends on COMPAT && SYSVIPC +config AUDIT_ARCH + def_bool y + depends on COMPAT + config HPUX bool "Support for HP-UX binaries" depends on !64BIT
arch/parisc/include/asm/thread_info.h +3 -1
@@ -59,6 +59,7 @@ struct thread_info {#define TIF_32BIT 4/* 32 bit binary */ #define TIF_MEMDIE 5/* is terminating due to OOM killer */ #define TIF_RESTORE_SIGMASK 6/* restore saved signal mask */ +#define TIF_SYSCALL_AUDIT 7/* syscall auditing active */ #define TIF_NOTIFY_RESUME 8/* callback before returning to user */ #define TIF_SINGLESTEP 9/* single stepping? */ #define TIF_BLOCKSTEP 10/* branch stepping? */
@@ -68,6 +69,7 @@ struct thread_info {#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)#define _TIF_32BIT (1 << TIF_32BIT) +#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)#define _TIF_BLOCKSTEP (1 << TIF_BLOCKSTEP)
@@ -75,7 +77,7 @@ struct thread_info {#define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | \ _TIF_NEED_RESCHED)#define _TIF_SYSCALL_TRACE_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \ - _TIF_BLOCKSTEP) + _TIF_BLOCKSTEP | _TIF_SYSCALL_AUDIT)#endif /* __KERNEL__ */
arch/parisc/kernel/Makefile +1 -0
@@ -31,5 +31,6 @@ obj-$(CONFIG_64BIT) += binfmt_elf32.o sys_parisc32.o signal32.o obj-$(CONFIG_STACKTRACE)+= stacktrace.o # only supported for PCX-W/U in 64-bit mode at the moment obj-$(CONFIG_64BIT) += perf.o perf_asm.o +obj-$(CONFIG_AUDIT_ARCH) += audit.o compat_audit.o obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o
arch/parisc/kernel/audit.c new file +81 -0
81 lines not on this page · raw message
arch/parisc/kernel/compat_audit.c new file +40 -0
@@ -0,0 +1,40 @@ +#include <asm/unistd.h> + +unsigned int parisc32_dir_class[] = { +#include <asm-generic/audit_dir_write.h> +~0U +}; + +unsigned int parisc32_chattr_class[] = { +#include <asm-generic/audit_change_attr.h> +~0U +}; + +unsigned int parisc32_write_class[] = { +#include <asm-generic/audit_write.h> +~0U +}; + +unsigned int parisc32_read_class[] = { +#include <asm-generic/audit_read.h> +~0U +}; + +unsigned int parisc32_signal_class[] = { +#include <asm-generic/audit_signal.h> +~0U +}; + +int parisc32_classify_syscall (unsigned syscall) +{ +switch (syscall) { +case __NR_open: +return 2 ; +case __NR_openat: +return 3 ; +case __NR_execve: +return 5 ; +default : +return 1 ; + } +}
arch/parisc/kernel/ptrace.c +23 -3
@@ -19,6 +19,7 @@#include <linux/security.h> #include <linux/compat.h> #include <linux/signal.h> +#include <linux/audit.h> #include <asm/uaccess.h> #include <asm/pgtable.h>
@@ -267,11 +268,28 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,long do_syscall_trace_enter (struct pt_regs *regs) { +long ret =0 ; +if (test_thread_flag (TIF_SYSCALL_TRACE ) &&tracehook_report_syscall_entry (regs)) -return -1L ; - -return regs->gr[20 ]; + ret =-1L ; + +#ifdef CONFIG_64BIT +if (!is_compat_task ()) +audit_syscall_entry (AUDIT_ARCH_PARISC64 , + regs->gr[20 ], + regs->gr[26 ], regs->gr[25 ], + regs->gr[24 ], regs->gr[23 ]); + else +#endif +audit_syscall_entry (AUDIT_ARCH_PARISC , + regs->gr[20 ] &0xffffffff , + regs->gr[26 ] &0xffffffff , + regs->gr[25 ] &0xffffffff , + regs->gr[24 ] &0xffffffff , + regs->gr[23 ] &0xffffffff ); + +return ret ? : regs->gr[20 ]; }void do_syscall_trace_exit (struct pt_regs *regs)
@@ -279,6 +297,8 @@ void do_syscall_trace_exit(struct pt_regs *regs)int stepping =test_thread_flag (TIF_SINGLESTEP ) ||test_thread_flag (TIF_BLOCKSTEP ); +audit_syscall_exit (regs); +if (stepping ||test_thread_flag (TIF_SYSCALL_TRACE ))tracehook_report_syscall_exit (regs, stepping); }
Helge Deller
maintainerupdated (functional) patch:
parisc: add kernel auditing feature (v2)
Add kernel auditing feature for parisc.
Changes to v1:
- ptrace.h: added regs_return_value() function
- init/Kconfig: enable CONFIG_AUDITSYSCALL for parisc architecture in Kconfig
Signed-off-by Helge Deller <[email protected]>
arch/parisc/Kconfig +4 -0
@@ -287,6 +287,10 @@ config SYSVIPC_COMPAT def_bool y depends on COMPAT && SYSVIPC +config AUDIT_ARCH + def_bool y + depends on COMPAT + config HPUX bool "Support for HP-UX binaries" depends on !64BIT
arch/parisc/include/asm/thread_info.h +3 -1
@@ -59,6 +59,7 @@ struct thread_info {#define TIF_32BIT 4/* 32 bit binary */ #define TIF_MEMDIE 5/* is terminating due to OOM killer */ #define TIF_RESTORE_SIGMASK 6/* restore saved signal mask */ +#define TIF_SYSCALL_AUDIT 7/* syscall auditing active */ #define TIF_NOTIFY_RESUME 8/* callback before returning to user */ #define TIF_SINGLESTEP 9/* single stepping? */ #define TIF_BLOCKSTEP 10/* branch stepping? */
@@ -68,6 +69,7 @@ struct thread_info {#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)#define _TIF_32BIT (1 << TIF_32BIT) +#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)#define _TIF_BLOCKSTEP (1 << TIF_BLOCKSTEP)
@@ -75,7 +77,7 @@ struct thread_info {#define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | \ _TIF_NEED_RESCHED)#define _TIF_SYSCALL_TRACE_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \ - _TIF_BLOCKSTEP) + _TIF_BLOCKSTEP | _TIF_SYSCALL_AUDIT)#endif /* __KERNEL__ */
arch/parisc/kernel/Makefile +1 -0
@@ -31,5 +31,6 @@ obj-$(CONFIG_64BIT) += binfmt_elf32.o sys_parisc32.o signal32.o obj-$(CONFIG_STACKTRACE)+= stacktrace.o # only supported for PCX-W/U in 64-bit mode at the moment obj-$(CONFIG_64BIT) += perf.o perf_asm.o +obj-$(CONFIG_AUDIT_ARCH) += audit.o compat_audit.o obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o
arch/parisc/kernel/audit.c new file +81 -0
81 lines not on this page · raw message
arch/parisc/kernel/compat_audit.c new file +40 -0
@@ -0,0 +1,40 @@ +#include <asm/unistd.h> + +unsigned int parisc32_dir_class[] = { +#include <asm-generic/audit_dir_write.h> +~0U +}; + +unsigned int parisc32_chattr_class[] = { +#include <asm-generic/audit_change_attr.h> +~0U +}; + +unsigned int parisc32_write_class[] = { +#include <asm-generic/audit_write.h> +~0U +}; + +unsigned int parisc32_read_class[] = { +#include <asm-generic/audit_read.h> +~0U +}; + +unsigned int parisc32_signal_class[] = { +#include <asm-generic/audit_signal.h> +~0U +}; + +int parisc32_classify_syscall (unsigned syscall) +{ +switch (syscall) { +case __NR_open: +return 2 ; +case __NR_openat: +return 3 ; +case __NR_execve: +return 5 ; +default : +return 1 ; + } +}
arch/parisc/kernel/ptrace.c +23 -3
@@ -19,6 +19,7 @@#include <linux/security.h> #include <linux/compat.h> #include <linux/signal.h> +#include <linux/audit.h> #include <asm/uaccess.h> #include <asm/pgtable.h>
@@ -267,11 +268,28 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,long do_syscall_trace_enter (struct pt_regs *regs) { +long ret =0 ; +if (test_thread_flag (TIF_SYSCALL_TRACE ) &&tracehook_report_syscall_entry (regs)) -return -1L ; - -return regs->gr[20 ]; + ret =-1L ; + +#ifdef CONFIG_64BIT +if (!is_compat_task ()) +audit_syscall_entry (AUDIT_ARCH_PARISC64 , + regs->gr[20 ], + regs->gr[26 ], regs->gr[25 ], + regs->gr[24 ], regs->gr[23 ]); + else +#endif +audit_syscall_entry (AUDIT_ARCH_PARISC , + regs->gr[20 ] &0xffffffff , + regs->gr[26 ] &0xffffffff , + regs->gr[25 ] &0xffffffff , + regs->gr[24 ] &0xffffffff , + regs->gr[23 ] &0xffffffff ); + +return ret ? : regs->gr[20 ]; }void do_syscall_trace_exit (struct pt_regs *regs)
@@ -279,6 +297,8 @@ void do_syscall_trace_exit(struct pt_regs *regs)int stepping =test_thread_flag (TIF_SINGLESTEP ) ||test_thread_flag (TIF_BLOCKSTEP ); +audit_syscall_exit (regs); +if (stepping ||test_thread_flag (TIF_SYSCALL_TRACE ))tracehook_report_syscall_exit (regs, stepping); }
arch/parisc/include/asm/ptrace.h +4 -0
@@ -19,5 +19,9 @@#define user_stack_pointer (regs) ((regs)->gr[30])unsigned long profile_pc (struct pt_regs *); +static inline unsigned long regs_return_value (struct pt_regs *regs) +{ +return regs->gr[20 ]; +}#endif
init/Kconfig +1 -1
@@ -284,7 +284,7 @@ config AUDIT config AUDITSYSCALL bool "Enable system-call auditing support" - depends on AUDIT && (X86 || PPC || S390 || IA64 || UML || SPARC64 || SUPERH || (ARM && AEABI && !OABI_COMPAT)) + depends on AUDIT && (X86 || PARISC || PPC || S390 || IA64 || UML || SPARC64 || SUPERH || (ARM && AEABI && !OABI_COMPAT)) default y if SECURITY_SELINUX help Enable low-overhead system-call auditing infrastructure that