您的位置:控制工程论坛网论坛 » 电机与运动控制 » Windows下基于主机的访问控制研究与实现

willow

willow   |   当前状态:离线

总积分:105  2024年可用积分:0

注册时间: 2005-11-29

最后登录时间: 2018-05-11

空间 发短消息加为好友

Windows下基于主机的访问控制研究与实现

willow  发表于 2005/12/16 9:53:02      2149 查看 2 回复  [上一主题]  [下一主题]

手机阅读

摘要:针对目前的主机安全现状,提出了一种称之为WHIPS(Windows下的主机入侵防御系统)的主机访问控制系统,它能够对操作系统安全起至关重要作用的系统调用进行控制。WHIPS是作为一个内核驱动而实现的,也称之为内核模块,它完全使用的是Windows内核的未文档化结构,不要求对内核数据结构和算法进行修改。WHIPS对应用程序进程是完全透明的,应用程序进程的源代码不用进行任何修改和重新进行编译就可以继续正确工作。 关键词:访问控制 特权进程 关键系统调用 本机系统服务 API 系统调用截获 0引言 通过对应用程序进程唤起的系统调用进行监视,对该系统调用运用安全规则进行判决的策略,提出了基于Windows的访问控制系统的设计和实现。该模型在系统调用接口进行系统调用截获来实现访问控制功能。在调用进程和传递给系统调用的参数值服从了核心态访问控制规则数据库(ACR)中的访问控制规则后,方可执行本次系统调用。 1Windows系统服务调用和关键的截获技术 1.1Windows系统服务调用 用户进程对操作系统的访问是通过操作系统提供的系统服务来实现的。Windows通过NTOSKRNL.EXE模块来提供操作系统服务。NTOSKRL.EXE模块提供给用户使用的接口是称为NTDLL.DLL的模块,该模块使用INT 2E指令向NTOSKRNL.EXE模块请求系统服务,INT 2E指令会造成应用程序从用户态向核心态的切换,之后NTOSKRNL.EXE模块执行用户请求的系统服务调用来完成用户要实现的功能。APIs是驻留在动态链接库中的应用程序编程接口,这些APIs可以运行在用户态也可以运行在核心态。在这里,我们把代表Windows系统服务并且运行在核心态的APIs称为native APIs(本机系统服务),把运行在用户态APIs简称为APIs。 1.2Windows系统服务分发 在windows 2000和NT系统中,系统服务分发是通过INT 2E这个软中断来实现的。中断INT 2E是系统的系统服务分发子程序,他的具体功能是由Windows内核的核心函数KiSystemService()来实现的。当通过指令INT 2E陷入核心态后,KiSystemService()被唤起,然后分发程序进行了一系列的控制处理: ◆验证EAX寄存器传递进来的SID(服务标识符)是否有效。(在不同的操作系统中,系统支持的系统服务的数目是不同的。) ◆验证EDX寄存器传递进来的系统服务需要的参数数目是否正确。 ◆如果各种检查都通过了,就调用核心态的系统服务。否则,拒绝访问核心态的系统服务。 KiSystemService()使用SDT(服务描述符表)这样一个结构进行服务的具体分发。当SDT由KeServiceDescriptorTable的数据结构来描述时,它管理着NTOSKRNL.EXE导出的native APIs;当SDT是由KeServiceDescriptorTableShadow所代表的数据结构来描述时,它管理Win32k.sys导出的User32.dll和Gdi32.dll中的函数的具体实现。 1.3Windows系统服务截获的分类 操作系统的系统服务调用截获包括两种类型的截获: 1.3.1用户态截获 在windows操作系统中,有许多中方法可以实现对用户态APIs调用的截获。比如可以借助VxD(虚拟设备驱动程序)或者设备驱动对用户态APIs进行截获,还可以利用注入DLL来实现对用户态整个APIs的截获工作。这种截获技术的优点时所有被截获的APIs都是完全文档化的,因此我们知道每一个API调用的参数,这使得编写截获模块更容易。 1.3.2核心态截获 在windows操作系统中,核心态的截获可以通过编写内核驱动程序来实现。在这种方法中,内核提供的native APIs被截获。核心态截获的优点是可以监视事件的发生是由于用户态调用还是核心态调用而引起的。这种截获技术的困难在于:首先是获取传递给核心态的native APIs的参数,因为核心态的多数系统服务是未文档化的;其次,传递给核心态调用的参数可能和传递给用户态调用的参数不同;最后,一个用户态API调用的实现可能要调用多个核心态API。在这种情况下,对核心态APIs调用的截获实现起来就更加困难。一般来说,核心态的截获实现起来更困难一些,但是可以收到许多意想不到的效果。 1.4Windows系统服务用户态截获技术 1.4.1复制动态链接库 这是最容易想到的用户态API截获办法。假设我们相对目标进程PSAPI的所有调用进行截获,我们必须创建自己的PSAPI版本,它导出的函数和我们准备拦截的目标进程的调用函数完全一致。如果我们把自己创建的PSAPI的DLL复制到目标进程的地址空间来代替原始的psapi.dll,进程启动的时候,我们创建的psapi.dll被加载。所有对psapi.dll的调用将是对我们创建的psapi.dll的调用,所以我们可以在自己创建的新的动态链接库中作相应的处理并调用原始的动态链接库中的函数。 1.4.2修改输入地址表 改写输入地址表这种方法主要得益于现如今Windows系统中所使用的可执行文件(包括EXE文件和DLL文件)的良好结构――PE文件格式(Portable Executable File Format),因此它相当稳健,又简单易行。 1.5Windows系统服务核心态截获技术 1.5.1截获系统服务表 这种方法对于拦截 Native API 来说用的比较多。原理就是通过替换系统导出的一个 SERVICE TABLE中相应的Native API的地址来达到拦截的目的。 1.5.2截获系统调用软中断 这种方法对于跟踪、分析系统调用来说用的比较多。原理是通过替换 IDT(中断描述符表)表中的 INT 2E 中断,使之指向我们自己的中断服务处理例程来实现的。 1.5.3截获PE文件格式的输入地址表 这种方法对于拦截、分析其他内核驱动的函数调用来说用的比较多。原理是根据替换 PE 格式导出表中的相应函数来实现的。此方法中需要用到一些小技巧。如内核模式并没有直接提供类似应用层的GetModuleHandle()、GetProcAddress()等函数来获得模块的地址。那么我们就需要自己来编写,这里用到了一个未公开的函数与结构。ZwQuerySystemInformation 与 SYSTEM_MODULE_INFORMATION 来实现得到模块的基地址。这样我们就可以根据PE 格式来枚举导出表中的函数来替换了。但这又引出了一个问题,那就是从WINDOWS 2000 后内核数据的页属性都是只读的,不能更改。内核模式也没有提供类似应用层的 VirtualProtectEx() 等函数来修改页面属性。那么也需要我们自己来编写。因为我们是在内核模式所以我们可以通过修改 CR0 寄存器的写保护位来达到我们的目的。 2利用访问控制的WHIPS的实现 WHIPS是一个集检测和保护Windows系统调用于一体的内核模块。它利用Windows内核中未文档化的数据结构和DDK(设备驱动开发包)中提供的用于驱动程序开发的一些子程序来实现的,该模块可以看成是对Windows系统调用的截获和控制。 2.1WHIPS参考模型 访问控制机制的建立主要依据三种类型的信息: (1)主体(Subject):发出访问的主动方,一般是用户或用户的某个进程。 (2)客体(Object):被访问的对象,包括数据、信息、网络服务、进程、网络设备等。 (3)访问控制策略:用以确定主体对客体是否拥有访问能力。 WHIPS系统模型如图所示:首先是术语介绍:AEF:访问执行模块 ADF:访问判决模块 ACI:访问控制信息 ACC:访问控制上下文 ACR:访问控制规则库 模型的工作机制是这样进行的:整个模型有两大模块组成,AEF提供了计算机系统中运行的进程所需要的系统服务或者对计算机系统的某种操作,ADF提供了表述系统安全访问控制策略的规则集。设想当某个进程调用一个打开文件读操作的系统调用,内核的AEF模块会向内核的ADF模块发送消息来发现进程的访问请求是否有效。消息中必须包含ADF模块进行访问决策所使用的访问控制信息ACI,ACI中包含许多可能的信息选项,其中一些必要的基本信息有请求进程的标识,被访问文件的标识以及进程和文件的属性,内核的ADF模块也可以使用其他的访问控制上下文信息如访问的时间地点进行访问判决。之后ADF模块把判决结构返回给AEF模块,如果判决结果是允许这次系统调用,最后有AEF模块来完成打开文件这一系统调用。否则,返回一个错误消息给AEF模块。 WHIPS系统模型结构图 2.2WHIPS核心模块的介绍 2.2.1访问判决模块(ADF) 该模块的主要实现功能是对已经截获的敏感系统调用运用ACR(访问控制规则库)制定的访问控制规则进行安全性判决,并把判决结果返回给AEF模块,最后由AEF模块根据返回的结果执行相应的操作。在WHIPS模型中,ACR是作为一个简单的文本文件来实现的。在ACR中,每一条访问控制规则的结构定义如下: Rule Type:可以是debug或者rule。类型是rule时,这意味着将对系统调用进行过滤审查。类型是debug时,只是对敏感的系统调用进行跟踪而不进行过滤审查。Process Name:代表了调用敏感系统服务的可执行映像的名称,该名称仅仅是标识进程的一个字符串,不包含可执行映像的完整路径。WHIPS模型的核心模块都工作在核心态,因此它不能够通过获取可执行映像的完整路径来访问进程块。这些信息仅仅是提供给用户态使用的。Native API Name:进程调用的以前缀Nt开头的敏感API的名称。Param API[1…N]:敏感系统调用所使用的真实参数。ADF就是运用ACR中制定的这些规则来对进程调用的敏感系统调用进行安全性检查的。 2.2.2访问执行模块(AEF) 该模块的主要功能是对敏感的系统调用进行截获并且通过向ADF模块发送消息机制来对调用的安全性进行判决。该模块的实现结构如图所示:在WHIPS模型中,AEF模块的核心实现部分是系统截获模块,整个截获模块主要通过三个功能代码段来实现的。这里核心态采用的截获技术是Hook Service Table。功能代码段1示范了在windows OS中所有驱动程序的通用主函数。该主函数不驱动系统的任何外围设备,它做的唯一工作是当系统启动时调用HookServices函数。代码2示范了WHIPS模型中核心态系统调用的截获实现。它的第一个工作是调用LoadDB函数把ACR数据库加载到内核内存中;第二个工组就是利用一个宏SYSTEMSERVICE把原始native API保存到OldNtApiName中,然后用新的native API对原始的与安全相关的敏感native API进行替换。代码3演示了替换后的native API的具体实现过程。例如进程调用NtOpenProcess时,替换后的native API NewNtOpenProcess被执行。它首先对传递进来的参数进行分析。然后它把这些数据保存到一个rule的临时结构中,这里的临时rule结构与ACR中定义的rule结构类似。接着判断调用进程是否是危险进程。我们可以知道某个进程是否是危险进程是基于我们对与操作系统安全性相关联的系统调用进行了截获,如果某个进程对代码2中示范的敏感的native API进行了调用,那么该进程就是危险进程。函数IsProcessDangerous会对调用进程的安全描述符进行分析,当该函数返回TURE时,说明该进程是危险进程,否则不是。函数VerifyDebugNativeAPI()则分析是否对调试环境中的native API调用进行跟踪,而函数VerifyNativeApi()则对ACR中的rule表项进行遍历,来查找在ACR中是否有跟临时rule结构相匹配的rule表项。当该函数返回TURE时,在函数HookServices中保存的原始的native API,也就是OldNtOpenProcess()被调用。否则,访问被拒绝。 2.3WHIPS设计实现对应用程序和系统性能的影响 WHIPS完全运行在内存中,对内存的占用也比较少。所以,它可以对系统调用进行快速判决而不用访问磁盘。对已知和未知攻击进行阻止的价值远远抵消了对系统性能的影响。其他的主机安全产品占用了太多的系统资源。如果把传统的基于主机的IDS的全部功能都打开的话,对CPU的占用率很容易就达到了50%。像文件完整性检查,会大量占用CPU时间,频繁的访问磁盘,造成磁盘吞吐量和响应的延迟。 3结束语 利用上述的关键技术,通过对系统安全起至关重要的敏感APIs的调用进行截获并对其实施访问控制判决来大大的提高主机系统的安全性,并且对主机的性能影响微乎其微。 参考文献 1PrasadKabak,SandeepPhadke,MilindBorate.UndocumentedWindowsNT. John Wiley&Sons,1999 2DavidASolomon,MarkERussinovich. Inside Microsoft Windows 2000,Third edition. Microsoft Press,2000 3Johnson M. Hart. Windows System Programming, Third Edition Addison Wesley 2004 4Sven B.hreiber, Undocumented Windows 2000 Secrets,Second Edition Addison Wesley 2001 5Walter Oney Programming the Windows Driver Mode, Second Edition, Microsoft Press,2003 6Leonard J. LaPadula, Rule-Set Modeling of a Trusted Computer System
1楼 0 0 回复
  • july

    july   |   当前状态:离线

    总积分:86  2024年可用积分:0

    注册时间: 2005-11-25

    最后登录时间: 2018-05-11

    空间 发短消息加为好友

    july   发表于 2005/12/14 9:28:56

    re
    2楼 回复本楼

    引用 july 2005/12/14 9:28:56 发表于2楼的内容

  • runner

    runner   |   当前状态:在线

    总积分:114  2024年可用积分:0

    注册时间: 2005-11-26

    最后登录时间: 2018-05-11

    空间 发短消息加为好友

    runner   发表于 2005/12/16 9:53:02

    qiang
    3楼 回复本楼

    引用 runner 2005/12/16 9:53:02 发表于3楼的内容

总共 , 当前 /