10个版本 (5个重大更新)
0.6.3 | 2022年8月8日 |
---|---|
0.6.2 | 2022年7月28日 |
0.5.1 | 2022年5月24日 |
0.4.0 | 2022年4月11日 |
0.1.0 | 2021年10月20日 |
#132 in 无标准库
在 4 crates 中使用
285KB
7K SLoC
sallyport
虚拟机微内核边界的API
sallyport
是一个用于代理从 Enarx Keep 到宿主机的服务请求(如系统调用)的协议库。一个 sally port 是一个安全的网关,通过这个网关,防御军队可以从他们的防御工事中“出击”。
作用机制
sallyport
通过向主机提供执行系统调用所需的最低限度的寄存器上下文来工作。通过这种方式,主机可以立即调用所需的系统调用,而不需要任何额外的逻辑。
客户机和主机通过一个相互不信任的共享内存块进行通信。
此库为客户端提供通过代理请求到主机的不受信任块的功能,以及为主机执行不受信任块中包含的请求的功能。
块格式
Sallyport 块 是包含零个或多个 项 的内存区域。所有项都包含以下 头
- 大小:
usize
- 类型:
usize
大小参数包括项的完整长度(不包括头值)。项的内容由 类型
参数的值定义。具有未知 类型
的项可以被跳过,因为项的长度可以从 大小
字段中得知。收到未知 类型
项的接收者不得以任何方式解释或修改项的内容。
类型
END
:0
SYSCALL
:1
GDBCALL
:2
ENARXCALL
:3
结束
END
项必须具有size
为0
的大小。它没有内容,仅简单标记了该块中项的结束。这向主机传达了项列表的结束。然而,在返回到虚拟机时,虚拟机不得依赖于存在终止符。
系统调用
SYSCALL
项包含以下内容
nmbr
:usize
- 系统调用号arg0
:usize
- 第一个参数arg1
:usize
- 第二个参数arg2
:usize
- 第三个参数arg3
:usize
- 第四个参数arg4
:usize
- 第五个参数arg5
:usize
- 第六个参数ret0
:usize
- 第一个返回值ret1
:usize
- 第二个返回值data
:...
- 可以引用的数据(可选)
GDB调用
GDBCALL
项包含以下内容
nmbr
:usize
- GDB调用号arg0
:usize
- 第一个参数arg1
:usize
- 第二个参数arg2
:usize
- 第三个参数arg3
:usize
- 第四个参数ret
:usize
- 返回值data
:...
- 可以引用的数据(可选)
Enarx调用
ENARXCALL
项包含以下内容
nmbr
:usize
- Enarx调用号arg0
:usize
- 第一个参数arg1
:usize
- 第二个参数arg2
:usize
- 第三个参数arg3
:usize
- 第四个参数ret
:usize
- 返回值data
:...
- 可以引用的数据(可选)
参数值可能包含数值。然而,所有指针都必须转换为从数据区开始处的偏移量。
示例
以下是如何使用sallyport
协议在主机和受保护的虚拟机之间代理系统调用的示例
- Keep内部的工作负载执行了一个
write
系统调用。 - shim捕获了所有系统调用,并注意到这是一个
write
系统调用。 - shim为项头、系统调用号、六个参数、两个返回值、工作负载想要写入的尽可能多的字节数以及一个
END
项头分配空间。 - shim写入项头、参数值并将工作负载想要写入的字节复制到块的日期区域。现在它对主机是可访问的。
- shim写入分配的区段。在
write
系统调用的例子中,shim - Shim 将控制权交给不可信的主机,在主机端 Enarx 代码意识到它必须代理一个系统调用。
- 主机端 Enarx 代码可以使用块中的值立即调用系统调用。
- 一旦系统调用完成,主机端 Enarx 代码可以更新系统调用返回值区域,将系统调用的返回代码写入其中。
- 主机端 Enarx 代码将控制权返回给 shim。
- shim 检查块并将任何修改后的数据传播回受保护地址空间。然后它可以将其控制权返回给其工作负载。
许可:Apache-2.0
依赖关系
~1MB
~19K SLoC