李晓丽,李小红(.南通大学现代教育技术中心,南通 6000;.武汉大学计算机学院,武汉 43007)
基于Hook机制的Linux文件访问日志模块研究
李晓丽1,李小红2
(1.南通大学现代教育技术中心,南通226000;2.武汉大学计算机学院,武汉 430072)
Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。因为它符合IEEE POSIX.1标准[1],移植性好,目前已被广泛使用,很多大中型企业的应用服务都是构筑在其之上,例如Web服务、数据库服务、集群服务等。但是,相比于Windows操作系统,它的安全问题一直没有得到很好的解决,基于此,本文在深入研究可加载内核模块(Loadable Kernel Modules,LKM)基础上,使用Hook技术,构建了一个文件访问日志记录模块,如果入侵者通过某用户账户进入服务器系统并尝试修改文件,则会在相应文件目录下生成一个含有相关信息的日志记录,这样系统就可以在第一时间定位该用户。
在此基础上,我们又设计了一个短信报警平台,当系统文件被非法修改时,系统会通过移动网关向管理员发送短信告警信息,这样管理员就可以尽早恢复文件,减少相应损失。
Linux是单内核的操作系统[2],即整个系统内核都运行于一个单独的保护域中。相比于微内核的操作系统,单内核由于把所有的系统功能模块都集中到一起,系统的性能和速度都非常好,但是可扩展性和维护性就相对较差。为了弥补单内核的这个缺点,Linux操作系统使用可装载内核模块LKM机制[3],可以在运行时动态地更改Linux。
可动态更改是指允许内核在运行时动态地向其中插入或从中删除代码。这些代码包括相关的子例程、数据、函数入口和函数出口被一并组合在一个单独的二进制镜像中,即所谓的可装载内核模块中,或被简称为模块。这是一种区别于一般应用程序的系统级程序,它主要用于扩展Linux的内核功能。LKM的优点是基本内核镜像可以尽可能的小,可以最小化内核的内存占用,只加载需要的元素,可选的功能和驱动程序可以利用模块形式再提供[9]。模块允许我们方便的删除和重新载入内核代码,也方便了调试工作,无须重新编译内核。而且当热插拔新设备时,可通过命令载入新的驱动程序。
操作系统中的状态分为内核态和用户态。操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境来使应用程序具有更好的兼容性,为了达到这个目的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system call)的接口呈现给用户。一般用户程序只在用户态下运行,有时需要访问系统核心功能,这时通过系统调用接口进行系统调用[4]。系统调用把应用程序的请求传给内核,调用相应的内核函数完成所需的处理,将处理结果返回给应用程序[5]。
换言之,系统调用即为用户空间访问内核的一种方式,其具体执行过程如图1所示[6]:
①在应用程序中调用用户空间的库函数;
②库函数在执行一系列预处理后,取得系统调用号,传递相应的参数并执行软中断指令INT产生中断;
③Linux系统进行地址空间的转换和堆栈的切换,执行SAVE_ALL宏定义,从而保存任务现场;
④根据系统调用号从系统调用表找到对应系统调用处理程序的入口地址;
⑤执行系统调用对应的处理程序;
⑥执行RESTORE_ALL宏定义,恢复系统调用前的任务现场并返回用户模式。
图1 系统调用过程示意图
Hook(钩子)是一种特殊的消息处理机制,钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,例如截获键盘、鼠标的输入,屏幕取词,日志监视等。
Hooking(挂钩)实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,Hook函数就先捕获该消息,亦即Hook函数先得到控制权。这时Hook函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
图2 内核Hooking原理示意图
从图2可以看出,Hook可用来扩展(或削弱)一个子程序的功能,它也可用来修改系统应用程序编程接口 (Application Programming Interface,API)的运行效果。
本文中我们利用 0x80中断劫持 system_call-> sys_call_table进行系统调用进行Hook。
我们知道,要对系统调用(sys_call_table)进行替换,必须要获取该地址后才可以进行替换。但是Linux 2.6版的内核出于安全的考虑没有将系统调用列表基地址的符号sys_call_table导出,考虑到系统调用都是通过0x80中断来进行的[10-11],故我们可以通过查找0x80中断的处理程序来获得sys_call_table的地址。基本步骤如下。
①获取中断描述符表 (Interrupt Descriptor Table,IDT)的地址;
②从中查找0x80中断(系统调用中断)的服务例程(8*0x80偏移);
③搜索该例程的内存空间;
④从其中获取sys_call_table(保存所有系统调用例程的入口地址)的地址。
在Linux系统中一般存在多个用户,为了保障系统安全,我们要监视系统中的所有非法活动并将其记录到系统日志中。基于Linux下“一切皆文件”的思想[7],任何入侵者进入系统后的所有动作都是针对文件的操作。因此,当入侵者通过某个用户账户进入系统并尝试修改文件时 (本文暂不考虑新增文件和删除文件的情形),为了能够在第一时间定位该用户,我们在深入研究0x80中断机制的基础上,通过在Linux系统内核调用中增加文件访问/修改记录日志模块的方法来实现上述功能[8]。
模块分三个阶段进行设计,其工作流程图如图3所示。
图3 模块工作流程图
(1)安装阶段
在模块安装阶段,我们首先对环境变量进行初始化,然后查找系统调用列表sys_call_table[]的基地址并记录系统调用服务例程(如 sys_open,sys_close,sys_read,sys_write等)的入口地址,接着将sys_open函数的入口指针替换成我们自己的函数指针(my_sys_open)。
(2)操作阶段
初始化完成后,这时会执行我们自己的函数my_sys_open。我们知道,文件被打开的方式一般有以下三种模式:O_RDONLY/O_WRONLY/O_RDWR,根据这三种打开方式,my_sys_open函数会决定将生成的文件访问日志记录添加到read_log.txt中还是write_log.txt中。
当文件以O_WRONLY或O_RDWR方式被打开时,系统首先会对该文件进行拷贝以生成备份文件(名称格式为BAK_文件名_系统时间,用于后期文件的恢复),然后会在write_log.txt日志文件中添加一条包含有用户ID、当前系统时间以及原始文件名信息的记录。例如原始文件名为“abc.txt”,当前系统时间为2014 年8月8日23点56分22秒,用户的ID为001200,则生成的备份文件名为BAK_abc_20140808235622.txt,并在writelog.txt日志文件中生成以下记录:001200#20140808235622#abc.txt。
当文件以O_RDONLY方式被打开时,则会在read_log.txt文件中添加如下记录:001200#201408 08235622#abc.txt。
(3)模块卸载阶段
在移除文件访问日志模块时,需要将my_sys_open的地址和sys_open现在的地址进行对比,如果相同,则复位旧系统调用 (使用sys_open的原始地址来替代现在的sys_open地址)。如果两个地址不同,则表明系统调用列表的完整性已遭到破坏,内核处于不稳定状态,此时会给用户发出相关信息告警。
(1)模块的初始化函数init_module()
//查找sys_call_table[]的基地址
(2)监控函数my_sys_open()
//如果文件以只读或可读写方式被打开
当非法用户进入系统并尝试修改文件时,必须在第一时间通知到管理员,因此,我们又设计了一个短信报警平台,当writelog.txt文件发生变化时,系统会通过中国移动MAS发送告警短信给管理员的手机,管理员及时对文件进行恢复,尽可能减少损失。
短信报警平台主要包括三个模块:状态采集模块、分析模块以及短信发送模块。状态采集模块定时读取writelog.txt文件状态信息,分析模块将当前文件状态跟前一时间节点的文件状态进行对比分析,如发生改变则触发短信发送模块。
//以下是函数声明
//该函数的第一个参数是短信服务器部署的 IP地址,第二个参数是端口号
//该函数中phone:手机号码的数组,n:手机号码的数量,msg:要发送的消息
//下面是关键代码
短信报警平台的发送界面设计如图4所示。
图4 短信发送界面
可以给多人(分组)发送报警短信,可以定时发送信息,也可以当触发条件满足时立即发送短信。
我们的测试环境如下:
●软件平台:
操作系统:RedHat 4.1.2-44
Linux内核版本:2.6.18-128.el5PAE
●硬件平台:
CPU:16 Intel Xeon CPU E7430@2.13GHz
内存:32G
硬盘:600G
所测试的文件大小为2M,路径深度为2。
主要测试对服务请求 (如open、close、read、write、create、link等)的系统处理时间,通过对系统加载模块前后同一种操作请求处理的响应时间值进行比较,得到的测试结果如下:
表1 几种典型系统调用的处理时间对比
由测试结果可知,加载模块后不同系统调用的系统响应时间均稍有增加,但小于20%,属于可容忍范围。
Linux是服务器操作系统中最常用的操作系统,因为其拥有高性能、高扩展性、高安全性,受到了越来越多人的追捧。但是针对Linux服务器操作系统的安全事件也非常多。本文在深入研究LKM和Hook技术的基础上,设计了一个能够在非法用户访问或修改文件时自动生成日志记录信息模块,该模块适用于监管长期稳定运行、配置较少需要改动的Linux服务器系统,在上述工作的基础上又设计了一个短信报警平台,当write_log.txt日志文件发生改变时,可以通过移动网关第一时间发送报警信息到管理人员的移动终端上。后期我们将继续改进我们的模块,增加对新增文件和删除文件的监控功能,此外,会进一步优化我们的设计,以提高系统的性能。
[1]Bovet D P,Cesati M.Understanding the Linux kernel[M].O'Reilly Media,Inc.,2005.
[2]Hildebrand D.An Architectural overview of QNX[C].USENIX Workshop on Microkernels and Other Kernel Architectures.1992:113-126.
[3]Degoyeneche J M,Desousa E A F.Loadable Kernel Modules[J].IEEE Software,1998,15(1):65-71.
[4]罗宇,邹鹏,邓胜兰.操作系统[M].电子工业出版社,2011.
[5]张丽芬,刘美华.操作系统原理教程[M].电子工业出版社,2013.
[6]吴国伟,李莹,姚琳.Linux内核分析与高级教程[M].清华大学出版社,2012.
[7]Parker S.Shell Scripting:Expert Recipes for Linux,Bash and more[M].John Wiley&Sons,2011.
[8]Pratik A.Linux Kernel Module for Security Enhancement[M].ProQuest,2007.
[9]Corbet J,Rubini A,Kroah-Hartman G.Linux device drivers[M].O'Reilly Media,Inc.,2005.
[10]Rajagopalan M,Hiltunen M,Jim T,et al.System call monitoring using authenticated system calls[J].Dependable and Secure Computing,IEEE Transactions on,2006,3(3):216-229.
[11]Matthew N,Stones R.Beginning linux programming[M].John Wiley&Sons,2011.
Hook Function;Security Module;System Call;SMS Alarm
Research on Log Module of Linux File Access Based on Hook Mechanism
LI Xiao-li1,LI Xiao-hong2
(1.Modern Education Technology Center,Nantong University,Nantong 226000;2.College of Computer Science,Wuhan University,Wuhan 430072)
国家自然科学基金资助项目(No.61373169)、南通大学自然科学基金资助项目(No.12Z057、No.12Z042)
1007-1423(2015)30-0059-06
10.3969/j.issn.1007-1423.2015.30.017
2015-09-15
2015-09-30
针对目前Linux系统安全审计方面的不足,设计一个文件访问日志记录模块,当入侵者通过某用户账户进入Linux服务器系统并尝试修改文件时,系统会自动生成包含用户信息的日志记录文件,通过该日志文件,可以定位该用户。实验测试结果表明我们的模块是可行的,可以用于系统文件访问的安全审计。在此基础上进一步设计一个短信报警平台,当日志记录文件发生变化时,可以第一时间给管理员发送短信以挽回损失。
钩子函数;安全模块;系统调用;短信报警
李晓丽,硕士,高级实验师,研究方向为信息安全
李小红,博士,副教授,主要研究方向为算法与设计
In view of the current problems of Linux system security audit,designs a file access logging module.When an intruder enters the Linux server system through a user account and tries to modify the file,the system will generate a log file containing the user's information automatically.Through the log file,we can locate the user.Experimental results show that our module is feasible.It can be used for security audit of system file access.On this basis,designs a SMS alarm platform.When the log file is changed,the system will send a message to the administrator and recover the loss in the first time.