微软推出 CHERIoT,这是一种提高 C 代码安全性的硬件解决方案

微软发现了与 CHERIoT(物联网 RISC-V 功能硬件扩展)项目相关的进展,旨在阻止 C 和 C++ 现有代码中的安全问题。 CHERIoT 提供的解决方案允许您保护现有的 C/C++ 代码库,而无需重新编写它们。 保护是通过使用修改后的编译器来实现的,该编译器使用处理器提供的特殊扩展处理器指令集 (ISA),并在硬件级别监视内存访问、检查指针工作的正确性并确保代码块的隔离。

创建该项目时考虑到了这样一个事实:C 语言的低级性质在处理内存时会成为错误来源,从而导致缓冲区溢出、访问已释放内存、指针取消引用或双重释放等问题。 实践表明,即使像谷歌和微软这样拥有严格变更审查政策并使用现代开发方法和静态分析工具的大公司,也不能保证在处理内存时不出现错误(例如,微软大约70%的漏洞)和 Google 都是由不安全的内存处理引起的)。

这个问题可以通过使用保证内存安全操作的编程语言或带有额外检查的绑定来解决,例如,通过使用像 MiraclePtr (raw_ptr) 这样的普通指针来解决,它会对访问已释放的内存区域执行额外的检查。 但这样的方法更适合新代码,并且重新编写现有的 C/C++ 项目是相当有问题的,特别是如果它们被设计为在资源受限的环境中运行,例如嵌入式系统和物联网设备。

CHERIoT硬件组件被设计为基于RISC-V架构的微控制器,实现受保护的CHERI(Capability Hardware Extension to RISC-V)处理器架构,提供基于“能力”(每次读写)的受控内存访问模型对内存的操作已被授权)。 基于CHERIoT提供的指令集架构(ISA),构建了软件模型,保证单个对象级别内存操作的安全性,提供对已释放内存的访问保护,并实现轻量级内存访问隔离系统。 指定的软件保护模型直接体现在C/C++语言模型中,这使得它可以用来保护现有的应用程序(只需在支持ISA CHERIoT的设备上重新编译和运行)。

建议的解决方案允许您阻止导致对象超出内存边界的错误,不允许指针替换(所有指针必须从现有指针生成),并在释放后监视内存访问(任何使用不正确的内存访问)指针或引用已释放对象的指针会导致抛出异常)。 例如,使用 CHERIoT 允许您在处理不可信数据的组件中实现自动边界检查、内存生命周期跟踪和指针完整性强制,而无需更改任何代码。

该项目包括扩展的 CHERIoT 指令集架构的规范、支持 CHERIoT ISA 的 32 位 RISC-V CPU 的参考实现以及修改后的 LLVM 工具包。 CPU 原型图和 Verilog 中的硬件模块描述在 Apache 2.0 许可证下分发。 lowRISC 项目中的 Ibex 内核被用作 CPU 的基础。 CHERIoT ISA代码模型是用Sail语言定义的,并在BSD许可证下获得许可。

此外,还提出了 CHERIoT RTOS 实时操作系统的原型,即使在具有 256 MB RAM 的嵌入式系统上,它也能够提供隔离隔间的能力。 CHERIoT RTOS 代码是用 C++ 编写的,并根据 MIT 许可证分发。 操作系统的基本组件,如引导加载程序、调度程序和内存分配系统,都是以分区的形式设计的。

CHERIoT RTOS 中的隔间是代码和全局变量的隔离组合,类似于共享库,但与后者不同的是,它可以更改其状态(可变)并在单独的安全上下文中运行。 外部的任何代码都不能将控制权转移到隔间中的代码并访问对象,除非访问专门定义的入口点并使用指向调用另一个隔间时显式传递的对象的指针。 保证隔间中的代码和全局对象的完整性和机密性。

来源: opennet.ru

添加评论