术语表
术语,用平实的话说清楚。
NoWayOS 借用了操作系统、安全和 Rust 领域的词汇,其中有几个用的是特定含义。每个词都在这里用一两句话解释。
术语按拼音顺序排列,保留英文原名的术语按字母顺序排在其后。定义中以斜体标出的术语另有词条。
- 安全启动
设备拒绝启动未经其制造商签名的软件。NoWayOS 计划在生产硬件上实现;尚未构建。
- 保护域(PD)
Microkit 系统中一个相互隔离的部分:一个拥有自己内存的程序,只持有明确授予它的能力。也就是 NoWayOS 的密封隔离舱。
- 单调时间
从启动开始计数的时间,从不设置,也从不倒退。NoWayOS 的每个超时都使用它,它也从不与挂钟时间混用。
- 隔离测试
一个尝试触及未被授予之资源的系统,seL4 必须阻止它。一个故意放宽了授权的变体必须失败,这表明测试确实能够失败。
- 攻击面
攻击者可能用来对付一台设备的一切:它的代码、服务、接口和输入。代码越少、功能越少,攻击面就越小。
- 构造式安全
打造一台做不了那些高风险之事的设备,因为相应的功能从未被内置。这正是 NoWayOS 的方法。
- 故障
当保护域做了内核不允许的事情或发生 panic 时,seL4 所报告的事件。该部分会保持停止,直到其故障处理程序采取行动。
- 故障安全状态
NoWayOS 设备在故障接连不断时进入的状态:只有监管器、看门狗以及(在可能的情况下)显示继续运行,直到冷启动。
- 挂钟时间
日期和时刻,来自经过认证的来源。NoWayOS 把它与单调时间分开,作为不同的类型。
- 混合关键性(MCS)内核
seL4 带有调度预算和周期的配置,Microkit 构建的就是它。其 AArch64 证明仍在进行中,因此目前没有任何 NoWayOS 镜像处于 seL4 已完成的证明范围之内。
- 监管器
接收其他部分的故障、报告故障并让系统干净地重新启动的保护域。
- 开发容器
固定版本的容器镜像,装有 NoWayOS 的全部工具链:Rust 工具链、Microkit SDK、QEMU 和各种检查工具。每个
make目标都在其中运行,因此您的机器只需要 Podman 和 make(驱动 Raspberry Pi 5 时还需要 Python 3.11)。- 看门狗
一种硬件定时器,除非软件定期喂它,否则会复位开发板。NoWayOS 的看门狗保护域只有在其他每个部分都回应其心跳时才会喂它。
- 可信计算基(TCB)
一项安全属性所依赖的、必须正确无误的一切。对 NoWayOS 系统而言:seL4 内核、Microkit 加载器和监视器,以及该属性所依赖的保护域。
- 类型化消息
固定大小、布局明确的记录,通过共享内存在保护域之间传递,并在接收时检查。参见先复制,再检查。
- 冷启动
从断电状态开始的启动,与复位相对。只有冷启动才能让 NoWayOS 设备从故障安全状态中恢复。
- 模糊测试
用数以百万计的生成输入测试解析器,直到某个输入使其崩溃或违反某项检查。NoWayOS 每个处理外部输入的解析器都有一个模糊测试目标。
- 内存安全缺陷
诸如读取超出缓冲区末尾、或在内存释放后继续使用之类的错误。Microsoft 和 Google 都曾报告,它们约 70% 的严重安全缺陷属于这一类;安全 Rust 可以杜绝这类缺陷。
- 能力(capability)
在 seL4 中,一种无法伪造的令牌,指明一个内核对象以及对它所持有的权限,就像一张只开一扇门的门禁卡。保护域只能触及其能力所指明的东西。
- 配置式安全
通过更改设置让通用设备更安全。这些功能仍然存在,一个缺陷就可能绕过所有设置。
- 授权文件
systems/NAME.grants:系统授予的一切,每行一个事实:优先级、预算、内存、设备、中断和通道。只要系统描述与授权文件不一致,构建就会失败。- 双重读取
一种缺陷:代码检查共享内存中的数据后又再次读取它,让另一方有机会在两次读取之间更改数据。先复制,再检查可以防止这种缺陷。
- 通道
在 Microkit 中,两个保护域之间声明的连接,用于通知(不携带数据的信号,中断也属于此类)和受保护过程调用。
- 微内核
尽可能保持精简的内核,驱动程序、网络和屏幕都运行在内核之外,各自位于自己的隔离舱中。seL4 就是一个微内核。
- 系统描述
Microkit 的 XML 文件,声明系统的每个保护域、内存区域、通道和中断。它就是系统的安全设计,对它的任何修改也都按安全设计来审查。
- 先复制,再检查
一条规则:消息在验证之前先从共享内存中复制出来,因此发送方无法在检查与使用之间更改它。它可以防止双重读取。
- 形式化验证
由计算机检查的数学证明,证明软件符合其规约。seL4 针对特定配置拥有这种证明。NoWayOS 自身的代码则依靠 Rust、隔离、测试和有界证明。
- 有界证明
证明某个性质对不超过规定大小的每个输入都成立。NoWayOS 用 Kani 以这种方式证明其消息解码器。
- 预期文件
systems/NAME.expect:系统必须按顺序打印的各行,以及一旦在任何地方出现就会使测试失败的文本。同一个文件既在 QEMU 中、也在 Raspberry Pi 5 上检查系统。- 远程证明
设备以密码学方式向远程服务证明它启动了哪些软件。它表明的是启动时加载了什么,而不是此后发生的一切。NoWayOS 计划在生产硬件上实现;尚未构建。
- 字形图集
在构建时预先绘制成字符图像的字体,使设备绘制文字时从不需要解析字体文件。
- CycloneDX
一种用于软件物料清单的开放标准格式。NoWayOS 为每个工作区和每个系统镜像各写一份。参见 SBOM。
- Debug Probe
Raspberry Pi 的 USB 转串口适配器。接在 Raspberry Pi 5 的调试接口上,它传送启动日志并加载测试镜像。
- embedded-graphics
一个面向没有操作系统图形栈的设备的 Rust 2D 图形库。NoWayOS 的用户界面用它绘制。
- i.MX8
NXP 的工业级 Arm 处理器系列,也是 NoWayOS 计划中的生产硬件。目前尚不支持。
- Kani
一个 Rust 模型检查器,能证明某些性质对界限以内的每个输入都成立。NoWayOS 用它证明其消息解码器永远不会 panic、溢出或越界读取。
- Microkit
seL4 基金会的框架,用于构建由系统描述中声明的保护域组成的静态 seL4 系统。
- Miri
一个能检测未定义行为的 Rust 解释器。NoWayOS 对少数获准使用
unsafe代码的 crate 运行它。- QEMU
一个开源的机器模拟器。每个 NoWayOS 系统在接触硬件之前,都先在其中启动并检查自身的输出。
- Raspberry Pi 5
NoWayOS 用作参考硬件的低成本开发板。
- Rust
一种编程语言,其安全代码可以杜绝内存安全缺陷。NoWayOS 自身的代码全部用 Rust 编写。
- rust-sel4
seL4 基金会提供的 Rust 支持,包括用于编写 Microkit 保护域的 crate。
- rustls
一个用 Rust 编写的 TLS 库。NoWayOS 的 TLS 1.3 客户端基于它和 RustCrypto 构建。
- SBOM
软件物料清单:列出一个软件中每个组件及其版本的清单。NoWayOS 为每个工作区和每个系统镜像各写一份 CycloneDX 格式的 SBOM。
- Screen Compiler
NoWayOS 的构建时工具,把以 TSX 按受支持子集编写的 React 屏幕转换为面向 NoWayOS 用户界面的 Rust 代码。对子集之外的任何内容,它一律拒绝,而不是近似处理。
- sDDF
seL4 设备驱动框架(seL4 Device Driver Framework):一种基于 Microkit、使用共享内存队列的驱动程序参考设计。NoWayOS 的网络队列遵循这一设计。
- seL4
一个约 10,000 行的微内核,由 seL4 基金会维护,针对特定配置拥有经机器检查的正确性与安全性证明。NoWayOS 运行在它之上。
- sel4-config.txt
写在每个 NoWayOS 镜像旁的记录:其 seL4 配置,以及该配置是否处于 seL4 已完成的证明范围之内。
- Single Purpose OS
为一台设备的唯一任务而构建的操作系统,而不是先构建成什么都能运行、再锁定为只做一件事。它由三点界定:专为一项任务而建(镜像只包含应用、应用使用的驱动程序和内核,别无其他);内部密封(每个部分都在自己的隔离舱中,只能触及被授予的资源);有据可查(内部有什么,都附有证据)。它不是 Kiosk 模式——那只是把配置式安全的系统锁定在一个应用上。NoWayOS 就是一个 Single Purpose OS:一台心无旁骛的计算机。
- smoltcp
一个用 Rust 编写、运行时不分配内存的 TCP/IP 协议栈。NoWayOS 的网络协议栈基于它构建。
- unsafe
编译器无法检查其内存安全的 Rust 代码。除了一份由检查强制执行的、简短且经过审查的清单之外,所有 NoWayOS crate 都禁止使用。