版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一种基于kpabes的内核非控制数据攻击检测方法
0基于内核调试和在线检测方法随着计算机在人们生活中的广泛应用,特洛伊木马、恶意软件、蠕虫和各种计算机病毒不断对计算机系统的攻击模式进行了排名,计算机系统的安全性受到了前所未有的严重威胁,受到了人们的越来越多的关注。计算机系统安全的前提基础是操作系统的安全,没有操作系统的安全,那么一切安全都是空谈。而对于操作系统来说,内核的安全是重中之重,只有在稳定、健壮、安全的内核基础之上,我们的应用程序、驱动程序等其它依赖内核的功能模块才能可靠运行。近期的研究表明,内核遭受的各类恶意攻击越来越多,其中最主要的是Rootkit类攻击,包括内核控制数据攻击和内核非控制数据攻击。长期以来,安全人员主要侧重于内核控制数据攻击,这类攻击一般通过修改系统调用表、跳转表、函数指针等使系统转向执行攻击者精心设计的恶意代码。当前,针对内核控制数据攻击的有效防御方法包括采用CPU保护机制的SMAP为此,本文的主要工作和贡献是,提出一种轻量级的基于Kprobes内核调试机制和监视器内核线程的在线检测方法。一方面,基于Kprobes内核调试机制,在内核关键函数或系统调用的入口、出口甚至中间某些特定位置设定探测点,插入关于相关内核数据结构的记录操作和一致性验证的代码段。另一方面,创建系统启动初始化数据的备份,设立监视器内核线程kverifyd,周期性检查内核中具有不变性的静态数据是否发生过修改,如果发生变化,则及时恢复。验证实验表明,该方法能够及时并有效地发现可疑的非控制数据攻击,同时给安全人员提供了一种可以借鉴和可扩展性的检测模型。1非控制类关键数据内核非控制数据攻击通过修改内核中的一些关键数据来达到隐藏攻击痕迹和诱发内核紊乱的目的。当前的操作系统内核管理着成千上万的非控制数据结构,亦即那些不影响程序执行流程的数据,且其中很多数据结构(如链表、哈希表、指针变量等)的取值或状态正确与否直接关系到内核的安全与稳定。内核非控制数据攻击主要修改的就是这些非控制类关键数据。Riley常见的内核非控制数据攻击流程(如图1所示)一般如下:攻击者通过扫描内核符号表/proc/kallsyms获取欲攻击数据结构的入口参照地址(对于文件隐藏而言,指磁盘高速缓存数组bh_lrus;对于进程隐藏而言,指进程的pid哈希表;对于SELinux失效攻击而言,指安全操作指针security_ops和default_security_ops)。此处的欲攻击数据结构的入口参照地址是一个虚拟地址,通过自编地址转换函数将其转换成对应的内存物理地址。非控制数据结构的具体篡改一般基于内存映像文件/dev/mem来进行,后者是文件系统中用于访问内存的接口文件,把文件指针调整为欲修改数据结构所对应的物理地址,就可修改对应数据取值和实现攻击目的。本文主要讨论进程隐藏、文件隐藏、SELinux失效和资源消耗型等四类内核非控制数据攻击相关研究表明,在内核安全防护中,必须加强防范非控制数据攻击,以防止攻击者修改非控制数据和扰乱系统内核。2在线检测方法自Linux操作系统面世以来,Linux内核的代码量和复杂程度不断增加,其内核数据结构的分析亦日渐困难。相对于内核控制数据而言,内核非控制数据本身的变化规律更难把握,且无法用分析控制数据的方法来分析非控制数据。为降低内核非控制数据分析的难度和提高其在线检测分析的可行性,本文试图构建根据数据动/静态特性采取不同分析检测机制的解决方案,也就是基于Kprobes内核调试机制和监视器内核线程的在线检测方法(如图2所示)。前者用于监控内核关键函数的执行和检查相关动态数据的一致性,后者则通过设立专门的内核线程来实现静态内核数据的持续检测和不变性验证。本文实验原型KNCDefender是基于Ubuntu10.04LTSLinux2.6.32.27内核版本、gcc4.4.3及C语言开发完成的。加载启用在线检测模块KNCDefender之后,其首先初始化检测用基础数据(包括内核非控制动态数据和内核非控制静态数据)。接下来,便进入内核非控制数据的在线分析及攻击检测循环。对于动态变化性质的数据结构,利用注册Kprobes钩子函数的方式来监控内核关键函数的执行,检查相关联数据结构之间的一致性。对于静态不变性质的内核非控制数据(如各物理内存区的页面数阈值pages_low,pages_min,pages_high等),设立监视器内核线程监控它们的变化情况,一旦发现异常变化,则及时计算和恢复到正确状态。相关监视及检测分析结果应实时同步输出到用户层,即写入klogd日志系统中。同时,在原型实现时,把相关操作函数执行不频繁的某些动态数据的一致性检查功能也放到了监视器内核线程中。2.1内核数据分析的基本方法(1)在运行过程中,数据结构和分量取值之间的相关操作容易发生转变内核中的动态数据结构数量庞大,但就类型来说,主要包括链表、哈希表、内核先进先出队列、映射、红黑树等。在内核的运行过程中,一些数据结构取值或其所含分量取值伴随有关操作经常会发生变化。分析相关动态数据结构之间所维持的一致性,就是利用Kprobes内核调试机制在引发数据变化的操作函数的特定位置设置探测点,使更新对应检测用基础数据之后,接着比较相关联的所有数据结构的内容,若出现不一致的情况,则可判断为可疑攻击或潜在威胁。(2)动态相关变量的选取对于内核中的静态数据结构,主要是一些自内核启动以后保持不变的简单变量。要想对它们重新赋值和并使之生效,往往需要重启系统内核。一般情况下,这些变量的取值在内核运行过程中应保持不变,且它们对内核具有较大的影响作用。譬如前面提到的关于各物理内存区的页面数阈值的三个变量便是典型的静态性内核非控制数据变量。对于此类变量需在攻击检测模块启动初始化时就设法收集它们的初始取值,并在监视器内核线程中定期比较相关变量的当前取值与初始取值。若有不同,便可判断为可疑攻击或潜在威胁。2.2kretprobe介绍Kprobes内核调试机制在Linux2.6内核以后引入,用于动态调试内核和收集内核信息。其由Dprobe项目派生而来,是一种轻量级的非破坏性工具,可用来监控内核中的任何函数、被执行指令以及一些异步事件。Kprobes内核调试机制实现了三种类型的探测点(即kprobe、jprobe、kretprobe)。kprobe探测点可以设置在任何指令位置,对应注册方法为register_kprobe(structkprobe*kp)。jprobe探测点一般设置在函数的入口处,以方便访问函数的参数,对应注册方法是register_jprobe(structjprobe*jp)。kretprobe又称返回式kprobe,顾名思义,就是在函数返回处设置探测点,从而在函数返回之前进行探测处理,对应注册方法是register_kretprobe(structkretprobe*rp)。其中jprobe和kretprobe均是对kprobe的封装和特殊化处理,对应使用方法和工作原理都与kprobe类似。作为Kprobes内核调试机制的核心和基础,kprobe所涉关键数据结构定义如下:就kprobe探测(其工作机理如图3所示)而言,首先应选定被监视或跟踪的函数的特定位置设置探测点,备份探测点处原指令、注册kprobe结构,进而利用系统内核的异步工作方式在相应中断的notifier_call_chain中注册对应处理函数,并用int3中断指令来替代探测点处原指令。在系统内核运行过程中,当CPU执行到探测点时,引发int3中断。在保存CPU寄存器内容及现场信息之后,执行3#中断处理函数及其notifier_call_chain中注册的所有notifier函数(即pre_handler函数指针所指向的函数)。然后单步执行先前备份的探测点处原指令,执行结束后并引发调试异常和int1中断,执行对应中断处理操作及post_handler函数指针所指向的函数。其整个过程都是禁止抢占和关中断的,最终返回探测点处并从对应下一条指令起继续执行。Kprobes内核调试机制是本文内核非控制数据攻击在线检测框架的核心所在。通过在动态数据操作函数特定位置设置和注册探测点,使内核执行到相关探测点时,顺次调用精心设计的内核数据分析处理函数,从而实现相关联内核数据结构间一致性的检查验证。2.3内核线程的创建线程是现代操作系统为了降低调度开销和提高多处理器运行效率而建立的新概念。对于Linux操作系统来说,线程与进程并没有太大的区别,线程被看作是共享进程地址空间的进程,内核同样为它们分配进程控制块(structtask_struct),只不过其内存地址指针(mm)为NULL。在Linux内核中,有时需要执行一些后台操作,且这种任务通常使用只存在于内核空间和独立运行于内核空间的进程,即内核线程来完成。内核线程具有轻量型特点,同普通进程一样参与调度和抢占处理。常见的内核线程有页交换线程Kswapd、中断线程Ksoftirqd等。需要指出的是,内核线程只可以由其它内核线程创建,且所有内核线程都源自于系统的kthreadd内核进程。就本文内核非控制数据攻击在线检测方法而言,通过创建内核线程kverifyd来担当内核数据不变性分析的监视器,周期性进行相应数据结构内容或取值的比较,同时与Kprobes内核调试机制协同工作,从而最终实现内核非控制数据攻击所引发的不一致性或异常变化的检测。监视器内核线程实现伪代码如下所示:3在线攻击检测实验为检验上述在线检测方法及KNCDefender原型的有效性,本文针对Linux2.6.32.27内核进行了包括进程隐藏、文件隐藏、SELinux失效攻击、资源消耗型等内核非控制数据攻击在内的一系列在线检测验证实验。3.1进程哈希表和进程链表的一致性就Linux内核进程管理而言,进程哈希表用于快速查找指定进程,而进程链表则是由0号进程开始的所有存活进程连接在一起形成的链表。对于Linux进程调度来说,首先基于CFS公平调度算法从进程链表中选取合适的进程,构建起用红黑树来组织的可运行进程队列,然后再从其中挑选出合适的进程分配处理器和加以执行。进程隐藏攻击原理是将恶意进程从进程哈希表中移除,但由于其依然保留在进程链表中,所以,尽管利用进程查看操作无法显示被隐藏的恶意进程,但当CFS调度时,恶意进程仍然能够被调度和执行。关于进程隐藏的在线检测,我们利用Kprobes内核调试机制监视进程的创建、消亡及相关数据结构,同时在监视器内核线程kverifyd中分析进程哈希表和进程链表的一致性。具体而言,分别利用kretprobe、kprobe来监视进程创建时拷贝函数copy_process和进程退出函数do_exit的执行,并且同步更新进程检测用数据结构LIST_HEAD(cur_list)链表(其用于记录当前内核所管理的所有进程)。不言而喻,其间主要设置了两个探测点,相关结构体变量定义如下:监视器内核线程kverifyd调用is_hlist_exist(proc->pid)来分析判断是否每个存活进程(包括处于运行和睡眠状态的所有进程)都在进程哈希表中。若发现不在进程哈希表中的进程,则判断为隐藏进程,并立即将其终止,同时记入系统内核日志,以方便通过cat/proc/kmsg内核日志输出操作看到相应分析处理结果。进程隐藏攻击与检测示例如图4所示。其中,使用包含死循环的程序malware.o来模拟恶意程序,进程隐藏攻击试图隐藏该恶意程序和使其从进程列表中消失。当恶意程序malware.o启动执行且进程隐藏攻击还未奏效时,可以在进程列表中看到进程号为9696的恶意程序malware.o(参图4①)。而当发动进程隐藏攻击、指定进程号、使恶意进程malware.o隐藏之后,可以看到恶意程序已经不在进程显示列表中了(参图4②)。但此时我们依然可以从恶意程序启动执行终端发现其还在运行、并不断输出“I’mamalware”(参图4③)。启动运行本文非控制数据攻击在线检测模块KNCDefender,能够发现内核进程哈希表和进程链表的不一致性,找到可疑的9696号隐藏进程并发送SIGKILL信号终止其运行(参图4④⑤所示)。3.2selindshet-seinx安全检测Linux安全模块(LSM)框架支持SELinux、apparmor、smack等访问决策模块。每个访问决策模块都是通过xxx_init()调用register_security()函数向LSM框架加以注册的。一旦注册成功,即可实施相应的访问控制决策操作。但如果注册时已有其它安全模块注册生效,则本次注册失败。换句话说,只有等前一个安全访问决策模块卸载之后,才可以加载下一个安全访问决策模块。Linux安全模块提供了两类对安全钩子函数的调用,一类用于管理内核对象的安全域,另一类用于仲裁对这些内核对象的访问控制。对安全钩子函数的调用具体根据由全局变量security_ops所指向的安全操作结构体中的函数指针(即钩子)的设置来实现。注册安全模块实际上就是将security_ops安全操作指针指向对应安全访问决策模块的安全操作实现函数。SELinux失效攻击的原理是,在SELinux已经注册加载的情况下,将security_ops指针指向default_security_ops结构体变量(许多Linux系统启动时default_security_ops并未设定为支持SELinux访问控制策略),从而迫使系统无法实施SELinux安全策略及访问控制决策,当然也无法进行SELinux的permissive模式和enforcing模式之间的切换。为此,内核非控制数据攻击在线检测方案及KNCDefender原型在监控内核启动加载的一开始,便须获取security_ops的初值,并将其保存在检测模块基础数据结构,即structlsm_statuscurrent_lsm结构变量中。系统运行过程中,利用监视器内核线程kverifyd定时检查security_ops所指向的访问决策模块,并与检测模块中保存的访问决策模块相关信息进行比较,若二者不一致,即若security_ops指向default_security_ops,但内核启动时已经加载了SELinux安全模块,则说明其间发生了SELinux失效攻击。SELinux失效攻击的整个过程如图5所示。执行攻击程序attack-selinux.py的前后,我们可以发现SELinux执行模式切换、文件安全属性显示等SELinux安全相关操作结果明显不同。在本文内核非控制数据攻击在线检测原型KNC-Defender启动运行的情况下,SELinux失效攻击会被及时发现和安全处理(如图6所示)。图6中①表示攻击前后文件安全属性对比,并没有发生变化。这是因为KNCDefender在线检测模块在kverifyd监视器中通过执行SELinux失效攻击检查,及时发现了不一致性情况,并通过修复security_ops相关函数指针使其指向自内核启动以来所加载的SELinux访问决策模块(如图6中②所示)。3.3目录微观结构攻击者经常会隐匿它们在系统中留下的踪迹或后门,从而方便其以后可以继续窃取用户信息或开展破坏系统的其他攻击,其间不少踪迹和后门都体现为恶意程序文件。显然,如果用户因此不能及时发现或者根本就发现不了被隐藏的恶意程序相关文件,那造成的安全后果是很严重的。内核非控制数据攻击中的文件隐藏,就是采取某种处理措施使得攻击者在系统中留下的恶意文件对于用户(如使用ls-a和find命令时)是不可见的,但是它们客观存在、可以被攻击者访问和加以利用。一般而言,文件隐藏的第一步,就是读取被隐藏文件所在的目录,使内存的磁盘高速缓存的块缓冲中载入被隐藏文件所在目录的内容,也就是该目录下的所有文件的目录项。对于ext2文件系统来说,其目录微观结构如图7所示。就Linux文件访问而言,为了提高系统性能,通常会维护一个磁盘高速缓存指针数组bh_lrus在本文内核非控制数据攻击在线检测方法及原型KNCDefender中,试图监控目录项读取函数vfs_readdir()的执行过程,利用Kprobes内核调试机制中的jprobe在该函数入口处设置探测点,以获取当前目录的目录项结构dentry及父、子目录项链表。实际读取目录时,bh_lrus[0]指向了该目录的缓冲区头部,从而可以直接获取该目录的内容。通过比较该目录文件内容和父子链表的一致性,便可确认被隐藏的文件。需要特别指出的是,正常的文件删除也会采用和文件隐藏一样的策略来覆盖目录项,但其同时会把文件的目录项对象结构dentry链接到超级块的孤儿链表中。因此,若出现对应目录项对象dentry的父子链表中存在某个文件,而该文件不在块缓冲中且不存在于孤儿链表中,则可判断出现了文件隐藏攻击。文件隐藏攻击示例如图8所示。执行文件隐藏程序attack-filehide.py,将需要隐藏的恶意程序配置文件malware.cfg隐藏,可以发现该文件用ls-a和ls命令操作是无法显示出来的,但通过指定文件路径名依然可以找到并可以访问。采用本文内核非控制数据攻击在线检测方法及KNCDefender原型(如图9所示),可以检查发现被隐藏文件并在内核日志中输出相关信息。于是,在终端上通过dmesg|grep’Hidden’–rn过滤内核日志输出结果,可以找到对应被隐藏文件malware.cfg及相应索引结点号的检查确认信息。3.4资源消耗性攻击操作系统内存管理子系统为了满足系统内核和用户程序的正常运行,总是试图确保内存始终拥有足够多的空闲空间。为此,它采用内存平衡算法及各物理内存区的页面数阈值(pages_low,pages_min,pages_high)来估计内存分配的压力。当相应类型物理内存的可用空闲页面数低于pages_low时,内存管理子系统启动异步模式的内外存对换过程,开始将一些无用的内存页换出到外存,并一直持续到内存中可用空闲页面数达到pages_high的水平。而如果可用的空闲页面数低于pages_min时,内存管理子系统将启动同步模式的内外存对换过程。资源消耗性攻击的原理是,恶意主动调整这三个阈值,将它们设定到接近于甚至超过对应类型物理内存的页面总数,而由于当前可用空闲页数量低于页面总数,这样势必强迫内存管理子系统启动内外存对换操作,并造成了系统内存严重短缺的假象。对于本文提出的内核非控制数据攻击在线检测方法,在内核启动加载伊始,便收集获取到各物理内存区(通常即DMA、Normal、HighMem)的这三个阈值,并存放到检测用数据结构数组structzone_statuszones一旦发生资源消耗型攻击,将造成内存紧张假象,从而使页交换线程kswapd被频繁调度、内外存对换不断发生、交换分区的使用率急剧上升(从0%变为7.7%)。此时,文件操作相关的各种性能指标如文件拷贝、压缩、模块编译时间开销等亦大幅度增加(如图10所示)。之后,系统出现卡顿甚至严重影响相关操作。运用本文内核非控制数据攻击在线检测对应原型KNCDefender的情况下,其能够及时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度年福建省高校教师资格证之高等教育心理学强化训练试卷A卷附答案
- 2024年度山西省高校教师资格证之高等教育法规模拟考试试卷B卷含答案
- 2024年家具成套生产线项目资金申请报告代可行性研究报告
- 2024年-2025年《农作物生产技术》综合知识考试题库及答案
- 2024专项产品线唯一供货商协议
- 儿童教育服务协议:2024定制
- 2024照明系统仓库安装协议条款
- 2024工程总承包深度合作协议
- 2024年赔偿问题解决协议模板
- 安全生产管理员的职责与权益明细协议
- 设备维保施工组织设计
- 医院出入口安检工作记录表范本
- 《军事理论与军事技能》课程标准
- 仪器设备□检定□校准确认表
- 妇科VTE防治小组成员及职责
- 安徽壹石通化学科技有限公司年产5万吨氢氧化镁、5万吨碱式碳酸镁、1万吨氧化锆、1000吨硼酸锌、1000吨五硼酸铵和100吨钛酸钡产品项目环境影响报告书
- VASP自旋轨道耦合计算错误汇总
- 唐朝服饰专题知识
- (完整)劳动关系转移三方协议
- GB/T 16907-1997离心泵技术条件(I类)
- GB 4789.15-2016食品安全国家标准食品微生物学检验霉菌和酵母计数
评论
0/150
提交评论