介绍密封类型

  • 重要性及作用:密封是 CHERI 最重要的部分之一,能实现可用的分区接口,构建类型安全的不透明类型,在互信和委托情况下安全使用。最近编译器和 RTOS 的更新使编程更友好。

    • 不透明类型即句柄:代码常输出可回传的不透明值,如 C 语言中库暴露的PrivateType,调用者只传递指针作为不透明句柄,这是软件工程边界而非安全边界,系统调用边界也有类似抽象,如 Windows 的HANDLE和 POSIX 系统的文件描述符,但在分解单块内核时管理访问权限变复杂,CHERIoT 旨在通过硬件抽象减少软件复杂性。
    • 使用密封实现不透明类型:在 CHERI 系统中,密封 CHERI 能力(指针)后变成不透明令牌,密封能力包含对象类型字段,存储用于密封的能力值,以确定可解封它的能力。可存储密封能力、复制,但不能使用,只能用正确的能力解封,C 语言中密封类似char *sealed = cheri_seal(ptr, someKey),密封指针受时间安全机制约束,CHERIoT RTOS 用SObj*作为所有密封类型的占位符,存在一些不便。
    • 类型系统中的密封指针:CHERIoT LLVM 的[PR 109]引入__sealed_capability类型限定符,尝试解引用或修改密封能力地址在编译时出错,密封内置函数返回和要求__sealed_capability限定的指针,使暴露不透明类型更易,编译器允许密封指针隐式转换为void*,转回需显式转换。
    • 向后兼容性:现有代码用SObj*,采用新方式需在 RTOS 中更改[PR 427],添加CHERI_SEALED(T)宏,若依赖SObj*可定义CHERIOT_NO_SEALED_POINTERS恢复旧行为,此变化也反映在CHERI::Capability包装模板中。
    • C++助手:将密封暴露到类型系统中可在 C++中使用,添加CHERI::remove_sealed/CHERI::remove_sealed_t模板去除密封限定符,CHERI::is_sealed_capability/CHERI::is_sealed_capability_v谓词模板可查询能力是否密封,与 C++概念组合可定义要求密封或解封指针的重载。
阅读 8
0 条评论