SFI技术

详细探讨栈溢出原理以及x86-32架构下函数调用中的栈帧变化。

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不相交
  • 隔离的实现
    • 代码段不可写
    • 数据段不可执行
  • 执法策略
    • 检查每一个危险指令
      • 危险指令: 读/写内存和控制转移指令
    • 动态二进制翻译
      • 在工作时拦截并重写危险指令,插入安全检查代码
    • 内联引用监控
      • 在编译时静态插入安全检查指令
  • 具体执法方式
    • 原始执法方式
      • 在指令前插入检查
      • 存在问题: 运行时开销高
    • 仅完整性隔离
      • 程序执行读远多于写,且在不考虑保密的情况下可以只检查写
    • 数据区域专门化
      • 数据区域地址具有相同的高位,被称作数据区域ID,检查地址是否配置了正确的数据区域ID即可
    • 地址掩码
      • 通过地址掩码将地址在执行前强制改写,使其指向数据段
      • 单指令地址掩码: 缩减到一次指令实现改写地址

Data Guards

引入伪指令

  • 数据保护包含地址检查和地址屏蔽
  • 引入伪指令r' = dGuard(r)
    • 该指令满足以下条件
      • 如果r在DR中,r’ = r
      • 否则
        • 对于地址检查,进入错误状态
        • 对于地址掩码,r’获取到一个安全范围内的地址

Guard Zones

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计