Published on

[Paper Note] μSWITCH: Fast Kernel Context Isolation with Implicit Context Switches

Authors
  • avatar
    Name
    NorthSecond
    Twitter

Basic Information


Problem

  • 上下文隔离问题
  • 现有的隔离方式不是粒度太粗就是太慢
  • 基于进程的隔离由于有两次下陷所以性能太差

Motivation

  • 内核可信域的抽象和隔离
  • 基于进程隔离的代价主要在上下文切换上面,所以实现一个不怎么需要下陷的 Sandbox 和对应的上下文切换方法
  • lwC 相关实现可以放过来用

Significance/Contribution

To address the limitations of prior techniques, we propose μSWITCH, a novel approach to efficiently isolate selected kernel resources of a process and application memory into multiple fine-grained domains (μContexts). Isolating kernel resources with μSWITCH ensures security guarantees similar to those of process isolation but with a significantly lower performance overhead. In particular, μSWITCH achieves sandboxed function invocation in 129ns, which is 55× faster than process isolation.

Method

设计

核心思路:减少下陷次数

  • 四个重要概念
  • API
    • 创新点:privCallsandboxCall

系统抽象

  • A μSWITCH-enabled program consists of privileged functions and sandboxed functions.
    • The program always begins with the privileged functions in the privileged context
    • 使用 uContext 定义这些 function 的上下文 The privileged functions dynamically create an isolated context (μContext) for each sandbox.
    • This divides the program into multiple isolated contexts, each of which has a set of kernel resources and a memory domain.
    • privileged 白盒,sandbox 黑盒
  • 安全隐患:调用点
    • A trusted entrypoint marks the single entry gate into the privileged context. All entries into the privileged context including privcalls from the unprivileged contexts and returns from sandboxcalls are mediated through this trusted entrypoint.

资源隔离

  • 使用 Intel MPK 进行内存保护和资源隔离
    • 在页表上有个 4-bit的标志位
    • PKRU 寄存器标志
  • 安全问题:恶意系统调用,和不合时宜的二进制指令
    • 可信调用点的注册
    • 保证执行内存页不可写
    • 代码的二进制检查,扫描到不安全的指令之后直接改写指令或终止程序;
  • 新的函数和寄存器栈
    • $fs 固定偏移量,禁用 WRFSBASE 防止 $fs 被篡改

上下文切换设计

  • 核心思路:在切换后的第一次 syscall 时进行下陷和内核上下文的切换
  • 用设计中的两个共享描述符来判断要不要进行内核上下文切换
  • 在平均系统调用次数低的上下文切换的场景中可以有效降低切换时延

Implementation

  • 更改了 872 行 kernel 代码、 4493 行用户层链接库代码、 147行 Musl 代码和 227 行 RLBox 代码;
  • 使用自旋锁和原子计数来进行多线程控制(还是老一套)
  • syscall 劫持:在所有支持 µSWITCH 的进程源码中设置宏 SYS_CALL_WORK_ENTER 为 1,通过更改 syscall_trace_enter() 函数内容完成对系统调用的劫持。
  • 跨上下文的文件调用:对于 privileged context 来说,其具有跨上下文进行文件获取的权限,因此暴露新的 API 接口 dupFileDescriptor 调用相关的 Intel MPK syscall。
  • Libc 的隔离保护:为每一个沙箱复制一份 libc 资源,使用 dlmopen 加载到沙箱自己的 namespace 中
    • 使用 MUSL libc
    • 但是借用了glibc的内存函数实现

Markable Results

    • 区分 Per-Origin 隔离和 Per-Component 隔离。

原因分析

Other Notes