1,系统调用日志收集系统的意义。
系统调用是用户获取系统服务的唯一入口,因此对系统调用的安全调用直接关系到系统
的安全,假如有用户恶意不断地调用系统调用,将会导致系统负载增加,所以如果能收集到时谁
调用了一些危险的系统调用,以及调用系统调用的时间和其他信息,将有助于系统管理员进行事
后追踪,从而提高系统的安全性。
--------------------------------------------------------------
2,系统调用日志收集系统总体框架图。
-----------------------------------------------------------
3,系统调用日志收集系统的实现。(以linux-2.6..39.4为例)
3.1,添加系统调用号.
位置:arch/x86/include/asm/unistd_32.h
#define __NR_syscall_audit 345
#define __NR_myaudit 346
#ifdef __KERNEL__
#define NR_syscalls 347
----------------------------------------------------------
3.2,在系统调用表中添加相应的表项。
.long sys_syscall_audit
.long sys_myaudit
-----------------------------------------------------------
3.3,修改系统调用入口。(有两个入口,syscall_call和sysenter)
位置:arch/x86/kernel/entry_32.S
主要是在系统调用的两个入口进行监控,发现调用了如下四个系统调用(getpid,sysinfo,fork,execv)
将会执行
sys_syscall_audit函数。
- syscall_call:
- call *sys_call_table(,%eax,4)
- movl %eax,PT_EAX(%esp) # store the return value
- #如下位添加代码
- #----------------------------------------------------
- cmpl $20,0x2c(%esp) #getpid()
- je myauditsys
- cmpl $116,0x2c(%esp) #sysinfo()
- je myauditsys
- cmpl $2,0x2c(%esp) #fork
- je myauditsys
- cmpl $11,0x2c(%esp) #execv
- je myauditsys
- #-----------------------------------------------
- syscall_exit:
- LOCKDEP_SYS_EXIT
- ...
- jne syscall_exit_work
- #如下位添加代码
- #------------------------------------------------
- jmp restore_all
- myauditsys:
- pushl %eax
- pushl 0x30(%esp)
- call sys_syscall_audit
- popl %eax
- popl %eax
- jmp syscall_exit
- #------------------------------------------------
- restore_all:
- TRACE_IRQS_IRET
- sysenter_do_call:
- ...
- movl %eax,PT_EAX(%esp)
- #如下为添加代码
- /*--------------------------------------------------------*/
- cmpl $20,0x2c(%esp) #getpid()
- je enter_audit
- cmpl $116,0x2c(%esp) #sysinfo()
- je enter_audit
- cmpl $2,0x2c(%esp) #fork
- je enter_audit
- cmpl $11,0x2c(%esp) #execv
- je enter_audit
- come_back:
- /*--------------------------------------------------------*/
- sysenter_exit:
- ....
- ENABLE_INTERRUPTS_SY***IT
- /*--------------------------------------------------------*/
- jmp sysenter_audit
- enter_audit:
- pushl %eax
- pushl 0x30(%esp)
- call sys_syscall_audit
- popl %eax
- popl %eax
- jmp come_back
- /*--------------------------------------------------------*/
--------------------------------------------------------------------------------------------
3.4,添加系统调用的服务例程。
在arch/x86/kernel/下面添加文件myaudit.c
该文件中实现了系统调用的服务例程,但这儿实现的服务例程都只有一个接口,
真正的实现将在模块中实现,这样是为了方便调试,避免了多次编译内核。这儿主要
是通过两个全局变量(
my_audit
和my_sysaudit
)与内核模块之间建立了联系。
- /**
- * myaudit.c
- */
- #include <linux/proc_fs.h>
- #include <linux/init.h>
- #include <linux/types.h>
- #include <linux/sched.h>
- #include <asm/current.h>
- void (*my_audit)(int, int) = 0;
- asmlinkage void sys_syscall_audit(int syscall_number, int return_value)
- {
- if (my_audit) {
- return (*my_audit)(syscall_number, return_value);
- printk("IN KERNEL: %s(%d), syscall: %d, return: %d\n", current->comm, (int)current->pid, syscall_number, return_value);
- //printk("IN KERNEL: %s\n", current);
- } else {
- printk("my_audit is empty!\n");
- }
- return ;
- }
- int (*my_sysaudit)(u8, u8*, u16, u8) = 0;
- asmlinkage int sys_myaudit(u8 type, u8 *us_buf, u16 us_buf_size, u8 reset)
- {
- if (my_sysaudit) {
- return (*my_sysaudit)(type, us_buf, us_buf_size, reset);
- printk("IN KERNEL: my system call sys_myaudit() working...\n");
- } else {
- printk("my_sysaudit is empty!\n");
- }
- return 0;
- }
----------------------------------------------------------------------------------------------
3.5,修改makefile。位置:arch/x86/kernel/Makefile
- obj-y := process_$(BITS).o signal.o entry_$(BITS).o myaudit.o
----------------------------------------------------------------------------------------------
3.6,导出全局变量。(不导出的话,内核模块将对其不可见)
修改arch/x86/kernel/i386_ksyms_32.c文件,在其末尾追加:
- EXPORT_SYMBOL(my_audit);
- EXPORT_SYMBOL(my_sysaudit);
----------------------------------------------------------------------------------------------
3.7,声明全局变量。
修改:include/linux/module.h 添加:
- extern void (*my_audit)(int,int);
- extern int (*my_sysaudit)(u8,u8*,u16,u8);
阅读(2021) | 评论(0) | 转发(1) |