近期Linux被爆出,存在可能造成容器跳脱(Container Escapes)的严重核心漏洞,许多Linux发布版皆被影响,因此容器应用也受到波及,但Google提到,他们在GKE以及无服务器服务中,使用了开源的沙盒容器Runtime gVisor,因此相关服务不受CVE-2020-14386影响。
在5.9-rc4之前的Linux核心存在漏洞CVE-2020-14386,让黑客能够使用Linux核心的CAP_NET_RAW功能,造成内存毁损(Memory Corruption),使得非特权程序取得根权限,而这个漏洞最大的威胁,是影响资料的机密性以及完整性。
由于在Docker中,CAP_NET_RAW功能默认激活,因此大部分Kubernetes部署,或许原本就存在该核心漏洞,而且即便安全团队禁用了部分默认功能,但在使用ping和tcpdump等网络工具进行调试的过程,可能无意间又激活了CAP_NET_RAW功能。
禁用CAP_NET_RAW功能可以保护系统免受该核心漏洞影响,但Google提到,即便CAP_NET_RAW激活,在GKE、Cloud Run、Cloud Functions或App Engine标准环境,也不会受到漏洞影响,因为GKE以及无服务器服务皆使用gVisor,gVisor网络堆栈没有使用Linux中有问题C程序代码,因此不存在该漏洞。
gVisor是Google以程序语言Go开发的沙盒容器Runtime,Google提到,容器依赖命名空间以及cgroup作为主要的隔离层,而gVisor则引入了第2隔离层,以Go编写的核心Sentry来处理系统调用,在用户空间中模拟Linux。这样的方式大幅减少对主机核心的系统调用数量,因此能够缩减攻击面,而且除了Sentry提供的隔离之外,gVisor还使用特殊的TCP/IP堆栈、网络堆栈以及其他保护层,提供额外的隔离。
既使GKE沙盒上的Pod不受漏洞影响,但基于最佳实践,用户仍应该更新系统,而未使用GKE沙盒的用户,应该立刻更新控制平面以及节点,并且根据建议从Policy Controller、Gatekeeper或PodSecurityPolicy中移除CAP_NET_RAW功能。
容器的发明,改变了应用程序开发、封装以及部署的方法,Google表示,容器方式暴露了广泛的系统表面,对于执行不受信任,或是潜在恶意程序代码存在安全风险,而gVisor能以沙盒执行应用程序,提供像是虚拟机一样的隔离性,应用程序设下强健的隔离边界,把应用程序包在用户空间中,但是更加轻量,且也能访问核心与系统资源。
gVisor直接以Go实例Linux系统调用,因此Google提到,由于Go具有类型和内存安全性,因此不少Linux问题,像是缓冲区溢出以及数组超过越边界的问题也就消失了,gVisor可以说是较安全的Linux轻量版。不过,虽然gVisor是一个更安全的方案,但是目前仍有两个主要问题,首先,虽然gVisor与Linux很像,能够执行大部分应用程序,但终究与Linux不同,仍有许多限制,第2个问题则是,拦截系统调用,会影响I/O密集工作负载的性能。