




已阅读5页,还剩53页未读, 继续免费阅读
(计算机软件与理论专业论文)基于被动拦截的内核模块保护机制.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
浙江大学硕士学位论文 摘要 由于内核模块的广泛应用,内核模块的异常处理成为重要的系统安全环节。 本文介绍了一款l i n u x 环境下基于被动拦截的内核模块自动保护机制。该机制支 持内核单独监控一个模块,当此模块内部发生致命的段错误时,它能保证模块可 以安全的卸载,并且内核数据不会遭到破坏。针对现有类似机制的不足,该机制 既不要求用户对被监控模块的代码进行手动的修改,也不要求计算机硬件进行额 外的支持。另一方面,该机制能够更好的处理内核模块出现异常之后的善后工作, 以及更好的保证内核的完整性和一致性。本文将着重介绍该机制的设计思路,并 提出一个使用该机制的原型系统m o d i n s p e c t o r 。 本文主要完成了以下三方面的工作: 1 概要地回顾了内核模块保护领域的现状,介绍了现有的技术和各种应用 领域。内核模块保护领域是一个十分活跃的领域,有大量的文献涌现。 比较遗憾的是,现有的内核模块保护技术在适用难度、对模块行为的监 控以及处理模块的卸载方面都有各种缺陷。 2 提出了基于被动拦截的内核模块保护机制,并从内核模块豁视以及模块 异常处理两方面提出改进的设计。 3 提出一个基于该机制的原型系统m o d l n s p e c t o r ,并使用该系统测试其功 能的完整性。 实验数据表明,根据本文提出的方法实现内核模块错误的捕捉和保护具有。日f 接受的成功率,同时大大减少了保护技术的适用难度。 最后,在提出的方泫和实验结果的荩础上,文章还总结了该方法的不足,以 及进一步工作的开展方向。 关键词:模块监视内核恢复页错误拦截被动监视自动同退 浙江大学硕士学位论文 a b s t r a c t a st h ep o p u l a r i t yo fk e r n e lm o d u l eg r o w s ,t h ee x c e p t i o nh a n d l i n gb e c o m e s 锄 i m p o r t a n tp a r to fs y s t e ms e c u r i t y t h i sp a p e rp r e s e n t sa na u t o m a t i cs y s t e mf o rk e r n e l p r o t e c t i o nb a s e do np a s s i v ed e t e c t i o nu n d e rl i n u xe n v i r o n m e n t t h i sm e c h a n i s mi s c a p a b l et om o n i t o ras i n g l ek e r n e lm o d u l e w h e nt h i sm o d u l ee n c o u n t e r saf a t a le r r o r i ni t so w nt e x t ,i ti se n s u r e dt h a tt h em o d u l ew i l lb es a f e l yu n l o a d e d 。a n dt h ek e m e l w i l lb ek e p tu n h a r m e d i nc o n t r a s tt oo t h e rs i m i l a rm e c h a n i s m ,t h i sm e c h a n i s m n e i t h e rr e q u e s t su s e r st om o d i f yt h ec o d eo f t h em o d u l em a n u a l l y ,n o r r e q u i r e ss p e c i a l h a r d w a r es u p p o r t o nt h eo t h e rh a n d ,t h i sm e c h a n i s mc a nd e a lw i t ht h ee x c e p t i o n w h i c hk e m e lm o d u l er a i s e sb e a e r ,t ok e e pt h ek e r n e ls a f e t h i sp a p e rd e s c r i b e st h e d e s i g no f t h i sm e c h a n i s m ,a n di n t r o d u c e sap r o t o t y p es y s t e mc a l l e dm o d l n s p e c t o r t h e r ea r et h r e ek i n d so fc o n t r i b u t i o n si nt h i sp a p e r : 1 d e s c r i b et h ew o r ko t h e rp e o p l eh a v ed o n ei nt h ek e r n e lm o d u l ep r o t e c t i o n f i e l di nr e t r o s p e c t t h ef i e l di sv e r ya c t i v e ,w i t hl o t so fp a p e r sp u b l i s h e d h o w e v e r ,t h ee x i s t i n gt e c h n i q u e sr e q u i r el o t so fu s e ri n t e r f e r e n c e ,a n dd on o t h a v et h ea b i l i t yt om o n i t o rk e r n e lm o d u l eb e h a v i o ra n du n l o a db u g g ym o d u l e g o o de n o u g h 2 i n t r o d u c et h ea u t o m a t i cs y s t e mf o rk e r n e l p r o t e c t i o nb a s e do np a s s i v e d e t e c t i o nu n d e rl i n u xe n v i r o n m e n t ,a n dt h ed e s i g no ft h em o n i t o r i n ga n d e x c e p t i o nh a n d li n g 3 i n t r o d u c et h ep r o t o t y p es y s t e mc a l lm o d l n s p e c t o rb a s e do nt h i sm e c h a n i s m , a n dt e s tt h ef u n c t i o n a l i t yo f t h ep r o t o t y p es y s t e m t h ee x p e r i m e n t ss h o wt h a tt h em e t h o ds u g g e s t e db yt h e p a p e rh a sa c c e p t a b l e c a p t u r es u c c e s sr a t e ,a si ts i g n i f i c a n t l yr e d u c et h ed i f f i c u l t yo f a p p l i c a t i o n t h e nt h ep a p e r ,b a s e do nt h em e t h o da n dt h ep r o o f , s u m m a r i z e st h ei n a d e q u a c y o f t h em e c h a n i s m ,a n dl o o k sf o r w a r di n t ot h ef u t u r ew o r ko nt h i ss u b j e c t k e y w o r d s :m o d u l em o n i t o r , k e r n e lr e c o v e r y , p a g ef a u l ti n t e r c e p t i o n ,p a s s i v e i n t e r c e p t i o n ,a u t o m a t i cr e t u r n 浙江大学硕士学位论文 图目录 图目录 图2 1n o o k s 基本结构5 图2 2n o o k s 的调用中间层。5 图2 3x f i 结构图。7 图2 4s a f e d r i v e 结构图9 图3 1 模块代码池示意图。1 3 图3 2k m a l l o c 流程图l5 图3 3k f r e e 流程图l7 图3 4 模块对补偿队列的操作18 图3 5 补偿队列示意图( 1 ) 1 9 图3 6 补偿队列示意图( 2 ) 2 0 图3 7 模块可以不经记录而随意读写的内存区域2 2 图3 8 分配查找表示意图2 2 图4 1 模块执行抽象示意图2 5 图4 2 返回块流程图一2 8 图4 3 返回过程示意图2 9 图4 4i o n g j m p 跳转示意图3i 图4 5 返回过程示意图3l 图5 1m o d l n s p e c t o r 系统结构3 5 浙江大学硕士学位论文 表目录 表目录 表5 1 功能性测试结果表4 4 表5 2 性能损失测试结果表4 5 l v 浙江大学研究生学位论文独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工作及取得的 研究成果。除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发 表或撰写过的研究成果,也不包含为获得澎姿盘堂或其他教育机构的学位或 证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文 中作了明确的说明并表示谢意。 学位论文作者签名:签字日期:年月日 学位论文版权使用授权书 本学位论文作者完全了解逝婆盘鲎 有权保留并向国家有关部门或机 构送交木论文的复印件和磁盘,允许论文被查阅和借阅。本人授权迸江盘堂 可以将学位论义的全部或部分内容编入有关数据库进行检索和传播,可以采用影 印、缩印或扫描等复制手段保存、汇编学位论文。 ( 保密的学位论义在解密后适用本授权书) 学位论文作者签名:导帅签名: 签字日期:年月 日 签字日期o年月 浙江大学硕士学位论文 第1 章绪论 1 1 课题研究背景及意义 第1 章绪论 自从l i n u x 推出可装载内核模块( l k m ) 之后,内核模块在各个领域被广泛 的应用起来,包括设备驱动、系统安全、性能优化等等。但由于内核模块可以轻 易的影响l i n u x 内核的各个方面,轻率的使用不可靠来源的内核模块时常会导致 灾难性的影响1 1 这一方面来自于模块提供方的恶意行为,例如恶意软件;另一 方面可能也来自于模块编写者的意外失误。 为了避免内核模块因为具有过强的权限而导致操作系统出错,各种针对内核 模块的保护机制被提出。有些保护机制针对第一种错误进行保护,也有些保护机 制针对两种错误都进行保护,内核模块保护技术主要有两种具体实现形式: 错误预防( f a u l tr e s i s t a n c e ) 此类保护技术主要致力于探测模块代码可能引发致命错误的行为,并预先采 取措施予以警告或阻止。错误预防系统主要采取重编译或二进制重编码的方式在 模块代码内部插入各种守护代码,针对编码人员可能出现的各种常见错误如数组 越界等进行监视,以达到防患于未然的目的。这种方法的缺陷是不容易完全覆盖 到所有潜在的有缺陷代码,并且恶意的代码很容易绕过此类防护。 错误容忍( f a u l tt o l e r a n c e ) 此类保护技术主要致力于在系统范围内构筑一个稳定的模块加载环境,使得 模块引发致命错误时,其致命错误不会真正影响到整个系统。该方法实际并不阻 止模块出错,而是放任模块运行并等待模块出错,在模块出错之后阻止其灾难性 后果扩散到整个系统,并将模块移除。此方法通常会在模块的运行环境中构造各 种保护措施,隔离或记录模块对系统的真实影响,并在模块出错后撤销模块对系 统的所有副作用。 具体说来,不论是错误预防还是错误容忍,都必须涉及到针对模块副作用的 两个方面:错误检测与副作用防护。 错误检测 浙江大学硕士学位论文 第1 章绪论 对模块保护系统来说,判断模块何时会出现致命错误是个重要的考验。大体 说来,错误检测有主动检测和被动检测两种主动检测通过插入代码、用户添加 限制等手段,对程序的逻辑进行规范当程序行为违反规范的时候,系统就可以 认定该程序即将触发错误。主动检测的好处是可以让系统在错误发生之前就把错 误捕捉到,避免错误发生之后产生无法控制的连锁反应,坏处是建立逻辑检测通 常比较繁琐,不利于使用。被动检测则是不通过逻辑判断,而是等待错误的发生。 在错误发生之后再着手处理善后事宜。被动检测在部署上较为方便,不需要规范 任何逻辑,无法避免错误本身的发生,因而不可避免的要处理一些错误的额p i - 萄j 作用。 副作用防护 模块在执行的过程中会对内核数据产生各种影响,这些影响在模块出错之后 将会长久的保持。如何处理这个副作用是模块保护系统设计的重点之一一部分 系统采用类似于“影子系统”的方式建立模块与内核之间的中间层,使得模块不 能直接影响内核数据。影子系统可以隔离普通模块对内核的影响,但很难处理某 些和内核以及其他内核模块有非常紧密耦合的模块。另一部分系统采用行为记 录,追踪模块对系统的所有副作用,以便在系统出错之后进行反转。这种方式可 以解决大部分模块的内核的副作用,但仍然无法处理模块在执行过程中因为修改 内核数据,而对内核或其他模块的执行逻辑产生的深远影响。 本文所介绍的基于被动检测的模块保护机制,采用被动捕捉模块触发的致命 错误,并采用非常全面的行为记录的方法追踪模块的副作用。相对于其他的现有 项目,具有使用成本低廉、对硬件环境无依赖性、更强的系统恢复能力等特点, 力求在用户进行模块调试和使用时,保证最大的系统稳定性和可恢复性,并且尽 可能不依赖于用户自主的可靠性。 1 2 本文的主要工作 本文针对目前内核模块应用中的由于模块行为异常而导致系统不稳定的现 状提出了一个l i n u x 内核模块的保护系统,使得内核模块在发生异常的时候可以 安全的卸载,并且不会影响到整个系统。 浙江大学硕士学位论文第1 章绪论 本文的主要工作如下: 1 介绍了现有的一些内核模块保护的相似技术,包括n o o k s 3 a 】、x f i t 5 1 和本 文系统的前身s a f e d r i v e 6 1 等等。 2 提出了基于被动拦截错误的预警技术,以及避免发生这种技术所无法拦截 的错误的措施。 3 提出了在成功拦截后,处理模块的现场和恢复系统的技术 1 3 本文的组织结构 本文的主要内容分为6 章,具体组织如下: 第1 章为绪论,介绍了课题的项目背景,课题提出的原因。论文的主要工作 和全文的组织结构。 第2 章主要介绍了现有的一些与内核模块保护有关的技术,如n o o k s 、x f i 等等。 第3 章主要介绍了模块行为监控技术,包括拦截函数和补偿队列的设计。 第4 章主要介绍了页面错误的接收、处理以及返回的技术。此外还介绍了恢 复内核的相关技术。 第5 章主要介绍了基于被动拦截的内核模块保护技术的实现:m o d l n s p e c t o r 。 第6 章为总结和展望,提出了很多还需要改进的地方,主要是针对扩大监视、 恢复的有效率的改进。 1 4 本章小结 本章首先介绍了课题的背景,即模块保护技术的意义,以及实现该技术所可 能采用的方法。 此外,本章还简要介绍了论文的主要工作,及组织结构。 浙江大学硕士学位论文 第2 章内核保护技术综述 2 1 内核模块的困境 第2 章内核保护技术综述 内核模块通常通过若干方式引发内核的异常:最常见的异常来自于无效页访 问,即通常所说的段错误没有被正确捕捉的段错误会导致内核行为异常,甚至 直接崩溃。此类错误可以经由模块自身进行错误的指针使用产生,也可以由模块 将指向无效内存地址的指针或可以经计算产生无效地址的数据传递给内核来间 接产生。另外一类内核异常来自于内核模块蓄意将精心准备的错误数据提供给内 核,导致内核误用数据产生意外的行为。这种错误来自于模块编写者的恶意,只 会在使用不可置信来源的第三方模块时遇到。 为了避免内核模块因为具有过强的权限而导致操作系统出错,各种针对内核 模块的保护机制被提出【7 】在不考虑硬件支持舯 1 0 1 的情况下,有些保护机制针对 第一种错误进行保护,也有些保护机制针对两种错误都进行保护,下面将介绍几 种主要的保护思路和方法。 2 2n o o k s :基于模块隔离的保护机制 为了避免内核模块对l i n u x 内核造成破环性的影响,将内核模块- 9l i n u x 内 核彻底隔离开是一个显而易见的想法。这也是大量内核保护系统所采用的首选机 制。 n o o k s 是一个典型的采用模块隔离内核保护系统,它将每个模块至于一个轻 量级的内核保护域中,并通过由自己设计的内核函数代理来负责模块与内核之间 的通信。如图2 1 所示: 浙江大学硕士学位论文 第2 章内核保护技术综述 n o o k s 隔离 管理系统 图2 1n o o k s 基本结构 在n o o k s 中,所有从内核到模块的,以及从模块到内核的函数调用都不能直 接进行,而必须经由一个称为x p c 的函数代理来完成【l l 】。n o o k s 靠这个代理记 录内核模块每一次对内核函数的调用,并检查其合法性。n o o k s 的调用中间层如 图2 2 所示: 内核 l 复制同步 参数检查 上 x p c 上 模块 模块 1 l x p c 上 复, n i i 步 参数榆赍 上 内饮 图2 2n o o k s 的调用中间层 n o o k s 调整内核的模块加载代码与模块的初始化代码,使得内核模块所使用 的内核函数都被链接到有一个特殊的中间层,这个中间层负责执行一系列的安全 措施,并在一切就绪之后调用模块实际想调用的函数。在调用实际函数前,中间 层需要首先检查函数参数的安全性。其次,中间层针对内核和模块之间互相传递 的内核对象进行复制和同步,以间接的追踪部分模块对内核对象的影响。 n o o k s 还禁止模块对内核内存的任何写操作,事实上,n o o k s 为每个内核模 块准备了一个只读的内核同步内存镜像。对于内核模块可以直接写入信息的内核 浙江大学硬士学位论文第2 章内核保护技术综述 数据结构,n o o k s 通过改写用于修改这些数据结构的宏和内联函数来完成操作的 拦截和记录 n o o k s 追踪并记录模块涉及到的所有内核对象的地址,此外,它还根据一个 对象的被涉及范围的不同采取不同的追踪策略。追溯其生命周期,以及以模块对 其的影响来对不同的对象进行不同程度的追踪例如一个由单次x p c 使用的对 象会被存储于当前线程所独有的一个对象列表中,而被模块长期持有的对象则被 存储于模块所独有的哈希对象表中。n o o k s 对不同的内核对象,针对其结构的不 同而有不同的策略,例如一些对象在提供给模块时会提供一个只读的拷贝,而其 他一些对象,则可能直接把其数据映射到模块空间里,供模块自由的读写 n o o k s 捕捉的错误来源非常广泛,触发系统恢复的时机来自以下几个检测- x p c 中间层的参数校验出错 处理器错误 信号错误 在检测到系统错误之后,n o o k s 试图卸载模块,并动用收集的信息恢复系统 状态。如果模块卸载失败,n o o k s 可能会中断恢复过程。 然而,n o o k s 具有几个明显的缺点,首先n o o k s 的设计面向的是错误避免而 非错误容忍( “f a u l tr e s i s t a n c e ,n o tf a u l t t o l e r a n c e ”) ,因此很容易被恶意设计的代码 所破坏。例如n o o k s 里为每个保护域所提供的只读内存镜像,可以很容易的被 内核通过替换内存页表而无效化。另一方面,n o o k s 并没有完全检测和拦截模块 对内核数据结构的写操作,仅仅是拦截了通过宏或内联函数来执行修改的那一部 分。对于不够规范的代码来说,不使用宏而直接修改内核数据结构的情况时有发 生,因此,n o o k s 对这类代码的副作用不能够完全捕捉。最后,n o o k s 在系统出 错后的恢复工作做得较为草率。事实上,n o o k s 并未针对在模块出错时正在执行 模块代码和曾经进入模块的线程进行处理,因此在恢复内核的时候可能出现新的 问题。 2 3x f i :基于行为限制的保护机制 部分保护机制意识到,与其记录所有的模块操作,以便在事后收拾残局,不 6 浙江大学硕士学位论文第2 章内核保护技术综述 如直接预防错误的发生。x f i 就是这种思路的代表。 x f i 是一个泛用的软件保护系统,他的前身是另一个软件保护系统s f i i l 2 】。 x f i 可以适用于一般的应用软件,也可以用于保护组件系统1 3 “】如内核模块等 x f i 采用重写二进制文件的方法【”】,在软件内部加入各种行为限制,使得被保护 的软件很难做出有破坏性的举动。x f i 的总体结构如图2 3 所示: 图2 3x f i 结构图 x f i 对于每个被保护的模块做出了如下的限制: 内存读写限制:被保护模块只能读写自己的内存区域,以及宿主系统显 式提供读写权限的内存区域 接口限制:线程的执行流不能随意了到达模块的外部,除非通过调用显 示规定的接口函数。 堆栈限制:堆栈必须是规范化的,栈指针要始终指向同一块可写的内存 区域,栈上的数据要能够如实的反映调用栈,w i n d o w s 的异常框架要和 栈数据正确对应。 指令限制:某些特权指令是模块永远不能使用的,例如x 8 6 里修改t a s k 描述符,某些指令只能在受限的环境中执行,这一限制会由二进制分析 器保证。 系统环境限制:部分系统环境,例如x 8 6 的段寄存器,要在程序执行期 间保持稳定。 浙江大学硕士学位论文第2 章内核保护技术综述 执行流限制1 6 ,1 7 1 :程序的执行流必须通过可预知的路线进行,这包括f 口- - j 接调用和通过地址计算的调用此外,函数调用必须跳转到一个函数的 头部,而不是中间 数据访问限制:某些全局和局部数据必须通过静态的引用来访问,而非 地址计算。 x f i 采用静态校验的方法来保证其中一部分限制。例如,校验器会检查程序 代码里是否只包含合法的指令,而不包含在内核态会造成破坏性影响的指令特 别的,校验器还会对部分控制流和内存访问进行检查,以保证直接跳转和静态内 存访问不会违反之前的7 条限制。 x f i 使用运行时守卫的方式来检查静态校验无法确定的控制流限制。所有的 守卫通过二进制静态分析重写器插入到程序的代码段中,以便在运行时检查。 x f i 在每一个合法的跳转目标前设置了一个魔数标记,在程序进行间接跳转时, 守卫代码会首先检查跳转目标是否拥有合法的标记,来判断是否允许进行这个跳 转。 x f i 使用了两个堆栈来保证栈数据的安全: 常规栈:常规栈存储被静态访问的局部变量,例如单一的变量。常规栈 里的变量不会被其他代码使用计算后的地址所引用。 分配栈:分配栈中存储可以使用指针来间接访问的变量,例如数组和任 何被获取过地址的变量。 使用两个栈的目的是防止在栈中用指针访问时会意外的覆盖到静态存储的 关键数据【1 9 1 ,例如程序的返回值。在运行时,x f i 使用守卫保证两个栈不会互相 重叠,此外,所有访问常规栈的指令必须是以s p + k 的寻址形式来完成的,其中 s p 是栈寄存器,而k 是一个正整数,并且和机器字节对齐。除此之外,任何形 式的内存操作都不能访问常规栈的数据,因此常规栈的数据可以保证不被其他指 令破坏。而另一方面,分配栈是由线程局部存储的指针所索引的区域,由一个抽 象的分配栈寄存器a s p 来引用数据。a s p 的行为和普通的栈寄存器一样,在函 数凋用前后保持一致,但在分配栈中,a s p 的移动和计算会被插入守卫来检查有 效性,这样可以避免分配栈中的指针意外到达栈空间之外。 r 浙江大学硕士学位论文第2 章内核保护技术综述 x f i 在避免模块出错这方面的工作确实行之有效,并且基本不需要对内核进 行大面积的修改。但很遗憾的是,部分安全的技术,在实现细节上实际会违反 x f i 的若干限制,例如c 语言中的跨函数跳转因此x f i 对模块进行的这种近 乎苛刻的限制导致模块实现者在编写程序的时候束手束脚,而且由于不能保证模 块的实现方预先就遵守了以上规则进行编写,x f i 对于现有模块的兼容性具有一 定问题 2 4s a f e d r i v e :依赖描述的逻辑限制方法 s a f e d r i v e 的提出者看到了x f i 在强加的逻辑限制上的不足,因而提出让用 户手动描述应有的逻辑规则,来避免对用户施加过多的限制。s a f e d r i v e 的总体 结构如图2 4 所示: 图2 4s a f e d r i v e 结构图 s a f e d r i v e 提出一个基于c 语言改进而成的规则描述系统2 0 , 2 1 】,称之为 d e p u t y 。d e p u t y 系统在c 语言的基础上增加指针【2 2 2 3 1 范围描述和类型检查这一 类 浙江大学硕士学位论文 第2 章内核保护技术综述 上例中的c o u n t 域获得了一个d e p u t y 标记,以注明它所指向的内存区域的有 效范围为s i z e o f ( s t r u c tb u f f e r i n f o ) c o u n t 个字节编译器会在看到该d e p u t y 标 注时将c o u n t 域纳入监视列表,并在代码每一次使用该域时进行运行期检查。 d e p u t y 此外还假定所有不带标记的指针要么是n u l l ,要么指向一个不可位移 的对象。这样可以简单的计算出每一个指针的安全活动范围。 d e p u t r y 系统允许的关键字有: s a f e :表明一个指针不可被计算,就如同j a v a 里的引用一样。 s e n t i n e l :表明一个指针只能用于比较而非解引用,这通常是指向数据边 界的指针。 c o u n t ( n ) :表明一个指针指向一个至少有n 个元素的数组,或者为n u l l 。 b o u n d ( i o ,h i ) :表明一个指针的范围必须为【i o ,h i ,或者为n u l l 。 n u l l t e r m :表明一个指针指向一个以n u l l 结尾的字符串。或者为n u l l 。 在使用d e p u t y 系统获得了足够的安全信息之后,s a f e d r i v e 在代码的各个部 分插入各种检查代码来运行期检测违规行为,当违规行为发生之后,s a f e d r i v e 启动一个恢复方案,来卸载模块并恢复内核。d e p u t y 允许带有这些标记的指针 之间相互转换。在转换时,d e p u t y 会插入合适的检查来保证转换合法。例如当 用户将一个带有b o u n d ( n ) 的指针赋值给一个s a f e 指针时,d e p u t y 会检查n 是否 为0 。当模块使用具有d e p u t y 标记的指针时,检查代码会在其解引用前验证指 针的值,保证它满足d e p u t y 标记的规定。 s a f e d r i v e 的恢复机制和n o o k s 比较接近,采用修改宿主系统( 内核) 的对 模块开放接口,插入记录模块操作的代码来获得所有模块对内核进行修改的信 息。这些信息被汇总为一个撤销表( u n d ol i s t ) ,在模块的违规操作被发现时进行 反转模块对内核的影响。 s a f e d r i v e 有几个重大的缺陷。首先s a f e d r i v e 需要对模块的源代码进行手动 的修改,对于大规模的内核模块项目,这个负担是非常显著的,同时也不利于将 i n 浙江大学硕士学位论文第2 章内核保护技术综述 s a f e d r i v e 应用到现有的模块上此外,s a f e d r i v e 的d e p u t y 系统非常依赖于用户 的仔细程度和技术水平,从而具备巨大的不稳定性 2 5 本章小结 本章介绍了几种模块保护机制,或者可以达到相同效果的其他机制,如x f i 等。他们的共同之处在于都要捕捉模块的出错点,在此后使用某种方式使内核免 除模块的负面影响。他们的不同之处在于,一方面,不同的方案使用不同的策略 来捕捉模块的出错时机;另一方面,不同的方案使用不同的策略来保证内核数据 的稳定性。 浙江大学硕士学位论文第3 章模块行为监控 第3 章模块行为监控 3 1 模块行为监控的整体思路 l i n u x 内核模块 2 4 , 2 5 , 2 6 1 被插入内核之后,会在与内核的互动中对内核产生或 多或少的影响。在内核被正常卸载前,这些影响的绝大部分是临时而且不完整的, 因此在模块正常卸载前,如果模块出错,内核数据中将存在一些本应在模块卸载 时撤销但并没有撤销的改动,处于一种不一致的状态。 为了防止模块对内核产生过多的影响之后崩溃,导致内核数据不一致,我们 必须监视模块对内核做出的各种修改【2 7 1 。现有的模块保护方案或多或少的在这 方面进行了一些工作,但都无法完全捕捉模块对内核的每一个影响。我们在其他 项目的基础上,强化对内存直接读写,以及内核接口函数的调用方面的拦截和记 录,增强模块对内核修改记录的覆盖率。 我们假定插入模块的时候,内核是处于一种完好的状态,因此当模块产生错 误时,将内核状态恢复到模块插入之前是一个很好的选择。 模块对内核可能造成修改的行为有: 模块调用了一个会修改内核数据的内核函数 模块通过内核函数获得了一个内核数据的引用,并手动修改这个数据, 或者这个数据间接引用的其他内核数据。 模块在内核里注册了一个回调函数,而其他线程在模块出错前使用了这 个函数。 为了简化实现,我们将以上三种情况抽象为一个抽象的模型:把模块的所有 代码看作一个代码池,各种线程一一包括由模块发起的以及其他的线程一一调用 这些代码的时候,我们称谓“流经”这个模块,如同河流一般。当线程第一次调 用模块代码时,线程流入模块,当流入模块的线程首次返回到一个调用栈中不存 在模块函数的状态时,称为流出模块。如图3 1 所示: 浙江大学硕士学位论文第3 章模块行为监控 图3 1 模块代码池示意图 每当线程流入模块的时候,会因为模块代码的驱使而去调用内核函数修改内 核数据,或者使用内核函数获得内核数据的引用来手动修改,也就是前述的第一 二条修改行为。当其中一个流经模块的线程出现错误时,模块的数据会有可能被 破坏,从而导致模块的代码全部无法继续安全的执行。此时所有流经模块的线程 都会被截断,处于一种既不能继续执行,也无法后退的尴尬局面。同时,内核数 据此时处于被模块代码当中,某些数据可能并不完整,也不能置之不理。因此我 们必须在模块出错之后做好两样工作: 修复内核数据的不完整性。 让正在流经模块的线程完好的从模块中抽离出来,同时保证线程本身的 逻辑不被破坏。 本章将详细介绍第一部分的工作。在这一部分工作中,我们致力于实现一套 不由用户参与的拦截机制,避免用户的手动行为干预整个监视过程,以防止用户 的自身疏忽造成额外的错误。 3 2 内核模块调用界面的监视 内核模块主要通过内核模块调用界面与内核通信,这个界面主要包括内核对 外导出符号的各种公开函数。这些函数覆盖了内核的各个方面,包括: 内存管理 任务管理 并发控制 浙江大学硕士学位论文 第3 章模块行为监控 中断处理 对象管理 文件系统操作 设备管理 等等。每一方面的函数界面都提供了对内核数据或多或少的操纵能力,成为 模块影响内核的最主要途径。 3 2 1 拦截函数 对内核模块调用界面的监视是一个繁重而又机械的工作,需要修改所有对内 核产生持久影响的函数接口,以保证模块通过该途径的所有影响行为都被正确拦 截。 拦截所需要做的事情主要包括两方面: 检查一个接口函数的调用是否直接来自被监视的模块 如果上一条满足,那么在将当前函数的补偿操作函数存放在一个队列里 所谓的补偿操作函数【2 8 1 是为这个接口函数量身定做的对应函数,负责在内核 中补偿该函数所造成的影响。例如,k m a l l o c 的补偿函数的功能就类似于k f r e e 。 事实上,k m a l l o c 的补偿函数除了检查参数之外,唯一的工作就是调用k f r e e 来释 放k m a l l o c 分配的内存。 图3 2 以k m a l l o c 函数为例,演示拦截工作将如何进行。 浙江大学硕士学位论文第3 章模块行为监控 足 是 1 分配并填写u n d 。j a t a 上 i 将谈絮卷翟茇翕挈模 上 6 。笑辇嫠篙寡嚣翥娄加 图3 2k m a l l o c 流程图 其中模块分配查找表将在3 3 节详细介绍。 我们只在被需要监视的模块直接调用的函数中记录补偿函数。如果一个函数 是模块通过调用其他内核函数而被间接调用的,这个函数将不会保存一个补偿函 数。采取这样的策略是假定被模块直接调用的函数所对应的补偿函数可以完整的 补偿这个函数的所有影响,包括该函数调用的其他内核函数所造成的影响。 3 2 2 补偿函数 补偿函数是一个能够完全移除一个内核函数对内核的数据和对象的影响的 函数。对于绝大多数内核函数,其补偿函数的作用都十分明确。例如,申请资源 的函数的补偿函数必然为释放资源。例如k m a l l o c 的补偿函数如图所示: 浙江大学硕士学位论文 第3 章模块行为监控 部分内核函数不存在现成的可以补偿其影响的函数,因此这些函数的补偿函 数的逻辑可能更为复杂一些。例如c o p y _ f r o m _ u s e r ,它的补偿函数并不调用任何 内核提供的现成功能,而是自己写回被该函数所覆盖的内存空间,如下所示: 还有部分函数,尽管也能对内核数据产生影响,但他们本身就是补偿其他函 数的作用,例如k f r e e 。对于这些函数,我们并不设计相应的补偿函数。 3 1 、偿函数由拦截函数自动插入在模块所私有的一个队列里,以供系统恢复时 使用。需要注意的是,并不是每一次内核函数调用都会在队列加入新的补偿函数。 如果模块自己手动调用了与补偿函数相同功效的函数一一例如模块在调用 k m a l l o c 之后调用k f r e e 释放申请的空间一一那么在队列中存储的对应补偿函数 会被移出,否则在恢复阶段会出现多次释放资源的问题。为了支持这一特性,补 偿函数列表中的各个项同样被记录于一个散列表中,其散列函数使用函数地址和 关键参数来计算散列值,以便快速查找针对同一个目标的补偿函数。当系统检测 到一个可作为补偿函数的函数被执行,并在确认此函数确实是被调用来执行一个 3 1 、偿操作之后,会在函数列表中查找函数地址和关键参数都匹配的最近的补偿函 数。如果可以找到这样的函数,那么这个函数将被从函数列表中移除。对于上例 的k m a l i o c ,对应的类补偿函数为k f r e e 。因此,k f r e e 的代码会被修改为如图3 3 的流程所示: 浙江大学硕士学位论文 第3 章模块行为监控 是 图3 3k f r e e 流程图 在k f r e e 的修改中,并不会判断返回地址是否处于被监控模块的代码段内, 因为补偿k m a l l o c 的操作并不一定是被被监控模块直接调用的,也可能是以其他 内核函数的子功能的形式来完成。 整个模块的正常运行对补偿队列的影响如图3 4 所示: 浙江大学硕士学位论文 第3 章模块行为监控 3 2 3 补偿队列 图3 4 模块对补偿队列的操作 所有的补偿函数最终被存储在一个队列中,这个队列我们称为补偿队列。补 偿队列按照生成补偿函数的时间上的先后顺序来排列其中的各个补偿函数。结构 上,补偿队列需要高效的进行如下操作: 在尾部插入或删除一个补偿函数。 在队列里高效的查找以及删除一个特定一一包括类型特定和参数特定一 一的补偿函数。 介于以上特点,我们把补偿队列设计为一个带哈希索引的链表,如图3 5 所 示: 浙江大学硕士学位论文 笫3 章模块行为监控 图3 5 补偿队列示意图( 1 ) 哈希索引使用补偿函数的地址以及其参数的特征值作为计算哈希值的参数。 不同的补偿函数所使用的参数特征值各有不同,例如,k m a l l o c 的补偿函数的参 数特征值就是其分配得到的内存空间首地址,而o p e n 的补偿函数参数特征值则 是其要打开的文件名字符串。针对不同补偿函数所使用的哈希计算方法不同,我 们为每个补偿函数提供一个专门的哈希函数,并用另外一个哈希表来进行索引, 以便快速查找。这个新的哈希表使用需要被补偿的内核函数的地址作为唯一的哈 希值计算参数,来帮助从内核函数快速的查找到补偿函数和哈希函数。整个索引 结构如图3 6 所示: 浙江大学硕士学位论文 第3 章模块行为监控 抵消函数抵消函数抵消函数 哈希函数哈希函数哈希函数 j lj ljl 哈专表 内核函数内核函数内核函数 图3 6 补偿队列示意图( 2 ) 在设计内核函数的拦截代码时,拦截代码可以根据当前函数的地址来通过哈 希表自动查找到当前函数对应的补偿函数,有助于简化实现拦截代码的工作量, 提高容错率。 3 3 直接内核内存写入的监视 除了调用内核模块界面的函数之外,模块还可以通过直接向内核内存写入的 方式来达到对内核的影响。通常模块可以通过一些内核模块界面来获取内核部分 数据的指针,并使用这些指针来操纵内核数据。例如大量的文件系统相关的模块 都会通过各种办法获取内核所管理的文件系统数据结构一一如i n o d e 或d e n t r y 等 一一予以施加自己的操作。 浙江大学硕士学位论文第3 章模块行为监控 部分模块保护系统采用拦截操作这些内核结构的宏的方式来达到跟踪这一 行为的目的,但用户可以很容易故意或无意的绕开宏的限制来直接操纵内核。另 一些模块采用影子拷贝的方式来追踪模块对内核结构的修改:修改内核代码,使 得内核在对其他模块提供内核结构的引用时,首先对这个结构进行一次复制,将 结构的附件提供给模块修改然后再通过某种方式一一例如页面映射一一来记录 模块的修改行为并同步内核的实际数据。这样的处理方案可以成功的捕捉用户直 接读写内核结构的行为,但仍然对用户采用获取内核结构的引用,再使用该引用 获得其他内核结构的引用来修改的方式毫无办法。 我们为了避免这一类问题,采取了更为严格的控制措施。在特定开源编译器 的代码中,我们让其在被编译的代码中针对一切写内存行为插入了记录信息。例 如一个写操作所需要的记录信息为: 仅仅当写操作的目标地址位于内核的区域之内时,这个写操作才会被记录。 模块向内核申请的内核区域并不包括在内核关键数据区域之内。如何界定一个写 操作的目标是否位于内核区域内呢? 我们认为如果一个写操作的目标地址满足 以下几个条件,这个写操作就需要被记录: 1 写操作的目标位于内核态内存范围内。在l i n u x 中,默认是最高的1 g 内存。 2 写操作的目标地址不位于模块的二进制映像的内存范围内 3 写操作的目标地址不位于由模块直接向内存申请的动态内存区域内。 4 写操作的目标地址不位于由模块使用的栈空间内。 图3 7 展示了一个模块允许不经记录而随意读写的内存区域。 浙江大学硕士学位论文第3 章模块行为监控 图3 7 模块可以不经记录而随意读写的内存区域。 判断写操作目标是否满足以上几个条件的算法必须足够快速,否则对性能有 较大的损失。我们在内核中的模块结构中可以轻易的查找到模块二进制文件以及 栈空间的映射范围,因此能够非常简单的判断条件l 、2 和4 。为了判断条件3 , 我们为模块维护一个分配内存查找表。分配内存查找表是一个哈希和二分结合的 查找表,我们使用内存地址的前1 6 位作为哈希的索引值,后l6 位作为二分的查 找值。我们在内核内部建立一个有l6 k ( o x c 0 0 0 o x f f f f ) 个元素的哈希表,每 个元素代表一个1 6 位的值。每个元素指向一个有序的数组,用于二分查找。如 图3 8 所示: 图3 8 分配查找表示意图 表中的每一项都是一个分配区域,如果一个写操作的目标地址被确认位于表 中的某一项中,这个写操作就不需要被记录补偿函数。如果一个分配区域跨越了 2 2 浙江大学硕士学位论文第3 章模块行为监控 多个哈希值一一例如分配区域从o x d 0 0 1 0 0 0 0 至0 x d 0 0 2 f f f f 跨越了两个哈希值 一一那么在多个哈希值所指向的二分查找表中都会有相应的记录 为了维护这样一个查找表,我们需要在内核的内存管理函数中添加代码以记 录和删除表中的项目只有分配的内存空间的引用( 例如首地址指针) 被实际返 回给模块的那些分配
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北京市2025北京市事业单位面向退役大学生士兵定向招聘458人笔试历年参考题库附带答案详解
- 休宁县2025年安徽黄山市休宁县引进高层次紧缺人才7人笔试历年参考题库附带答案详解
- 2025陕西核工业工程勘察院有限公司招聘(21人)笔试参考题库附带答案详解
- 2025湖南永州市潇湘兴业集团公司选聘急需紧缺专业人才25人笔试参考题库附带答案详解
- 2025浙江宁波市奉化区融媒文化发展有限公司招聘3人笔试参考题库附带答案详解
- 2025广东清远市东胜服务有限公司招聘5人笔试参考题库附带答案详解
- 2025年芜湖市国企招聘9人笔试参考题库附带答案详解
- 2025年山东省国控设计集团有限公司社会招聘8人笔试参考题库附带答案详解
- 2025年国网浙江省电力有限公司校园招聘行程发布笔试参考题库附带答案详解
- 2025年合肥市智慧交通投资运营有限公司社会招聘12人笔试参考题库附带答案详解
- 2025年度国务院国资委干部教育培训中心招聘(2人)笔试备考试题及答案详解(历年真题)
- 2025司法协理员考试模拟题及答案
- 2025年北京市家庭居室装修工程施工合同
- 事业法人登记管理办法
- 承装修试许可证管理办法
- 2025楼宇平方效益评价规范
- 术后并发症护理
- 第9课《天上有颗“南仁东星”》课件 2025-2026学年统编版八年级语文上册
- 粪污清运服务管理制度
- 医疗机构动火管理制度
- 孵化基地制度管理制度
评论
0/150
提交评论