高完整性软件在电信、运输、国防系统、工业自动化和电源管理中发挥着关键作用。由于如果软件失败,可能会造成人员生命损失和巨大的经济成本,因此高完整性软件的开发采用了对软件开发过程施加更严格要求的实践。这种严格性包括系统需求、架构、设计、测试计划和源代码的文档;发展问责审计追踪;对所有开发工件进行独立的同行评审;完整的可追溯性分析;以及广泛的测试覆盖。增加严密性的目的是确保软件的正确操作和可靠性。

随着计算机自动化范围和影响的扩大,高完整性软件的规模和复杂性也在扩大。为了处理由于高完整性软件角色的不断扩展而增加的开发工作量,军事和航空航天行业正在使用Java编程语言的安全关键子集,以帮助提高开发人员的生产力,并降低与高完整性软件相关的维护成本。

高度集成Java

图片
图1所示。对安全性要求苛刻的开发环境。

高完整性Java的吸引力来自许多因素,包括大量熟练的开发人员、高质量的开发工具和现成的可重用软件组件。安全关键型Java概要文件的设计涉及许多权衡,一方面需要从传统Java中提取子集以实现经济有效的认证审计,另一方面又希望支持所有Java特性,这些特性有助于Java作为一种编程语言的基本吸引力。

在提出的安全关键型Java概要文件中提出的目标之一是在执行之前自动化Java源代码分析的能力,以建立软件将可靠运行的信心。该分析将能够确定在指定的时间限制内可靠运行的内存和CPU时间的数量。该分析还能够证明,许多可能出现在传统实时Java程序中的常见运行时错误,在正确构造的安全关键Java组件中永远不会发生。该分析不仅提高了已部署的高完整性软件组件的可靠性,而且为自主开发的软件组件的模块化组合奠定了基础。

在过去的一年里,Aonix(圣地亚哥,CA)一直在试验使用建议的源代码分析技术。到目前为止,我们已经分析了超过20,000行Java代码。其中大部分代码都是从传统Java应用程序移植过来的。有些代码最初是为使用Java的实时规范进行部署而开发的。其他代码是专门为在安全关键系统中部署而编写的。

该实验研究提出的其中一个问题是源代码分析系统施加的限制是否与典型安全关键软件的要求兼容。显然,有许多完全合法的甚至“正确”的Java程序,不满足安全关键源代码分析系统强制执行的严格规则集。然而,对于需要高完整性解决方案的大量问题,Aonix的研究表明,源代码分析技术与适合该域的软件解决方案完全兼容。

保留Java的主要优点

各方与开放集团合作多年,以建立安全关键的Java标准。最近,此活动导致将Java规范请求(JSR)提交给Java社区进程(JCP)。JCP为此特定主题分配了JSR号码302。虽然规范将采取的最终形式尚未解决,但这里描述了引导工作的常规思想。

最近的一项研究(《编程语言趋势的实证研究》,IEEE软件,2005年5 / 6月)预测,到2008年,Java语言将几乎是c++的两倍流行。该预测所依据的统计分析按相关性递减顺序列出了以下因素:(1)可移植性,(2)可扩展性,(3)通用性,(6)可靠性。在设计安全关键型Java子集时,我们认为保持这些关键的Java优势至关重要。因素4(简单性)和5(可实现性)具有负相关关系,这意味着软件工程社区倾向于偏爱那些不一定简单或容易实现的语言。

安全关键型Java软件的开发人员重视可移植性,因为这有助于容易地重用现成的软件组件,重用以前部署的安全关键项目中的软件,还因为它允许软件工程师在快速且内存丰富的桌面计算机上开发和测试他们的代码。

我们考虑上述研究中提到的可扩展性和一般性因素是我们作为可扩展性所表征的更广泛利益的方面。可伸缩性以多维测量。小软件系统需要逐步发展到较大的软件系统中,而无需更改,新分析或重新认证现有软件组件。软件必须从单个处理器平台扩展到多处理器平台。编写的软件符合严格的安全认证标准,应在没有安全认证要求的系统内干净地集成。

作为一种高级编程语言,Java鼓励早期检测编程错误,并支持运行时检测和错误遏制。大多数开发人员发现,用Java语言部署的代码比用C或c++实现的代码可靠得多。Java代码执行更强的编译时类型检查,通过字节码验证执行更强的集成一致性检查,并且它在运行时执行各种完整性检查,以防止数组下标错误和对空指针的解引用。

丢弃铃铛和哨子

许多传统的Java功能被认为不适合安全关键系统。虽然可以为硬,实时运行的自动垃圾收集,但实时垃圾收集系统的复杂性和难以实时操作的证明的应用程序分析必须是困难且昂贵的开发和维护。安全关键专家之间的共识是,使用替代的临时内存分配技术比尝试努力实时垃圾收集器的认证更安全,更经济。安全关键的Java配置文件建议使用Java(RTSJ)范围内存抽象的实时规范的安全子集。

大多数标准类库都对自动垃圾收集的存在做了各种假设。这些标准库通常与作用域内存分配策略不兼容。相反,安全关键概要文件将标准化标准Java库的一小部分。

在传统Java中,动态类加载是一个强大的功能,但它不适用于最高级别的安全认证。

提高Java的安全性

图片
图2。语际语通信协议。

对安全关键开发人员对安全关键显着意义具有重要意义的问题主要被传统的Java语言定义所忽视。在安全关键的Java规范中进行标准化的能力是:通过设备端口和中断处理抽象对硬件设备的便携式访问;特殊的字节代码验证要求,以确保使用范围内存分配协议不会导致非法分配,这可能导致悬垂指针;静态分析技术,用于自动确定特定线程的最大堆栈要求,以及特定代码序列的最大执行时间;与静态依赖性汇编和类静态初始化集成的杂交依赖关系分析,以消除启动竞争条件,并确保快速确定性启动。

尽管对于安全关键型Java的官方标准尚未最终确定,但Aonix已经开始对一些提议的技术进行试验。图1提供了实验开发环境的示意图。

软件工程师使用标准Java 5.0语法来开发其安全关键的Java软件组件。使用Java 5.0 Meta-Data注释系统将特定注释放入源代码中。标准Eclipse Java源代码编译器将源代码转换为传统的Java类文件。

Eclipse开发环境自动调用PERC Pico验证器,以强制Java程序只使用适合于安全关键子集的功能,并确保声明的注释接口定义、方法实现和方法的所有调用之间保持一致。如果Pico验证器遇到验证错误,将立即在Eclipse开发环境中报告这些错误,以便程序员可以在源代码中解决问题。请注意,字节码验证每次只执行一个类,而不需要完成或组装完整的程序。

在我们自己的实验中,我们发现用这个系统编译的代码比用传统的优化Java编译器实现的代码运行速度快三倍。代码运行得更快,因为不需要执行垃圾收集和RTSJ的作用域内存协议强制时通常需要的运行时开销。更重要的是,代码的CPU时间和内存需求更确定,运行时环境也更简单,因为没有自动垃圾收集或动态类加载支持。所有这些都使得部署的软件系统的分析和安全认证更加易于管理。

由于安全关键运行时环境比传统Java运行时环境简单得多,因此可以直接将安全关键Java代码与用Ada、C和c++编写的遗留安全关键组件结合起来。已经设计了一种特殊的协议,允许将安全关键型Java代码与传统Java代码进行高效和健壮的集成,以便部署在不需要完全安全认证的关键任务系统中。因此,该技术代表了使用传统Java Native Interface (JNI)协议的更有效和更安全的替代方案。软件组件之间的各种交互如图2所示。

通过对Java语言的使用实施特定的限制,就有可能开发和部署安全关键型和其他高完整性软件。现在正在建立标准以确保可移植性和互操作性。这些标准承诺为安全关键型开发社区提供传统Java的好处。

本文由加州圣地亚哥Aonix公司的首席技术官Kelvin Nilsen撰写。欲了解更多信息,请与Dr. Nilsen联系此电子邮件地址受到垃圾邮件程序的保护。您需要启用Javascript来查看它。,或者访问http://info.hotims.com/10960-403


嵌入式技术杂志

这篇文章首次出现在2007年1月的嵌入式技术杂志。

阅读更多的档案文章在这里