Software-Based Fault Isolation
隔离
隔离方法
- 基于硬件的虚拟化
- 操作系统进程
- 基于语言的隔离
- SFI
- 性能对比
| 上下文切换开销 | 单指令开销 | 是否需要编译器支持 | |
|---|---|---|---|
| 虚拟机 | 非常高 | 无 | 否 |
| 操作系统进程 | 高 | 无 | 否 |
| 基于语言的隔离 | 低 | 中或无(动态/静态检查) | 是 |
| SFI | 低 | 低 | 可能(二进制重写工具) |
SFI
SFI基本介绍
- 核心机制
- 每个保护域(隔离模块)都被分配一个专属内存区域(沙盒)
- 隔离发生在同一进程的地址空间内
- 通过在关键指令前插入软件检查实现
- SFI沙盒构造
- 分为三部分
- 数据区域(DR,Data region): [DB, DL]
- 保存堆、栈
- 代码区域(CR, Code region): [DB, DL]
- 保存代码
- 安全外部地址(SE, Safe externel)
- 托管需要更高权限的受信任服务
- 代码跳转到它们以访问资源
- DR,CR和SE不相交
- 数据区域(DR,Data region): [DB, DL]
- 分为三部分
- 隔离的实现
- 代码段不可写
- 数据段不可执行
- 执法策略
- 检查每一个危险指令
- 危险指令: 读/写内存和控制转移指令
- 动态二进制翻译
- 在工作时拦截并重写危险指令,插入安全检查代码
- 内联引用监控
- 在编译时静态插入安全检查指令
- 检查每一个危险指令
- 具体执法方式
- 原始执法方式
- 在指令前插入检查
- 存在问题: 运行时开销高
- 仅完整性隔离
- 程序执行读远多于写,且在不考虑保密的情况下可以只检查写
- 数据区域专门化
- 数据区域地址具有相同的高位,被称作数据区域ID,检查地址是否配置了正确的数据区域ID即可
- 地址掩码
- 通过地址掩码将地址在执行前强制改写,使其指向数据段
- 单指令地址掩码: 缩减到一次指令实现改写地址
- 原始执法方式
Data Guards
引入伪指令
- 数据保护包含地址检查和地址屏蔽
- 引入伪指令
r' = dGuard(r)- 该指令满足以下条件
- 如果r在DR中,r’ = r
- 否则
- 对于地址检查,进入错误状态
- 对于地址掩码,r’获取到一个安全范围内的地址
- 该指令满足以下条件