Kubernetes使用的其中一个Go代码库中的漏洞可能导致对CRI-O和Podman容器引擎的拒绝服务攻击。该漏洞(CVE-2021-20291)影响名为“容器/存储”的Go语言代码库。据发现该漏洞的Unit42团队安全研究员AvivSasson介绍,该漏洞可以通过在注册表中放置恶意图像来触发;当镜像被恶意攻击者从注册表调出时,就可以进行DoS攻击。“通过这个漏洞,恶意攻击者可能会攻击任何依赖易受攻击的容器引擎的基础设施,包括Kubernetes和OpenShift,”Sasson在周三的一篇帖子中说。CRI-O和Podman都是容器引擎,类似于Docker,主要用于在云端执行操作和管理容器。CRI-O和Podman使用“容器/存储”来处理容器镜像的存储和下载。研究人员表示,当漏洞被触发时,CRI-O无法拉取新图像、启动任何新容器(即使它们已经在本地拉取)、检索本地图像列表或停止容器运行。同样,Podman将无法拉取新图像、检索正在运行的pod、启动新容器(即使它们已经在本地拉取)、检索现有图像或终止所有容器。此漏洞的影响可能非常广泛。Sasson解释说:“从Kubernetesv1.20开始,Docker就被弃用了,现在唯一支持的容器引擎是CRI-O和Containerd,这导致许多集群使用CRI-O。在实际的攻击场景中,攻击者可以拉一个“单个恶意图像到多个不同的节点上,使所有节点崩溃并破坏集群。目前除了重新启动节点外没有其他办法解决这个问题。”拉入镜像时,它首先下载清单,其中包含有关如何构建镜像的说明。其中一部分是构成容器文件系统的层列表,容器引擎读取、下载和解压缩每一层。”攻击者可以将恶意层上传到注册表以利用此漏洞,然后上传使用多个层(包括恶意层)的图像,并从中创建一个新的恶意图像,”Sasson解释说。然后,当受害者从注册表中拉取镜像时,会下载进程中的恶意层,完成利用。“一旦容器引擎开始下载恶意层,最终结果就是死锁。在这种情况下,进程获取锁并且锁永远不会被释放,这会导致DoS,”Sasson解释道。因为此时其他线程和进程会停止执行,永远等待锁被释放。“他列出了触发漏洞时发生的步骤。例程1-从注册表下载恶意层。例程1-从注册表下载恶意层。进程1获取锁。例程2-使用xz二进制解压缩下载的层并写入输出例程3-等待xz退出并读取stdout中的所有数据。当条件满足时,它关闭一个名为chdone的通道。例程1-使用xz作为输入,并尝试解压缩数据。由于文件是不是tar存档,untar将抛出“无效的tar标头”错误,并且不会从xz的标准输出中读取其余数据。由于数据永远不会被读取,例程3现在陷入僵局,chdone永远不会关闭。routine1-等待routine3关闭chdone,也是死锁,一旦routine1死锁,容器引擎就无法执行任何新的请求,因为如果要执行新的请求,需要获取步骤2的锁,并且这个锁永远不会被释放.容器/存储的1.28.1版、CRI-O的1.20.2版和Podman的3.1.0版都发布了针对该漏洞的补丁。管理员应尽快更新。容器安全成为焦点一项针对错误配置的开放Docker守护程序API端口的密码窃取活动。每天都可以观察到与此活动相关的数千次攻击。同样在4月,研究人员表示,针对微软云容器技术Azure的攻击中发现了Functions漏洞,该漏洞允许攻击者直接写入文件。这是一个权限提升漏洞,最终可能允许攻击者逃离容器。在最近的实验室测试中,一个简单的Docker容器蜜罐在24小时内发生了四次不同的网络攻击,这是为什么云基础设施需要强大的安全性的直接例子。本文翻译自:https://threatpost.com/security-bug-brick-kubernetes-clusters/165413/
