gvisor
gvisor是google发布的安全容器。
gVisor 工作的核心,在于它为应用进程(用户容器),启动了一个名叫 Sentry 的进程。 而 Sentry 进程的主要职责,就是提供一个传统的操作系统内核的能力,即:运行用户程序,执行系统调用。所以说,Sentry 并不是使用 Go 语言重新实现了一个完整的 Linux 内核,而只是一个对应用进程“冒充”内核的系统组件。(这段是抄的)
作为安全容器,利用容器中的内核来隔离大部分内核攻击,确实是一个不错的想法,然而这个新内核属于定制内核,估计很多功能还不完善,据说用了ptrace和kvm两种方式实现,我这里来探索下kvm的实现方式。
kvm
kvm是linux的硬件虚拟化的的抽象模块,方便用户构建硬件虚拟化的虚拟机。最全的资料应该还是intel或amd各家的硬件开发手册,我之前有几篇相关的文章,所以就不啰嗦VT虚拟化了。
gviosr如何劫持容器中的系统调用
根据我的观察,gvisor对于VT技术(kvm)的使用核心逻辑图如下:

这里在信号里创建了个VMM(虚拟机管理器)。简单讲就是初始化客户机状态,和VMM状态,设置各种vm_exit标识,用来劫持客户机的各种硬件或软件行为。之后在kvm的设备句柄中 发送_KVM_RUN状态就可以运行客户机代码,也就是我们需要的新内核的代码。
kvm中设置系统调用表地址

MSR_LSTAR代表内核可以操作的系统寄存器,一般用来存放系统调用表。如上图,linux内核也是这样做的,存放了entry_SYSCALL_64。
gvisor利用kvm对虚拟机化中的系统表进行改写位于kernel——amd64.go(startGo)
func startGo(c *CPU)</

gVisor是Google发布的一个安全容器方案,通过启动名为Sentry的进程模拟操作系统内核的功能,为用户进程提供系统调用接口。本文探讨了gVisor如何利用KVM技术劫持容器中的系统调用,以及其对系统调用表的改写。
最低0.47元/天 解锁文章
2650

被折叠的 条评论
为什么被折叠?



