众所周知,使用软件分区,即在单独的环境中运行应用程序,有助于满足安全和安保要求。通常,虚拟机管理程序被视为最佳和/或唯一的解决方案,然而,这远非事实。虚拟机管理程序本身可能会带来额外的风险和漏洞。因此,本文提供了一种不同的方法:分离内核。
嵌入式虚拟机管理程序使多个操作系统能够在同一硬件平台上运行,最大限度地提高硬件性能,同时确保独立性。这些嵌入式虚拟化解决方案有时会带来安全和信息安全要求,其中关注点分离对于满足这些要求至关重要。然而,当涉及ISO26262或ISO21434等安全标准时,依赖虚拟机管理程序会引发信任问题并受到额外的限制。
虚拟机管理程序的替代方案是在实时操作系统中实现内核分离。这种方法允许在单个操作系统内分离,保证应用程序级分离而不是操作系统级分离。
嵌入式虚拟机管理程序:监管者的监管者
嵌入式虚拟机管理程序是一种软件,可让多个操作系统在资源受限设备的单个处理器上运行并共享资源。虚拟机管理程序充当操作系统的操作系统,允许它们根据预定义的方案共享CPU、内存和外设资源。也就是说,这是监管者的监管者,因此称为虚拟机管理程序。虚拟机管理程序可以是动态的(具有灵活的CPU数量和内存使用),也可以是静态的(具有固定的CPU边界和内存分配)。外围设备驱动程序可以是专用的,也可以在不同的操作系统之间共享。图1展示了一个典型的分离管理程序架构。
图1:典型的分离管理程序架构。
在软件架构中引入虚拟机管理程序进行分离并非没有挑战,因为它增加了复杂性。Hypervisor需要进行内存分离和保护以及不同工作负载的调度。它还需要管理虚拟客户操作系统及其自身的权限级别,同时平衡对硬件资源的访问。因此,虚拟机管理程序成为系统中权限最高的软件。
这套复杂的软件将代码添加到系统最关键的部分,并在硬件的最高特权级别上运行。虚拟机管理程序的实现必须安全可靠,否则添加虚拟机管理程序来增强安全性将不成立。因此,将具有大型代码库的虚拟机管理程序添加到系统最敏感的部分会增加很多漏洞风险。例如,查看常见的开源虚拟机管理程序Xen以及在国家漏洞数据库中列出的漏洞,有数百个之多。当尝试通过虚拟化来提高系统安全性时,这不是一个非常值得信赖的虚拟机管理程序。
软件分离内核:在单个物理系统上隔离域
软件分离内核由JohnRushby在1981年的一篇论文中提出,旨在创建一个类似于物理分布式系统的环境。它确保每个应用程序域都显示为单独的、隔离的机器,允许信息仅沿着已知的外部通信线路流动。内核通过在单个物理系统上创建隔离域或分区来提供高级别的安全性。它将这些分区严格分开,防止一个分区中的软件影响另一个分区中的软件。这可以保护整个系统免受恶意软件和未经授权的访问。
基于微内核架构,分离内核提供最少的服务,并依赖单独的服务来实现附加功能。这种设计减少了内核的攻击面并增强了其抵御攻击的能力。适当的分离内核提供相当于硬件隔离的隔离,使其不易受到漏洞的影响。一些分离内核,例如L4微内核已经过形式化验证,以确保正确运行。还有商业上可用的分离内核,例如GreenHillsSoftware的INTEGRITY实时操作系统。在分离内核实时操作系统环境中,应用程序级分离如图2所示。
图2:适当的分离内核提供相当于硬件隔离的隔离,使其不易受到漏洞的影响。
当防伪多个操作系统相同的资源时,某些实现可能会存在保持系统分离的性能问题。例如,类型1管理程序需要两次上下文切换才能在收到中断后运行关键任务。第一个中断被传递到管理程序,然后被处理并传递到客户操作系统以进行任务调度。分离内核解决方案只需要一个中断即可调度关键任务。尽管这是特定于实现的,但虚拟化在性能方面并不总是免费的,特别是对于关键任务或访问共享资源。因此,分离内核和管理程序性能可能是重要的设计考虑因素,并且需要针对嵌入式系统中的特定用例进行仔细的架构设计。
为什么需要分离?
由于多种原因,分离是必要的。在此分析中,列出了三个用例:
安全性:隔离同一操作系统的多个实例中的特定功能,以建立对特定资源的安全访问。
代码重用或遗留系统:使用多个不同的操作系统来重用功能,而不需要重新架构或重新实现。
混合关键性:采用多个操作系统来满足需要应用程序分离的安全或信息安全标准。
为了满足这些要求,通常会考虑虚拟机管理程序解决方案。然而,分离内核方法也可以满足这些需求,而无需诉诸虚拟化。对具有分离内核的三种不同用例进行更深入的分析,得出以下结论。
保护对特定资源的访问
如果底层操作系统的访问控制方法足够安全,则可以在应用程序级别实现受保护的资源访问。探索替代的分离内核操作系统而不是虚拟化可以帮助避免潜在的陷阱。这样的实现通常采用强制访问控制策略来实现这一点,并且可以利用操作系统机制来安全地共享这样的资源,例如专用外围设备访问。
无需重新架构或重新实施即可重用
由于项目控制之外的因素(例如第三方库或硬件限制),某些软件无法变得安全或可靠。在这种情况下,需要对软件进行分区,以防止干扰系统其余部分的安全和保障要求。虽然虚拟化是一种常见的解决方案,但它增加了不必要的复杂性。相反,有选择地修改代码并与第三方供应商合作可能会更有效,特别是当分离内核提供特定的可移植层时。使用分离内核很难实现此用例,但为了实现安全可靠的系统,必须进行更改。
安全或信息安全标准
安全标准通常要求分离以实现免受干扰。无需引入完整的虚拟化层,满足安全标准目标的另一层分离可能就足够了。使用较小的可信基础来实现安全和保障符合功能安全要求。例如,GreenHillsSoftware的INTEGRITYRTOS分离内核可应用于汽车、工业和航空电子等各个领域,提供多层安全保障。
虚拟化不是强制性的
因此,所有三个分离用例都可以在没有虚拟化的情况下进行设计,从而重新考虑软件架构。分离内核解决方案能够托管具有混合关键性要求的应用程序,而无需虚拟机管理程序。应用程序兼容层,例如POSIX、TCP/IP套接字和标准文件系统交互,都是通过开放接口实现的。
分离内核遵循微内核架构,并通过隔离功能、实施强制设备访问控制以及为替代软件架构提供基础来增强它。这种方法可以实现更简单的设计和更小的代码库,从而更容易确保安全性、信息安全性以及不存在错误或漏洞。
此外,分离内核允许混合临界应用程序共存。分离内核的原则强制执行静态架构设计阶段,与安全和信息安全系统的最佳实践保持一致。
为了实现更安全的系统,软件工程师必须采取一种专注于构建功能并考虑到分离的思维方式。应用程序和服务之间清晰且受保护的接口至关重要,并且重要的是要认识到服务(例如库或设备驱动程序)可以是分离内核上下文中的单独应用程序。这需要考虑替代的软件架构路径,以实现安全和信息安全的适当分离。
概括
总之,嵌入式管理程序和分离内核可以满足安全和保障方面的分离要求。然而,仅依赖虚拟机管理程序的默认方法会受到挑战。从安全角度来看,考虑具有较小体积可信计算基础的分离内核是一个明智的选择,因为两种方法提供的功能是相同的。在设计中优先考虑提高安全性而不是软件重用,建议使用依赖于兼容性层的更安全的分离内核替换遗留或实际的操作系统,从而实现更好的安全性和信息安全设计。
本文作者:Green Hills Software FAE Marcus Nissemark