多独立安全级别 (MILS) 操作系统支持安全部署多个应用程序,每个应用程序表示属于不同安全领域的数据。编写用于使用 MILS 操作系统部署的软件需要注意主流操作系统上不需要的细节。在 MILS 操作系统中集成 Java 虚拟机 (VM) 可简化 MILS 应用软件的开发。
通常,多独立安全级别 (MILS) 操作系统是更通用的实时操作系统的特殊配置,旨在简化支持多个独立安全级别的软件系统的开发。这种系统在军事场景中尤其常见,例如,同一计算机系统可能需要将属于一个国家政府的绝密数据与属于北约等政府联盟的机密数据隔离开来(图1)。
图1:配置为限制分区之间信息流的安全 MILS 操作系统
从概念上讲,MILS 操作系统维护逻辑分区以隔离内存、CPU 时间和特定应用程序可访问的其他资源,并限制在不同逻辑分区中运行的应用程序之间的交互。为一组特定的应用程序配置 MILS 操作系统允许开发人员建立控制分区之间交互的规则。例如,规则可能声明仅允许分区 A 将消息传递到分区 C 和 D。
MILS 分区的理想是降低证明系统足够安全所需的安全审核成本。操作系统的分区实现由操作系统供应商认证为安全,此认证的费用由所有被许可方分担。鉴于操作系统可以保证在不同分区中运行的应用程序之间没有通信,因此了解和记录每个应用程序的安全敏感行为所需的工作量要少得多。将 Java 虚拟机 (VM) 添加到 MILS 操作系统可极大地简化应用程序软件到 MILS 环境的移植和开发。
案例研究:在 MILS 环境中部署软件的实用性
为了便于安全审计以确保独立分区之间没有通信,开发 MILS 操作系统的公司通常会将操作系统提供的服务集限制为在 MILS 分区内运行的应用程序。每个 MILS 环境在有效执行 Java 虚拟机方面都面临着不同的挑战。让我们看一下应军事和航空航天工业客户的要求将实时虚拟机产品移植到特定的商用现货 (COTS) MILS 操作系统时遇到的一些问题。
在此 MILS 操作系统中遇到的限制中,此 MILS 操作系统为确保系统安全而实施的一些约束包括:
无法写入程序的文本段。
系统没有提供用于设置环境变量的命令行工具。
该系统不支持本地图书馆的动态链接。
虽然不是此 COTS MILS 操作系统的一般限制,但我们客户的目标平台缺少文件系统。
鉴于这些限制(这是深度嵌入式 MILS 部署的典型限制),很明显,在大多数现成的应用程序在此环境中运行之前,需要大量的移植和集成工作。Java的可移植性提供了显著降低这种移植和集成工作成本的潜力。
Java 与 MILS 应用的相关性
Java与安全软件的开发特别相关,因为该语言比C和C++更强烈。自从早期开发专注于互联网应用程序的Java语言以来,安全性在其设计中一直至关重要。例如,Java禁止指针和非指针数据类型之间的强制,并且禁止指针算术。此外,每次访问 Java 数组都会执行数组边界检查。抛出异常,而不是允许软件应用程序超出数组有效数据的末尾。同样,Java 运行时环境会检查堆栈溢出并引发异常,而不是允许线程践踏超出线程分配堆栈末尾的内存。通常,Java 语言中内置的这些安全功能完全消除了通常在特洛伊木马和病毒软件的实现中利用的绝大多数漏洞,这些漏洞通常会感染 C 和 C++ 应用程序。
Java的一个优势与在MILS环境中实现新软件功能的挑战特别相关,因为与更传统的语言相比,Java显着减少了实现,移植和将独立开发的软件组件集成到工作应用程序中所需的工作量。代表性项目发现,开发人员在开发新功能时的效率通常是其两倍,而在使用 Java 而不是 C 或 C++ 工作时,重用软件组件的工作效率通常提高 10 倍。这是因为 Java 语言支持更高级别的抽象,更具可移植性,并且鼓励比 C 和 C++ 更紧密的封装。这些好处的价值在经验报告中得到了强调,如图 2 所示。
图2:Java与开发专用、安全的专用系统的相关性
内置的跟踪垃圾回收功能(可自动回收与应用程序不再相关的动态分配对象的内存)是一项 Java 功能,它使将独立开发的 COTS Java 组件集成到 MILS 应用程序中变得特别容易。每当一个对象由一个组件分配并由其他组件使用时,C 或 C++ 工程师都需要设计和实现一个协议,用于检测对象的使用寿命结束并回收其当时的内存。使用Java,自动检测和回收死对象,并且回收的内存会自动进行碎片整理,这是大多数自动垃圾收集技术的宝贵副作用。除了减少开发和集成软件组件所需的智力工作外,此功能还消除了调试与悬空指针、内存泄漏和内存碎片相关的许多常见内存管理编程错误的需要。
因此,能够用Java语言实现MILS应用程序是非常可取的。该语言比 C 和 C++ 等传统传统语言更安全,它减少了实现定制功能所需的工作量,并且在重用和集成独立开发的软件组件期间节省了大量成本。
将 Java VM 移植到 COTS MILS 环境
要在 MILS 分区中部署 Java 软件,首先需要在 MILS 分区中安装 Java 虚拟机运行时环境。Java 虚拟机提供标准 Java 库、Java 类装入器、Java 字节码解释器和/或实时 (JIT) 编译器,以及跟踪垃圾回收器的实现。有了 Java 虚拟机,Java 编程的所有传统优势都很容易获得。
鉴于 MILS 环境提供的服务通常比同一操作系统的类似非 MILS 配置少得多,因此已配置为在传统或实时操作系统上运行的虚拟机产品可能不会在 MILS 分区中运行。最近,一位客户要求我们为特定的 COTS MILS 操作系统环境提供虚拟机支持。
由于 MILS 环境施加的 MILS 限制,有一些 Java 功能无法得到支持。但在大多数情况下,所描述的虚拟机技术的 MILS 配置支持所有标准版 Java。以下五个部分构成了 Java 配置的基本原理和可用解决方法的案例研究。
#1 – 高保证网络堆栈 (HANS)
根据其支持提高安全性的目标,客户选择的 MILS 操作系统在分发时可以选择使用高保证网络堆栈。此网络堆栈在隔离的 MILS 分区中运行,允许它以非常高的优先级运行,而不会影响为其他 MILS 分区预算的公平 CPU 时间份额。将网络堆栈放在自己的小分区中,可以将堆栈与单个应用程序中的错误隔离开来。不同分区中的应用程序可能会崩溃并重新启动,而不会影响 HANS 的完整性。此外,HANS 消耗的 CPU 时间和内存资源受到其运行分区约束的限制。这为网络堆栈实现提供了针对拒绝服务攻击的某些保护。
鉴于专用于 HANS 实现的内存量和 CPU 时间受到 MILS 操作系统的限制,只有 HANS 分区本身受到另一台计算机的网络通信请求的影响,以高于其准备处理的速率与此计算机进行交互。虽然在这种情况下,HANS 可能会丢弃数据包,但在其他 MILS 分区中运行的应用程序不会受到拒绝服务攻击的影响。
虚拟机与此 MILS 环境的集成支持 HANS 的使用,从而适应了 HANS 和标准网络堆栈 API 之间的少量差异。特别是,HANS 未枚举为特定 MILS 虚拟板配置配置的网络设备。相反,命令行选项允许系统集成商提供已配置网络设备的列表。域名服务函数 gethostname() 和 hostGetByName() 也不被 HANS 支持。Atego Perc Ultra 虚拟机技术的 MILS 集成为客户提供了在必要时使用这些服务的专有基于表的查找来实施这些服务的机会。
#2 – 不调试已编译的代码
由于 MILS 环境禁止写入文本段,因此无法在静态编译并链接到运行时映像的 Java 代码中设置断点。
但是,需要调试功能的 Java 开发人员可以使用几种方法。首先,由于Java是一种可移植的编程语言,因此通常可以在功能更全的平台上完全调试应用程序,然后将调试后的应用程序部署在MILS平台上。其次,如果在 MILS 环境中调试是绝对必要的,那么仍然可以调试以解释字节码运行的 Java 应用程序。
#3 – 没有动态加载本机库
许多 Java 应用程序由 Java 和本机代码的组合组成,通常用 C 或 C++ 编写。当本机组件是 Java 应用程序的一部分时,最常见的是在 Java System.loadLibrary 服务的指导下动态加载本机代码。此服务在实时虚拟机的 MILS 集成中不可用。相反,系统集成商可以选择静态链接本机库。
#4 – 专用虚拟文件系统
为了支持缺乏文件系统支持的 MILS 平台,我们实现了虚拟文件系统作为 MILS 端口的一部分。此虚拟文件系统允许 Java 应用程序创建、写入和读取存储在内存中的文件数据。虚拟文件系统的可用性使得测试虚拟机实现和将现成的 Java 代码移植到 MILS 平台上变得更加容易,否则这些平台将缺少文件支持。
#5 – 没有环境变量
环境变量通常用于保存关键配置数据,以方便用户。环境变量指定的配置选项不需要在每次启动应用程序时在命令行上重复。由于 MILS 环境不为用户提供设置环境变量的能力,因此这种便利性通常不可用。相反,MILS Java 应用程序通常以命令行参数的形式接收配置数据。
Java降低了成本,增加了MILS软件系统的可靠性
在 MILS 操作系统分区中启用 Java 开发非常有意义。虚拟机技术(如Atego Perc Ultra)使得在MILS上运行标准版Java成为可能,为利用多个独立安全级别的项目提供成本节约和可靠性优势。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !