APP下载

浅谈JAVA语言环境下安全策略的实施

2011-12-30

中国新技术新产品 2011年7期
关键词:安全策略表达式调用

王 畅

(杭州国际服务工程学院,浙江 杭州 310000)

1 安全策略形式定义

基于规范的入侵检测技术在描述和实施安全策略方面起着指导性作用,本文把安全策略看做是监控一个程序的执行使其行为不会破坏系统安全的准则。从执行的角度看,Java程序的行为可以粗略的看成是方法调用序列,有些方法可能是本地方法,会调用C语言函数库,某些C库函数又可能调用系统调用,这些都构成系统的潜在威胁。为了消除一些不正当的调用序列可能给系统带来的威胁,一个基于模式的检测方法被应用到系统安全领域当中,这一方法的核心是如何定义和实施安全策略。以系统调用为例,如果将系统调用抽象为事件,那么系统调用的参数就成了事件参数,在系统调用序列中,一些系统调用的规律性出现将被理解成一种模式。反过来,这样的模式就能够匹配许许多多这样的系统调用序列,以检查这些系统调用序列是否安全。这便是基于模式的检测方法的核心思想。安全策略可以定义在系统调用上,也可以定义在 JNC上,然而无论是定义在哪一级,都和安全策略的组织形式无关,下面从事件开始讨论安全策略的组织形式。事件:是安全策略中最基本概念,是模式的组成部分,也是最简单的模式,是某一事件集中的元素,包括事件名和参数,可以将 JNC调用或系统调用以及它们的返回看成事件。当被监控程序的执行匹配了为其定制的某一模式,监控程序将采取包括终止其执行在内的手段来保护系统安全,这便是规则。

2 程序整体结构

通过修改Kaffe源码实现Java代码的执行监控,改进了安全策略实施框架:安全策略首先用SPDL语言定义出来,然后经过编译转换成扩展自动机EFSA的中间表示,最后在监控程序的辅助下强制实施。进程级的监视对于在Java层面所看不到的Linux系统调用部分仍然是有效的。整个安全策略的实施过程分为两种情况,第一种情况:监视进程(父进程 moni)首先启动,在读取安全策略之后把它编译成扩展有限自动机 (EFSA)的形式,利用 fork()和 exec()系统调用启动经过修改的 Kaffe。此时,监视进程和 Kaffe进程同时工作:Kaffe的作用是解释 Java字节码,处理可能来自用户的输入和输出;父进程的作用是监视子进程的运行,实施安全策略,可能对子进程发出强制措施的指令,并写入监控记录,直到子进程终止,父进程退出。父子进程互通消息是通过信号实现的。在另一种情形下,也就是安全策略的事件集为 JNC调用的情形,父进程在编译完安全策略后,就进入等待状态,直到子进程退出。这时,Kaffe在解释主函数之前载入安全策略的 EFSA模型,安全策略的实施引擎将作为动态链接库的形式在 Kaffe上执行。整个程序的模块组成主要有四大部分:(1)支持模块:主要有Hash表,双向链表,数组,读写文件缓冲区等。读写文件缓冲主要是为了提高读写速度,提高程序效率,其中写缓冲可以写入文件,也可以写入屏幕缓冲区,或管道等,根据程序具体情况或有不同,给程序带来极大灵活性。(2)安全策略分析模块:包括词法分析,语法分析和语义分析。(3)EFSA内部表示:包括 EFSA内部表示的各种表结构和将这些结构写入或读出文件的方法。表结构包括变量表,事件表,转换表和终止状态表,当需要写入文件时,把这些表数据安顺序写入写缓存;当需要读出文件内容时,通过词法分析程序,按照EFSA文件格式顺序读取内容到内部表示。(4)安全策略实施模块:通过一种实施机制实施 EFSA模型。在本文看来,实施模块与实施机制是不一样的,实施机制是具体到与系统相关的情况,或是进程级的监视,或是进程内部实现,包括派生 kaffe进程,注册信号和监视系统调用等,是面向系统调用或 JNC调用的。

3 安全策略的编译分析过程

安全策略语言经过编译以后,得到一种EFSA形式的内部表示,这种内部表示不仅要包含安全策略语言提供全部信息,还要求实施过程的效率要高。分析过程包括词法分析,语法分析和语义分析。词法分析的另一个作用是将字符串常量转换为字符串内部数据,存入 Hash表中,获得字符串的句柄。无论是模式子树还是表达式子树,它们都是已经按照操作符的优先级顺序表示的,模式子树将在语义分析时转化为自动机,表达式子树将在语义分析时转换为可执行的二叉树表示。语义分析是分析过程中最关键的一环,因为它要将语法树转换为 EFSA内部表示。转换过程包括三个主要方面:一是在构造变量表的过程中,要解决变量类型,重名和初始化等问题;二是将用正则表达式表示的模式转化为自动机的过程;三是将可执行的表达式转化为二叉树的表示形式,以方便执行。下面分别讨论三个方面。1.在构造变量表时,作如下规定:(1)规定全局变量声明或在事件参数表中出现的变量为变量的定义性出现,在表达式或语句中出现的变量为变量的使用性出现,定义性出现的变量需要解决类型,重名问题,使用性出现的变量需要解决类型相容性的问题。(2)全局变量需要声明,指定类型,且不能重名。(3)局部变量(又称规则变量)根据事件集中事件的描述确定其类型。(4)用变量名和规则编号的二元结构标识一个变量,指定全局变量的规则编号可以为任意,这样规则变量之间可以互相不影响,若全局变量和局部变量重名,则认为是全局变量。2.实际上,构造自动机的过程,是确定状态转换矩阵和事件表两个过程。3.主要是将树形结构的表达式转换为二叉树形式。表达式子树在一般情况下每个节点之多有两个子节点,但序列运算符除外(如函数调用实参和语句序列),这时只需要将序列运算符下多个子节点顺序的转成二叉树即可。

4 监控程序的实现细节

在实施之前,还需要将内部表示中的状态转换矩阵变成图结构,因为用稀疏矩阵表示的状态转换表很不利于查找,所有将其转换为邻接表表示。本文最终要实现的是一个监控程序,是基于Linux操作系统上的用户级的一个进程监视另一个进程。监控程序的实现分三步:第一步,修改 Kaffe源码,重新编译 Kaffe。Kaffe在解释执行 Java主方法前,根据命令行参数中的最后一个参数决定是由监视进程实施安全策略,还是由自己,若是由监视进程实施,则发送一个开始监视的信号给监视进程;若是由自己实施,则需要载入 EFSA模型和实施引擎。主要的监视工作应该在 Kaffe中 sysdepCallMethod()函数之前和之后插入代码完成。第二步,用 ptrace()系统调用进行进程监视机制,因为 Java语言提供的本地方法调用,使得连Kaffe自己也不知道它所要解释的Java方法有没有进行系统调用,所以必须用进程级的监视,这才是监视进程的工作重点。

监视进程在fork()调用和exec(kaffe)调用之间要进行ptrace(PTRACE_TRACEME)调用,使Kaffe处于被监视状态,之后监视进程的每次ptrace(PTRACE_SYSCALL)中断说明Kaffe进行系统调用或返回。其中,ptrace(PTRACE_PEEKUSER可以获得系统调用号,用参数 ptrace(PTRACE_GETREGS,®s)可以获得系统调用的相关参数信息,用ptrace(PTRACE_PEEKUSER)可以获得系统调用返回值的信息。第三步,给出实施细节。从事件发生开始,首先查找从当前状态表出发的是否有与之匹配的边,再匹配参数类型,给变量赋值,检查条件表达式是否为真,然后更新当前状态表,更新环境,最后如果当前状态表与终止状态表有交,则执行终止状态所对应的动作函数。

[1]金成植.程序理论和技术[M],吉林大学出版社,1997

[2]刘磊等.编译程序的设计与实现[M],高等教育出版社,2004

猜你喜欢

安全策略表达式调用
基于认知负荷理论的叉车安全策略分析
基于飞行疲劳角度探究民航飞行员飞行安全策略
一个混合核Hilbert型积分不等式及其算子范数表达式
表达式转换及求值探析
核电项目物项调用管理的应用研究
浅析C语言运算符及表达式的教学误区
LabWindows/CVI下基于ActiveX技术的Excel调用
浅析涉密信息系统安全策略
基于系统调用的恶意软件检测技术研究
如何加强农村食盐消费安全策略