应用软件可信要素实现方法研究
2013-09-19王志勇李健孙迪
王志勇 李健 孙迪
北京工业大学计算机学院 北京 100124
0 引言
安全度量提供了一个信息系统安全管理体制,并能维持组织信息安全状况的持续改进。目前国内外研究较多的信息安全度量是关于信息技术或产品的安全度量、信息安全风险分析等相关理论和方法,并已形成相应的标准与规范,如ISO/ IEC 17799,ISO/ IEC 1333521,ISO/ IEC 15408等。这些标准对信息技术的安全性评估方法、系统或资产的风险分析要素等进行了系统的描述。
1 软件行为可信度量框架
科学的信息安全度量一般包括目标定义、需求分析、建立度量模型、设定安全基线、信息系统改进和安全控制等内容。
(1) 明确度量目标
度量目标就是一个组织实施信息安全度量的动机,它影响着度量所采用的指标以及相应的安全基线。信息安全度量的目标可以分为长期目标和短期目标。信息安全度量的长期目标包括:分析和判断信息安全态势、信息安全控制的有效性、为组织的信息安全管理和决策提供支持等。信息安全度量的短期目标包括:了解对某一项安全项目投入的效益、为调整近期的安全策略提供决策依据等。
(2) 定义信息安全需求
图1 信息系统安全需求分析
面对复杂的网络信息系统,全面、准确地分析其安全需求是实施度量的基础。本文建议通过以下步骤分析信息系统的安全需求。
① 界定研究对象,明确本系统信息安全的使命、目标和功能,分析系统在国家安全、社会稳定和经济发展中的地位和作用。
② 给出信息系统业务描述,包括本信息系统主要业务应用、业务流程和信息流程。
③ 针对本系统信息安全建设的使命、信息的重要程度、信息系统承载业务的重要程度、风险分析的结果、系统遭到攻击破坏后造成的危害程度等因素,确定本信息系统的安全的总体需求。
④ 进一步明确系统对信息和信息系统的保密性、完整性、可用性、真实性和不可否认性等安全属性的需求程度。
(3) 确定度量指标
根据组织的度量目标和信息系统的安全需求确定度量指标。度量指标的选取要遵循两个原则:定性与定量相结合原则和可操作性原则。在信息安全度量过程中会涉及到诸多不确定性因素,有些度量指标可以量化,而有些则无法进行直接量化。因此,需要坚持定性与定量相结合的原则。同时,信息安全度量所建立的模型,应满足量化计算的可行性,否则,会导致无法计算而得不到最终的评估结果。选取度量指标要以产生可计量的数据为导向,以便于比较。例如可以采用公式以便于分析,或选择参考点以追踪变化。百分比和平均数也是度量中常用的方法,有时也可以使用绝对数,这都取决于被考察对象的性质。
(4) 建立度量模型
建立度量模型有两个任务:一是分析各度量指标所占的权重;二是将各度量指标通过数学模型进行合成,且要保证模型的科学性。
(5) 设定信息安全基线
“基线”是一种用于度量或在度量中用于比较的基准。“基线”的概念已经应用于信息安全标准或规范当中,如美国联邦信息处理标准 FIPS199。本文把信息安全基线定义为特定条件下实现其安全使命和功能的基本安全需求。
信息安全基线是为了度量不同时段的安全状况所开发出的一套指标集,它将信息系统当前的安全状况与基线进行度量比较,可以了解当前的安全状态。基线会随着组织及其信息系统结构的变化而变化。如果一个组织增加了 50名新员工,或新配置了无线局域网办公环境,组织系统的正常运行会发生新的变化。这时,就需要为系统更新或添加新的安全基线指标。
(6) 制定信息安全度量制度
建立了信息安全度量模型和基线,就可以对组织的信息系统实施安全度量了。但是,确定信息安全度量周期、建立专职队伍、实施人员培训、将安全度量纳入组织的日常管理等等,则需要建立一套与度量目标相一致的度量制度。
2 基于行为声明的安全编译
前文提到,基于可信声明的软件行为监测离不开对软件在用户处运行时发生的真实行为的监测,这种监测数据一方面能够实时的对软件行为是否合乎声明的内容进行监测,另一方面也能对超出声明内容的软件行为做出反应。根据用户、软件、安全要求的不同,待选的反应方式包括日志、提示、阻断等。
随着软件技术的发展,软件运行的平台逐渐趋于多样化、移动化和云端化,复杂的软件运行环境使得第三方外挂的监测手段(类似传统防火墙、杀毒软件等)往往被开发人员有意或无意的绕开,使得其无法全面的检测到软件运行的真实信息。因此提出了基于安全编译的监测方案,软件运行的代码在部署运行前,通过安全编译生成最终运行的程序,同时在编译中对代码内容进行审核,达到从根本上对软件行为进行监控的目的。
2.1 安全编译的工作内容
安全编译是指在传统的代码编译流程中,加入安全组件,完成对代码进行安全检测、嵌入安全监测模块的任务。安全编译具有两个特点:一是具有安全检测功能,尽早发现程序中的安全隐患;二是编译器自身的可信性,保证程序能够被翻译成正确的目标代码(如图2)。.
图2 安全编译的工作内容
(1) 安全检测
在软件开发完成后,开发者需要撰写与代码相匹配的软件为声明,但是如何将软件行为声明与代码内容进行核对以检查代码是否合规的工作量极大,而编译器作为最早接触软件全部代码的工具,能够在编译初期便对软件代码进行安全检测,如果发生代码内容超出行为声明的范围时,能够及时的生成报告,确保开发者能够修改行为声明或软件代码而使二者内容真实匹配。
(2) 嵌入安全监测模块
在软件运行的真实环境中能够完全检测软件的行为是极其困难的,因此如果能够在编译时对在软件生成的代码中嵌入安全检测模块,在软件发生容易引发安全问题的关键行为(如IO读取、网络传输、用户关键信息读取等)时,向系统抛出信息,便于系统中的安全监测软件接收以实时了解软件的真实行为。
本文主要探讨如何在软件中嵌入安全模块,由于软件开平台日趋复杂,千变万化,因此主要选择了目前流行的Microsoft .NET平台下的单机软件编译过程进行探讨。在探讨研究完成后,可以逐渐扩展支持的语言和软件平台,远期希望能够将功能扩展至云平台上。
2.2 面向方面编程
面向方面编程(Aspect-Oriented Programming,AOP)是一种将函数的辅助性功能与业务逻辑相分离的编程泛型(Programming Paradigm),其目的是将横切关注点(Cross-Cutting Concerns)分离出来,使得程序具有更高的模块化特性。AOP是面向方面软件开发(Aspect-Oriented Software Development)在编码实现层面上的具体表现(面向方面软件开发AOSD是一个囊括面向方面分析、面向方面设计和面向方面编程等一系列概念的完整工程系统)。AOP包括编程模型和具体用于实现AOP的框架两部分。
下面对上文提到的定义进行一些解释。
在当前大多数支持面向对象的编程语言中(例如C#等),函数是表述程序功能的最小单元,而一个函数的代码层面往往同时含有核心业务逻辑和辅助性功能。核心业务逻辑指一个函数本身主要实现的业务功能,例如在一个在线电子商务系统中,“下订单”函数其核心业务逻辑是“新建订单”,而“提升会员”函数其核心业务是“提升一个会员的等级”。但是,一个函数除了核心业务代码外,往往还会有一些辅助性功能代码,如事务处理、缓存处理、日志记录、异常处理等等。而这些辅助性功能一般会存在于大多数甚至所有业务函数中,即形成AOSD中所谓的横切关注点,如图3所示。
图3 横切关注点示意
一般来说,在纯编译型语言(如 C、C++)等语言中实现AOP非常困难,必须完全从编译器角度入手。因此一般通过讨论托管型语言(如 C#,Java)中 AOP的实现方式来完成对AOP的支持。AOP的主要实现方式有编译时AOP和运行时AOP两种:
(1) 编译时AOP(静态织入)
编译时 AOP的实现思想是给语言的编译器做扩展,使得在编译程序的时候编译器将相应的 Aspect代码织入到业务代码的指定连接点,输出整合的结果。图4是编译时AOP的示意图(以.NET平台为例)。
图4 编译时AOP示意图
如图4所示,当使用静态织入时,带AOP扩展的编译器会在编译时将Aspect代码织入业务函数代码,形成整合后的IL,然后交由CLR运行。
(2) 运行时AOP(动态织入)
运行时AOP如图5所示。
图5 运行时AOP的示意图
如图5所示,运行时AOP的实现方式是将扩展添加到运行虚拟机而不是编译器。功能点和业务代码分别独立编译,而在运行时由虚拟机在必要时进行织入。
2.3 AOP框架下安全编译
图6 安全监测层
在安全编译中需要将安全模块嵌入到生成的最终代码中,同时又不希望这些模块影响软件已有的功能,因此选用AOP框架在代码中加入安全监测层来完成这一目的(图6)。
图7 安全编译流程
例如在C#语言编写的.NET平台应用中,我们通过撰写微软MSBuild编译器插件,将安全模块嵌入的功能嵌入到标准的编译流程中,得以在编译器遇到特殊的代码语句时,自动执行代码前后加入抛出信息的语句(图7)。这些抛出安全信息的语句不会对代码的正常功能产生的影响讨论如下:
(1) 功能影响
由于选用的安全监测语句基于标准的.NET平台消息技术,因此理论上不会对应用原有功能产生影响。为了便于软件开发人员对软件进行调试,在编译中提供了关闭安全消息通知模块嵌入的选项,得以排除是否由嵌入安全监测模块带来的对软件已有功能的影响。
(2) 性能影响
由于嵌入安全模块是在软件生成的最终代码中嵌入新的语句,因此理论上一定会对软件的性能产生影响,同时监测的粒度与软件的性能影响本身成为一对需要平衡的矛盾,监测的粒度越大,对软件本身产生的性能影响越大。因此在实际工程中,需要平衡这对矛盾,尽量在不影响软件性能的情况下,提高软件行为监测的粒度。
同时考虑到现有的软件应用,尤其是面对最终客户的软件应用,计算性能本身并非软件需要考虑的第一要素,而且现有的安全软件(防火墙、杀毒软件等)由于涉及到大量的跨线程、跨进程、跨内存区域的对软件应用的访问,会消耗更多的计算性能。而嵌入的安全模块与软件应用代码处于同一内存空间,不涉及上述耗费性能的访问工作,因此比较现有安全软件带来的性能营销较小。
3 结束语
本文通过分析软件可信要素的研究现状、从可信要素的植入方法入手,对安全编译等课题进行了研究与探讨。并且从静态、动态两个方向讨论了软件可信要素在编译层面的植入方法,并对其可能对软件可信监测做出的影响进行了研究。
软件行为的检测层面千差万别,切入点各异,文本中提出了统一的方法——即从编译环节植入可信要素——对其进行检测,同时保证不会对软件本身已有功能、开发流程产生较大影响。
后续的研究工作包括且不限于:植入的安全要素如何与行为检测平台通信、如何基于软件可信声明等手段对软件的行为做出反应等。
[1]刘克,单志广,王戟等.“可信软件基础研究”重大研究计划综述[J].中国科学基金. 2009.
[2]Saint-Germain R. Information security management best practice based on ISO/IEC 17799[J]. Information Management Journal. 2005.
[3]闫强,陈钟,段云所等.信息系统安全度量与评估模型[J].电子学报.2003.
[4]申瑞芬.高可信安全编译器的设计与实现[D].国防科学技术大学.2007.
[5] 石丹丹,王静,熊前兴.面向方面编程模式的探讨[J].武汉理工大学学报:信息与管理工程版.2005.
[6]靳小强,唐宁九,胡雪亮. .NET 平台利用 AspectSharp实现权限验证[J].计算机应用研究. 2006.
[7]杨帆.基于AOP技术的Web应用开发研究[J].Software Guide.2008.
[8]程虎.面向方面(aspect)的程序设计方法[J].信息技术快报.2005.