Kubernetes CRI-O引擎逃逸CVE-2022-0811漏洞复现

一、前言

1、CRI-O

当容器运行时(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 就可以运行它,去除外来的工具,并让容器做其擅长的事情:加速你的新一代原生云程序。

2、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

  • Kubernetes 通知 kubelet 启动一个 pod。
  • kubelet 通过 CRI(Container runtime interface) 将请求转发给 CRI-O daemon
  • CRI-O 利用 containers/image 库从镜像仓库拉取镜像。
  • 下载好的镜像被解压到容器的根文件系统中,并通过 containers/storage 库存储到 COW 文件系统中。
  • 在为容器创建 rootfs 之后,CRI-O 通过 oci-runtime-tool 生成一个 OCI 运行时规范 json 文件,描述如何使用 OCI Generate tools 运行容器。
  • 然后 CRI-O 使用规范启动一个兼容 CRI 的运行时来运行容器进程。默认的运行时是 runc
  • 每个容器都由一个独立的 conmon 进程监控,conmon 为容器中 pid 为 1 的进程提供一个 pty。同时它还负责处理容器的日志记录并记录容器进程的退出代码。
  • 网络是通过 CNI 接口设置的,所以任何 CNI 插件都可以与 CRI-O 一起使用。

3、漏洞原因

Apache SSRF漏洞复现CVE-2021-40438

Apache SSRF漏洞复现

一、环境搭建

M1装个docker真麻烦,后来才发现是我的/usr/local/bin目录有问题太草了

下载httpd,在百度找了好久都没有找到可以编译的,只能尝试一下docker

docker pull httpd:2.4.48

image-20211020164217588

docker run -p 80:80 -v $PWD/www/:/usr/local/apache2/htdocs/ -d httpd

image-20211020164316557

随后进入docker中,改配置

image-20211020164714549

从SQL注入延时盲注到get Database

从SQL注入延时盲注到get Database

上午一到公司,打开网页就发现一枚SQL注入,开始手工复现,确认漏洞,所以有了此文

一、漏洞发现

image-20210705223107094

image-20210701143345615

执行的SQL语句

```mysql
SELECT COUNT(1) FROM t_ad WHERE (a`openrasp = ? AND delete_flag = ? AND ad_id <<!--autointro-->

这可能是最全的入门Web安全路线规划

本次写的是一篇如何通过针对性系统学习Web安全或者说如何能成为一名渗透测试人员(有疑问或者错误的地方还望大家多多指正)。相信大家每学习一样东西的时候都是存在一种很迷茫的心态(包括我自己),上网找视频找文章找资料学习得零零散散,最后还是浪费时间只得到一身三脚猫功夫。很多人上来都是你报什么班,但是每一个讲师擅长和对同一个工具或知识点的理解都未必是相同的,导致你只是永远在重复别人的思路,走别人的路。只有更加系统和全面的学习(无论如何都要把基础打牢固),查漏补缺,你才会变得更强(用了悬剑强上加强)web