(计算机系统结构专业论文)基于虚拟机的反rootkit技术研究.pdf_第1页
(计算机系统结构专业论文)基于虚拟机的反rootkit技术研究.pdf_第2页
(计算机系统结构专业论文)基于虚拟机的反rootkit技术研究.pdf_第3页
(计算机系统结构专业论文)基于虚拟机的反rootkit技术研究.pdf_第4页
(计算机系统结构专业论文)基于虚拟机的反rootkit技术研究.pdf_第5页
已阅读5页,还剩61页未读 继续免费阅读

(计算机系统结构专业论文)基于虚拟机的反rootkit技术研究.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 摘要 r o o t k i t 是黑客成功入侵系统后用来保持系统的超级用户权限并隐藏痕迹的一 种工具。根据r o o t l d t 运行的层次可以分为应用层r o o t k i t 和内核级r o o t k i t 。 目前,对应用层的r o o t k i t 检测技术已经比较成熟,但还没有能够很好的反击 内核级r o o t k i t 的工具。主要原因在于内核级r o o t k i t 拥有的权限和反r o o t k i t 模块 能取得的权限一样高。 本文先分析了内核级r o o t k i t 的攻击原理,然后基于反r o o t k i t 模块权限比内核 级r o o t k i t 高这一个原则,本文在i g u e s t 虚拟机中设计与实现了针对l i n u x 操作系 统内核的反r o o t k i t 模块。在此模块中实现了这样的访问控制机n - 除来自可信任的操作系统核心代码段的代码外,来自其它地方的代码不允许 对客户机内核被保护内存区域写操作; 除来自可信任的操作系统核心代码段的代码外,来自其它地方的代码不允许 对虚拟出来的被监控的客户机的特权寄存器写操作; 被保护或者说被监控的内存部分包括客户机操作系统核心内核的代码段、内 核的只读数据段、异常表段以及重要的会成为r o o t k i t 攻击目标的全局数据: 被保护的或者说被监控的寄存器目前包括i d t r 、g d t r 、 s y s e n t e re i pm s r 和调试寄存器等 我们通过清除被保护内存区域的影子页表中的 位实现对内存区 域的写保护,通过截获特权寄存器写操作的 _pa实g现e_对rwhypercall 寄存器的写保护。 实验结果表明,本文实现的原型系统在反l i n u x 2 6 内核的r o o t k i t 上有良好表 现而仅仅损失了些许性能。 关键词:r o o t k i t 虚拟机虚拟机监控器l g u e s tl i n u x 内核 a b s t r a c t r o o t k i t sa r et o o l su s e db yh a c k e r st om a n t a i nr o o ta c c e s st ot h es y s t e ma n d c o n d u c tm a l i c i o u sa c t i v i t i e sa f t e rc r a c k i n gac o m p u t e rs y s t e m r o o t k i t sc a nb e c l a s s i f i e di n t oa p p l i c a t i o nl e v e lr o o t k i t sa n dk e r n e ll e v e lr o o t k i t sa c c o r d i n gt ot h e r u n n i n gl e v e l c u r r e n t l y , t h et e c h n o l o g yo fd e t e c t i n gt h ea p p l i c a t i o nl e v e lr o o t k i t si su s e a b l e ,b u t t h e r ei sn ot o o l sc a ne x c e l l e n t l yd e f e n s ek e n e ll e v e lr o o t k i t s t h em a i nr e a s o ni st h a t t h ep r i v i l e g eo fk e m e l1 e v e lr o o t k i t si st h es a n l ea st h ea n t i - r o o t k i t s i nt h i sp a p e r , w ef i r s ta n a l y z et h em e c h n i s mu s e db yk e r n e ll e v e lr o o t k i t s w e d e s i g na n di m p l e m e n taa n t i r o o t k i tm o d u l ei nl g u e s tt a r g e t e do nl i n u xk e r n e ll e v e l r o o t k i t s t h em o d u l e sp o l i c ya r e : o n l yt h ec o d ef r o m t e x to fk e r n e l m e m o r yr e g i o np r o t e c t e db yt h em o d u l e c o r ec a np e r f o r mt h ew r i t eo p e r a t i o nt o o n l yt h ec o d ef r o m t e x to fk e r n e lc o r ec a n p r i v i l e g e dr e g i s t e r s t h ep r o t e c t e dm e m o r yr e g i o n sa r em a d e e x t a b l ea n do t h e ri m p o r t a n tg l o b a ld a t a p e r f o r mt h ew r i t eo p e r a t i o nt ov i r t u a l u po f t e x to fk e r n e lc o r e ,r o d a t a , t h e p r o t e c t e dp r i v i l e g e dr e g i s t e r s a r em a d eu po fi d t r , g d t r s y s e n t e r e i p m s re t c o u rp r o t o t y p ea c h e i v et h eg o a lo fw r i t ep r o t e c t i o nt op r o t e c t e dm e m o r yb y c l e a r i n gt h e p a g er wb i to ft h es h a d d o wp a g et a b l eo fp r o t e c t e dm e m o r y o u r p r o t o t y p ea c h e i v et h eg o a l o fw r i t ep r o t e c t i o np r i v i i e g e dr e g i s t e r sb yh o o kt h e h y p e r c a l lo f t h ew r i t eo p e r a t i o nt op r i v i l e g e dr e g i s t e r s t h er e s u l to fe x p e r i m e n t ss h o wt h a to u rs y s t e mc a na c h e i v et h eg o a l o f a n t i - r o o t k i t sa tal i r l ep e r f o r m a n c ec o s t k e y w o r d s :r o o t k i t ;v i r t u a lm a c h i n e ;v i r t u a lm a c h i n em o n i t o r ;l g u e s t ;l i n u xk e r n e l i i 插图目录 插图目录 图2 1 系统调用在操作系统中位置5 图2 2 系统调用流程示意7 图3 1 修改系统调用表。15 图3 2 重定向系统调用表1 6 图3 3 被攻击后的系统调用入口函数流程2 0 图3 4 直接修改系统调用服务函数j 2 2 图3 。5e x c e p t i o nt a b l e 2 5 图3 6x 8 6 处理器中调试寄存器:3 0 图4 1 系统原型整体框架3 9 图4 2 内核进程堆栈。4 2 图4 3 函数调用栈帧4 5 图5 1c a l l t r a c e 算法优化前后所耗时间对比:5 0 图5 2 打开c o n f i gf r a m ep o i n t e r 与否内核体积比较5 3 v i 表格目录 表格目录 表5 1 原型系统反r o o t k i t 攻击实验4 9 表5 2 主机上内核选项c o n f i gf r a m ep o i n t e r 打开与否性能测试5 2 表5 3 原l g u e s t 与原型系统性能测试对比5 3 v i i 中国科学技术大学学位论文原创性声明 本人声明所呈交的学位论文,是本人在导师指导下进行研究工作所取得的 成果。除已特别加以标注和致谢的地方外,论文中不包含任何他人已经发表或 撰写过的研究成果。与我一同工作的同志对本研究所做的贡献均已在论文中作 了明确的说明。 作者签名:琴臣乏主。j i 7 够 签字日期: 芈 中国科学技术大学学位论文授权使用声明 作为申请学位的条件之一,学位论文著作权拥有者授权中国科学技术大学 拥有学位论文的部分使用权,即:学校有权按有关规定向国家有关部门或机构 送交论文的复印件和电子版,允许论文被查阅和借阅,可以将学位论文编入有 关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编学位论 文。本人提交的电子文档的内容和纸质论文的内容相一致。 保密的学位论文在解密后也遵守此规定。 幺开口保密( 年) 作者签名:趣兰垒随 导师签名: 签字日期:签字日期: 弘争也 第1 章绪论 第1 章绪论 1 。1 研究背景 1 1 1r o o t k i t 定义 计算机系统攻击者的目的不仅仅在于获得系统的非授权最高访问权限,还在 于保持对目标系统的这种非授权权限。r o o t k i t 就是这样一种用来保持对目标系统 最高访问权限的工具。 r o o k i t 是安全领域的一个术语来自r o o t 和k i t 两个单词的组合,其中r o o t 意 思是类u n i x 系统中最高访问权限,虹t 意思是一系列用来保持非授权r o o t 访问权 限而不引起警觉的程序。n s a 安全与入侵检测术语字典( n s ag l o s s a r yo ft e r m s u s e di ns e c u r i t ya n di n t r u s i o nd e t e c t i o n ) 把r o o t k i t 定义如下【1 】:r o o t k i t 是一套给入 侵者提供后门,收集同一网络上其他主机信息并能掩盖系统已经被入侵事实的工 具集合。w i k i p e d i a 则如下定义r o o t k i t :r o o t k i t 是攻击者在入侵系统后用来保持 对系统的超级用户访问权限,创建后门和隐藏攻击痕迹等常采用的一种技术【2 】。 r o o t k i t 和其它恶意程序例如利用漏洞获得最高访闯权限的攻击程序、蠕虫、 病毒等是有区别的,它们主要有如下不同:它们的目标是不一样的。r o o k i t 通常 是在系统已经被攻破时使用,其目标是保持最高访问权限而不引起系统的用户或 管理员警觉。而蠕虫病毒之类的恶意程序目标是利用漏洞攻击进入系统。 1 1 2r o o t k i t 发展历史 文献记载的最早的r o o t k i t 出现在1 9 9 4 年,主要攻击u n i x 操作系统,特别是 s u n o s 4 x 。那时的r o o t k i t 主要替换l o g i n 等系统工具,方便用户再次登录系统。 记录最早的l i n u x 上的r o o t k i t 出现在1 9 9 4 年1 0 月。它主要替换l o g i n 、p s 和n e t s t a t 等系统工具,可以隐藏网络连接和进程,为应用级r o o t k i t 。 l i n u x 上的内核级r o o t k i t 最早出现在1 9 9 7 年,从那以后内核级r o o t k i t 常用 方法用可加载内核模块来替换系统调用。 第一个已知的w i n d o w s 平台上的r o o t k i t 是w w w r o o t k i t c o r n 网站的创始人 g r e gh o g l u n d 在1 9 9 9 年发布的“n t r o o t k i t ” 3 】,它可以隐藏注册表项和重定向 可执行程序。 现在几乎所有的操作系统( 包括l i n u x 、b s d 、s o l a r i s 、w i n d o w s 等) 都受 到r o o t k i t 的攻击。由于l i n u x 的开源和广泛使用,使得它成为r o o t k i t 攻击的主 要目标之。r o o t k i t 的攻击方法也越来越高明,从刚开始的替换系统应用程序和系 统库,深入到攻击操作系统内核。 1 第1 章绪论 1 2 研究现状 1 2 1 反r o o t k i t 现状 r o o t k i t 按其运行的权限不同可以分为应用层r o o t k i t 和内核级r o o t k i t 。应用层 r o o t k i t 主要是通过修改或替换系统工具或者系统库来达到其攻击目标,有的应用 层r o o t k i t 还会修改替换了的系统工具和系统库的最后修改时间更具一定的欺骗 性。目前对应用层r o o t k i t 检测技术已经达到了非常成熟的水平,主要检测手法 是文件的完整性检查法:新系统安装完毕后通过这类工具获得并保存系统的各种 信息比如校验和、最后修改时间等等,检测的时候通过比较文件的当前信息和保 存的基准信息,如果不匹配说明攻击发生。这类工具代表者有t r i p w i r e 1 1 和 a i d e 1 2 】 内核层r o o t k i t 主要攻击内核的系统调用表、中断描述符表等等。当内核被攻 击后,其提供给应用层的信息将不可靠,因此很少有纯应用层工具能检测到内核 级r o o t k i t ,即使能检测到某些内核级r o o t k i t ,但当此r o o k i t 升级后就失效了。前 面提到的文件完整性检测工具t r i p w i r e 和a i d e 对内核级r o o t k i t 无效。只能检测 一些低版本内核级r o o t k i t 的纯应用层工具的典型代表是e h k r o o t k i t 1 3 。 目前内核级检测工具通常都是应用层和内核层或者是应用层和能结合 d e v k l m e m 设备文件比较可靠的获得内核某些信息的工具的结合,例如 k e r n _ c h e c k 1 8 、e h e c k i d t 1 4 和s t m i c h a e l 1 5 1 6 等。k e m c h e c k 主要手段是比较 各个内核符号在s y s t e m m a p 文件中的地址和系统运行时的地址:c h e c k i d t 主要通 过检查中断描述符表的完整性检测到攻击中断描述表这一特定类型r o o t k i t ; s t m i c h a e l 主要手段是验证内核关键区域如代码段和系统调用表的完整性来达到 检测目的,它截获了可加载模块的加载等系统调用( 这本身也使用了r o o t k i t 的 攻击手段) ,在每次模块加载等操作时都会触发完整性的检查操作。它还设置了 一个定时器,以固定时间间隔运行完整性检查操作。这类检查工具虽然能够检测 到一些r o o t k i t ,但如果r o o t k i t 中存在专门的代码规避它们的检测,那么检测将不 再有效,根本原因在于它们运行的最高权限和内核级r o o t k i t 的权限是一样的。 c o p i l o t 4 3 是突破此限制的一种尝试,它利用嵌入式软硬件设计方法设计了一种 额外的p c i 硬件,使用时该p c i 卡安装在被监控的主机上,该p c i 卡固定周期扫 描主机系统内存,比较预先保存内核内存和当前内核内存的m d 5 哈希值来判断 是否受到r o o t k i t 攻击。但是为检查r o o t k i t ,c o p i l o t 需要系统安装块额外的硬 件设备。 1 2 2 虚拟机与反r o o t k i t 研究 虚拟机是一个抽象的计算机,和实际的计算机样,具有一个指令集并使用 2 第1 章绪论 不同的存储区域。它负责执行指令,还要管理数据、内存和寄存器。按 1 7 1 q b 的 分法,虚拟机可以分为进程级虚拟机、高级语言虚拟机、系统虚拟机。 系统虚拟机技术通过在物理硬件上增添一层软件层虚拟出一个或多个计算 平台,这层软件层被称为虚拟监控i 搭( v i r t u a lm a c h i n em o n i t o r ) 1 7 ,有的时候也 称为h y p e r v i s o r ,如此虚拟出的系统被称为虚拟机,有时该虚拟机也被称为g u e s t 。 虚拟机都在v m m 的监控和辅助下访问底层物理硬件。因为v m m 能允许多个虚 拟机透明的复用物理机器的资源同时又能对虚拟机进行严格的监控,所以近年来 虚拟技术在系统安全领域特别是反r o o k i t 领域得到了广泛的应用。 s e c v i s o r 4 4 、n i c k l e 4 5 就是将虚拟机技术应用于反r o o t k i t 的尝试,其中 s e c v i s o r 通过保护内核代码段的完整性在一定程度上起到了反r o o t k i t 的效果,但 其不能保护内核中的重要数据。n i c k l e 通过设置对虚拟机透明的影子内存来 达到阻止r o o t k i t 的目的,但是因为它需要在v m m 中设置和虚拟机内存同等大 小的影子内存,对性能都有较大影响而且系统的内存利用率很低只有5 0 。 1 3 论文主要工作 内核级r o o t k i t 比应用层的r o o t k i t 更隐蔽更难检测,其危害性也最大。而有相 当数量的内核级r o o t k i t 攻击目标是系统调用,故而本论文先对l i n u x 系统调用机 制做了深入分析。同时相当数量的内核级r o o t k i t 是以可加载内核模块形式出现 的,故而需要详细分析l i n u x 内核的可加载内核模块机制 实现一种反r o o t k i t 系统的前提是对各种r o o t k i t 攻击原理和系统脆弱部分要有 深入的理解和研究,本论文接着分析了r o o t k i t 攻击的原理包括应用层r o o t k i t 和 内核级r o o t k i t ,着重分析了内核的脆弱性和内核级级r o o t k i t 的攻击原理 在上述基础上,本文提出一种虚拟机监控器的反r o o t k i t 系统,在i g u e s t 虚拟 机上针对l i n u x 操作系统设计并实现了其原型,并对可能存在的性能瓶颈进行了 优化并测试了优化的效果。最后利用v i r t b e n c h 测试了原型与原l g u e s t 的性能, 并做了对比和评价。 1 4 论文组织结构 全文共分为六章:其中3 、4 、5 三章是本文主体。 第2 章:l i n u x 内核系统调用与l k m 。简单介绍目前l i n u x 内核x 8 6 平台下 的两种系统调用机制:软中断i n t0 x 8 0 方式和s y s e m e r s y s c a l l 方式,再简单介 绍了l i n u x 内核下的可加载模块( l k m ) 机制。这两项与本文研究重点内核级 r o o t k i t 关系密切,在进入本文主体前深入理解和研究他们是非常必要的。 3 第1 章绪论 第3 章:r o o t k i t 攻击原理。在简要分析了应用层r o o t k i t 攻击手段之后,转向 对本文重点内核级r o o t k i t 攻击的原理分析。既分析了常见的攻击系统调用、攻 击中断描述符表、通过d e v k m e m 的攻击,也分析了目前不常见的且比较难以 检测的攻击手段诸如:攻击异常表e xt a b l e 和基于调试寄存器的攻击。 第4 章:原型系统设计与实现。基于反r o o t k i t 模块运行的权限要比r o o t k i t 运行权限高这样一个原则,在l g u e s t 虚拟机上设计与实现了针对l i n u x 内核的反 r o o t k i t 系统原型。在提出总体框架和策略后,提出被监控部分的组成:被监控的 内存区域和被监控的特权寄存器i d t r 、g d t r 和s y s e n t e re i pm s r 等,其 中被监控的内存区域又包括了内核核心部分的代码段t e x t 、异常表段e x t a b l e 、 只读数据段r o d a t a 以及本文增加的针对重点全局数据的m o n i t o r 段。接着分析了 被监控特权寄存器i d t r 、g d t r 以及s y s e n t e re i pm s r 等写保护的实现细 节,接下来分析了被监控内存保护的实现过程中需要解决的各方面的问题:l g u e s t 如何得知客户机内核被监控内存区域的地址( 本文通过增加h y p e r c a l l 来做到的) , 客户机内核进程堆栈的获取,函数调用链的获得,重要全局数据的处理,写操作 合法性的验证算法,以及被验证写操作合法后如何通过指令模拟来修正缺页异常 达到对客户机透明的目的。 第5 章:原型系统验证及性能评价与优化。首先,简单介绍了原型系统实现 的硬件和软件平台。接下来列出分析了反已有r o o t k i t 的实验结果。接着分析了 c a l l t r a c e 算法优化的原理和优化后的性能评价。最后分析了原型系统整体的性能: 因要获取函数调用链而打开的内核选项c o n f i gf r a m ep o i n t e r 对性能的 影响;原型系统在v i r t b e n c h 性能测试工具集下的性能和原l g u e s t 性能,并对实 验数据做了分析。 第6 章全文总结。对全文的工作进行了总结,归纳了本文工作的贡献、收获、 以及不足之处;并提出了进一步的研究方向。 4 第2 章l i n u x 系统调用与l i ( m 第2 章l i n u x 系统调用与l k m 2 1l i n u x 系统调用 2 1 1 系统调用概述 系统调用是操作系统提供给用户程序一组操作硬件设备请求内核服务的“特 殊 接口,位于核心层和应用层之间,用户程序可以通过这组“特殊”接口来获 得操作系统内核提供的服务。系统调用在l i n u x 操作系统中的位置如图2 1 所示: 臣三j 匦显一 内核层 图2 1 系统调用在操作系统中位置 l i n u x 内核系统调用到2 6 2 9 为止共有3 3 2 个,大致可以分为如下几类: 处理i o 请求的系统调用,比如s y s _ o p e n 、s y s r e a d 、s y s _ w r i t e 、s y s _ _ i o c t l 等等 进程管理的系统调用,比如s y s _ f o r k 、s y s _ _ k i l l 、s y s _ n i c e 、s y s _ e x e c v e 等 等 时间有关的系统调用,比如s y s _ g e a i m e o f d a y 等 内存空间管理的系统调用,比如s y s _ m m a p ,s y s _ b r k 等等 进程间通信,比如s y s _ s h m g e t 、s y s _ s i g n a l 等 x 8 6 平台上从l i n u x 2 6 开始,有两种实现系统调用的方式 1 0 】:软件中断 5 第2 章l i n u x 系统调用与l 删 i n t i r e t 指令方式和s y s e n t e r s y s e x i t 指令方式。在介绍这两种系统调用实现方式前, 本章首先介绍与系统调用有关的系统服务函数、系统调用号和系统调用表 2 1 2 系统调用服务函数、系统调用号和系统调用表 ( 1 ) 每个系统调用对应一个系统调用服务函数 9 】,服务函数以“s y s _ 开 头,后接系统调用函数名。 ( 2 ) 系统调用号用来标识应用层想调用的系统调用服务函数,每个系统调 用号都唯一对应一个系统调用。系统调用号在a r c h x 8 6 i n c l u d e a s m u n i s t d _ 3 2 h 中定义如下: # d e f i n e n r _ r e s t a r t _ s y s e a l l 0 # d e f i n e n r - _ e x i t 1 # d e f i n ej r f o r k2 ( 3 ) 系统调用表用来保存系统调用号到系统调用的映射关系 8 】,以系统调 用号为下标,那么对应系统调用表的内容就是系统调用服务函数的入口地址。目 前系统调用表定义在a r c h x 8 6 k e m e l s y s c a l l _ t a b l e _ 3 2 s 中,具有如下的格式: e n t r y ( s y s _ _ c a l l _ t a b l e ) 1 0 n gs y s r e s t a r t _ s y s c a l l 严0 一o l d ”s e t u p ( ) ”s y s t e mc a l l ,u s e df o rr e s t a r t i n g 1 1 0 n gs y s e x i t 1 0 n gs y s _ f o r k 1 0 n gs y s r e a d 1 0 n gs y s _ w r i t e 1 0 n gs y s _ _ o p e n | 嶙s | 1 0 n gs y s _ _ c l o s e 2 1 3 软件中断i n t i r e t 方式 x 8 6 有三种中断描述符,分别是任务门、中断门和陷阱门,系统调用使用的 是陷阱门。系统启动过程中: a r c h x 8 6 k e m e l h e a d3 2 s 中的s e t u p 函数设置好中断描述表idt a r c h x 8 6 k e m e l t r a p s c 中的t r a p函数调用 l y , i n i t s e t _ s y s t e r n _ t r a p _ g a t e ( s y s c a le c t o r & s y s t e m _ c a l l ) 设置好陷阱门,其中 s y s c a l lv e c t o r 为0 x 8 0 这是系统调用使用的中断号。 当用户空间程序想调用系统调用时,比如调用g e t p i d 系统调用,可以通过 6 第2 章l i n u x 系统调用与l k m 以下的代码段来完成: m o v l $ 2 0 ,e a x $ s y s c a l ln u m b e r i n t $ 0 x 8 0 $ i m p l e m e n ti n t e r r u p t l ,s a v e _ a l l , g e tt h r e a di n f o 苎+ s y 吖匆 、? 出口。泳 图2 2 系统调用流程示意 首先把g e t p i d 的系统调用号放到e a x 中,然后就用i n t 执行系统调用,以内 核态进入系统调用的总入口地址s y s t e m _ c a l l ,其定义在a r c h x 8 6 k e m e l e n t r y _ 3 2 s 中,代码如下( 略去为调试方便而加入的代码) : e n t r y ( s y s t e m _ c a l l ) p u s h l e a x 拌s a v eo r i g e a x s a v e a l l :, g e t _ j h r e a d i n f o ( e b p ) t e s t w $ ( 一t i f _ s y s c a l l _ e m u l t i f _ s y s c a l l - t r a c e i j i f s e c c o m pl _ t i f _ s y s c a l u u d i t ) ,t l f l a g s ( e b p ) j n zs y s c a l l _ _ t r a c e _ e n t r y c m p l $ ( n r _ s y s c a l l s ) ,e a x j a es y s c a l lb a d s y s 7 第2 章l i n u x 系统调用与l 跚 s y s c a l l _ c a l l : c a l l 幸s y s _ c a l l _ t a b l e ( ,e a x ,4 ) m o v l e a x ,p t _ e a x ( e s p ) 群s t o r et h er e t u r nv a l u e s y s c a l l _ e x i t : s y s t e m _ c a l l 首先将系统调用号( e a x 的值,前面我们把g e t p i d 的系统调用号2 0 放到这里面) 放到栈中,然后保存相关寄存器( s a v e _ a l l ) 。再得到s t r e e t t h r e a d i n f o 结构的指针放到e b p 中。检查s t r u c tt h r e a d _ i n f o 中的f l a g s 标志,检查 是否有系统调用跟踪等,有则跳到s y s c a l lt r a c ee n t r y 。没有就比较系统调用号是 否在有效范围内。有效就调用系统调用,最后把结果放到栈中,以返给调用者。 最后运行s y s c a l le x i t 标签处一系列代码返回用户空间。完整流程图如图2 2 所示: 2 1 4 s y s e n t e r s y s e x i t 方式 2 1 4 1s y s e n t e r l s y s e x i t 背景 在x 8 6 保护模式中,处理i n t 中断指令时,c p u 首先从中断描述符i d t 中取 出对应的中断描述符,判断中断描述符种类,检查中断描述符的级别d p l 和硫 指令调用者的级别c p l ,当c p l 将c s 的值设置为s y s e n t e rc sm s r 寄存器的值。 将e i p 的值设置为s y s e n t e re i pm s r 寄存器的值。 r 第2 章l i n u x 系统调用与l 脚 将s s 的值设置为s y s e n t e r c s m s r 寄存器的值n _ e 8 。 将e s p 的值设置为s y s e n t e r e s p m s r 寄存器的值。 r i n 9 0 代码调用s y s e x i t 指令后,硬件会做如下操作: 将c s 的值设置为s y s e n t e rc sm s r 寄存器的值加上1 6 。 将e i p 的值设置为e d x 寄存器的值。 将s s 的值设置为s y s e n t e rc s m s r 寄存器的值加上2 4 。 将e s p 的值设置为e c x 寄存器的值 其中寄存器s y s e n t e r c s m s r ,s y s e n t e r _ e i p _ m s r , s y s e n t e re s pm s r 在i n t e l 的文档中定义。他们可以通过w r m s r 指令来设置。 l i n u x 内核在a r c h x 8 6 v d s o v d s 0 3 2 s e t u p c 通过e n a b l e _ s e p _ _ c p u 函数初始化了这些 寄存器。 v o i de n a b l e _ s e p _ c p u ( v o i d ) 。 t s s - x 8 6 一t s s s s l = - l r n e l _ c s ; t s s - x 8 6 _ t s s s pl = s i z e o f ( s t r u c tt s s _ s t r u c t ) + ( u n s i g n e dl o n g ) t s s ; w r m s r ( m s r i a 3 2 _ s y s e n t e r _ c s ,r n e l - s s ,0 ) ; w r m s r ( m s r _ i a 3 2 _ s y s e n t e r _ e s p , t s s - x 8 6 _ t s s s p l ,o ) ; 。 w r m s r ( m s r _ i a 3 2 _ s ;y s e n t e r _ e i p , ( u n s i g n e dl o n g ) i a 3 2 _ s y s e n t e rt a r g e t , o ) ; ) 其中i a 3 2 _ s y s e n t e r _ t a r g e t 是s y s e n t e r 在内核空间的入c 1 函数,其流程和 s y s t e m _ c a l l 类似,不再赘述。 2 1 4 3l i n u x 内核对两种方式的支持 l i n u x 内核为了同时支持软件中断i n t i r e t 方式和s y s e n t e r s y s e x i t 指令方式两 种实现系统调用的方式,虚拟了一个被称为v d s o 4 2 共享库。例如我们用l d d b i n i s 可以查看可执行文件b i n i s 所依赖的库: l i n u x g a t e s o 1 - ( 0 x b 7 e e f 0 0 0 ) l i b e s o 6 = l i b i 6 8 6 c m o v l i b c s o 6 ( 0 x b 7 d 5 a 0 0 0 ) 这里的l i n u x g e t s o 1 没有对应的文件,它正是我们所说的v d s o 共享库。系 统调用的入口点即在此共享库中。对于应用程序来说不用考虑系统调用实现方式 只需做些初始准备后直接“c a l l 入口地址”即可,实际上g l i b c 的系统调用正是 9 第2 章l i n u x 系统调用与l k m 如此实现的。目前该入口点名称为k e r n e ly s y s c a l l ,对于软件中断i n t i r e t 方式, 其实现在a r c h x 8 6 v d s o v d s 0 3 2 i n t 8 0 s 中;对于s y s e n t e r s y s e x i t 指令方式,其实 现在a r c h x 8 6 v d s o v d s 0 3 2 s y s e n t e r s 中。内核编译时会被编译成s o 文件,由 a r c h x 8 6 v d s o v d s 0 3 2 s 包含,并且导出起始地址和结束地址。内核启动时会调用 s y s e n t e r s e t u p 函数,先分配一个空白页面,然后根据处理器支持s y s e n t e r 与否将 s y s e n t e r - s 或i n t 8 0 s 编译出的s o 文件拷贝到此空白页。当用户空间执行一个e l f 文件时,在f s b i n f m te l f c 文件的l o a de l fb i n a r y 函数中加载e l f 文件到内存,然 后调用a r c h _ s e t u p _ a d d i t i o n a l _ _ p a g e s 将v s d o 所在页面映射到用户空间中,接着 l o a de l fb i n a r y 调用c r e a t ee l ft a b l e s 将k e r n e ly s y s c a l l 的地址放到e l f 参数 a t - s y s i n f o 中,最后c r e a t e e l f t a b l e s 将e l f i n f o 中的_ _ _ k e m e l v s y s c a l l 放到用 户堆栈中e l f 参数适当位置,这样用户层代码即可方便获得 的 地址。 _ k e r n e ly s y s c a l l 对于s y s e n t e r s y s e x i t 方式来说,- k e m e l _ v s y s c a l l 在将e c x 、e d x 、e b p 压栈并 将栈指针送e b p 后即调用s y s e n t e r 指令,随即s y s e n t e r 在内核空间的入1 2 1 函数 i a 3 2 _ s y s e n t e r t a r g e t 开始运行。入口函数i a 3 2 _ s y s e n t e r t a r g e t 的流程在前面已经 分析过,这里不再赘述。 2 2l i n u x 内核模块 2 2 1 可加载内核模块机制 传统的操作系统内核有两种结构:微内核体系( m i c r o k e r n e l ) 和宏内核体系 ( m o n o l i t h i c ) 。微内核体系结构的特点是在操作系统内核层实现了一个很小的c o r e 用来实现最基本的操作系统服务比如中断的管理、时钟的管理和进程问通信机制 ( i n t e rp r o c e s sc o m m u n i c a t i o n ) 等等,而将其它的操作系统服务比如文件系统、 t c p i p 网络协议栈,除几个特殊硬件外的设备驱动程序等等都实现在用户层空间 里。微内核体系结构优美、可扩展性好,但由于系统运行时有较多的进程切换以 及进程间通信机制性能低下等因素,微内核系统的性能则不尽如人意,虽然所谓 第二代微内核的性能号称很良好。微内核操作系统的代表者有m i n i x 、h u r d 、m a e h 、 1 4 等。 宏内核是将操作系统服务比如内存管理、设备管理、进程管理、网络协议栈 和文件系统等等都实现在内核层连接为一个大内核,进程切换大为减少,因为其 各模块都紧密连接在一起,其性能优秀,但可扩充性相对微内核则较差。宏内核 体系的代表者有l i n u x 、传统的u n i x 操作系统等。 l k m 是l o a d a b l ek e r n e lm o d u l e 的缩写,中文名为可加载内核模块。l k m 是包括l i n u x 操作系统在内类u n i x 操作系统为了在降低内存使用量和多功能、 1 0 第2 章l i n u x 系统调用与l 脚 高可扩充性之间取得平衡提供的机制。使用该机制后,内核的大部分功能模块平 时以目标文件的形式存在于硬盘上,当需要某一种内核功能时就将其实现模块动 态地加载到内存中使用。内核维护着一个全局的模块链表,链表的每个节点都对 应着一个模块的s t r u c tm o d u l e 结构体,内核正是利用s t r u c tm o d u l e 结构体来管理 每一个l k m 的。装载一个模块时,动态生成对应此模块的s t r u c tm o d u l e 结构体, 并链入链表的头部。注意,链表的末尾节点为内核本身,其模块名为空。加载模 块时需要对模块所引用到的符号进行解析和重定位,这相当于实现了应用层中的 应用程序加载器l d s o 的功能。然后,模块即可被当成内核的一部分来执行。加 载进内核中的模块具有所有的内核权限。模块可以在系统启动时加载,也可以在 系统运行时动态加载,在不需要时模块还能被卸载。操作系统内核本身将作为一 个基础模块,其中实现了操作系统的通用的基础功能并提供了对l k m 机制的支 持。如果需要对系统的功能迸行扩充,如实现新的设备驱动程序、新的文件系统 等,只需要添加新的模块在其中实现所需要的功能并不需要重新编译内核。加载 新模块时并不需要重新启动机器,这样就在内存使用量和高可扩充性之间取得了 最佳的平衡。 大部分的内核级r o o t k i t 正是利用了可加载模块机制,动态加载进内存把自己 作为内核的一部分运行,因为其拥有和操作系统内核本身一样的权限,相对于应 用层的r o o t k i t 来讲其隐蔽性更好,危害性更大。 2 2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论