# CVE-2021-30465

## 漏洞描述

Runc
是一个CLI工具，用于根据OCI规范生成和运行容器，该工具被广泛的应用于各种容器环境中，如Kubernetes。此次漏洞触发条件为攻击者将目标挂载路径设置为一个容器Volume在主机上目录的软链接，以此来获取主机上的挂载点。由于挂载的源路径是攻击者可以控制的目录，攻击者可以将源路径中的子目录软链接到主机根目录上，并通过条件竞争TOCTTOU（Time
Of Check To Time Of Use）的特定手段在一定条件让恶意容器中的指定目录挂载到主机目录。

### 影响版本

Docker 20.10.7 以下版本\
Containerd 1.4.6, 1.5.2以下版本\
Runc 1.0-rc95 以下版本\
目前UK8S节点使用的默认Docker及Containerd版本均在影响范围内

## 漏洞自查

您可以采用以下任意一种方式确认节点使用的运行时版本。\
1、直接执行`kubectl get nodes  -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.nodeInfo.containerRuntimeVersion}{"\n"}{end}'`\
2、登录节点，对于Docker节点，执行`docker version`。对于Containerd节点，执行`crictl version`

> ⚠️ 2020年7月9日之前创建的集群，Master节点默认不加入节点，可以跳过Master节点检查。

## 修复建议

1、确认业务部署方式，使用受信的容器，并且在容器挂载目录中，不存在主机内其它路径的软链接。\
2、自2022年1月14日起，1.17及以上版本的集群，新增节点及新建集群均会默认采用修复版本的Docker及Containerd。\
3、由于兼容性问题，1.17以下集群版本已经不再维护，建议您尽快升级到1.17及以上的版本，或者通过检查业务部署，避免该漏洞。\
4、1.17及以上版本集群的旧节点，您可以通过添加新节点，驱逐旧节点Pod，删除旧节点的方式进行升级。**请您务必确认Pod在新节点运行正常后，再删除旧节点。**\
5、由于Master节点无法通过增删节点的方式进行升级，请按照手动升级方案进行升级。

## 手动升级方案

1. 请按照[漏洞自查](#漏洞自查)步骤，检查节点是否需要升级。
2. 执行 `kubectl drain --ignore-daemonsets <node>`
   驱逐节点上所有pod，手动驱逐Pod。某些情况下，有可能需要增加`--delete-emptydir-data`参数。等待Pod驱逐完成后，执行后续升级操作。
3. 按照本文[升级Docker及Containerd](#升级docker及containerd)小节，根据您的节点类型及节点运行时是Docker还是Containerd。选择对应的升级方式进行操作。
4. 对于Docker节点 执行`docker version`。对于Containerd节点，执行`crictl version`，确认当前节点运行时版本号。
5. 【可选】对于工作节点，而非Master节点，等待升级完成后，可以执行`kubectl uncordon <node>`，将节点重新加入集群。

### 升级Docker及Containerd

> ⚠️ 如果您错误地在Containerd节点上安装Docker，将导致节点不可用。

#### Centos7

##### Docker节点

```
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-rootless-extras-20.10.11-3.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-20.10.11-3.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.4.12-3.1.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-20.10.11-3.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-scan-plugin-0.9.0-3.el7.x86_64.rpm
yum install -y fuse-overlayfs slirp4netns
rpm -U containerd.io-1.4.12-3.1.el7.x86_64.rpm  docker-ce-20.10.11-3.el7.x86_64.rpm docker-ce-rootless-extras-20.10.11-3.el7.x86_64.rpm   docker-scan-plugin-0.9.0-3.el7.x86_64.rpm  docker-ce-cli-20.10.11-3.el7.x86_64.rpm
```

##### Containerd节点

```
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.4.12-3.1.el7.x86_64.rpm
rpm -U containerd.io-1.4.12-3.1.el7.x86_64.rpm
```

#### Ubuntu 20.04

##### Docker节点

```
wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce_20.10.11~3-0~ubuntu-focal_amd64.deb
wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/containerd.io_1.4.12-1_amd64.deb
wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce-cli_20.10.11~3-0~ubuntu-focal_amd64.deb
dpkg -i docker-ce_20.10.11~3-0~ubuntu-focal_amd64.deb containerd.io_1.4.12-1_amd64.deb docker-ce-cli_20.10.11~3-0~ubuntu-focal_amd64.deb
```

##### Containerd节点

```
wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/containerd.io_1.4.12-1_amd64.deb
dpkg -i containerd.io_1.4.12-1_amd64.deb
```

#### Ubuntu 18.04

##### Docker节点

```
wget https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/docker-ce_20.10.11~3-0~ubuntu-bionic_amd64.deb
wget https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/containerd.io_1.4.12-1_amd64.deb
wget https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/docker-ce-cli_20.10.11~3-0~ubuntu-bionic_amd64.deb
dpkg -i docker-ce_20.10.11~3-0~ubuntu-bionic_amd64.deb  containerd.io_1.4.12-1_amd64.deb  docker-ce-cli_20.10.11~3-0~ubuntu-bionic_amd64.deb
```

##### Containerd节点

```
wget https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/containerd.io_1.4.12-1_amd64.deb
dpkg -i containerd.io_1.4.12-1_amd64.deb
```

## 漏洞原型链接

1、https://github.com/opencontainers/runc/security/advisories/GHSA-c3xm-pvg7-gh7r
