【CVE-2024-21626】容器逃逸漏洞修复

哈喽大家好,我是咸鱼。

好久不见,最近有一个很火的 CVE——runc 容器逃逸漏洞。年前的时候我们已经在测试环境进行了相关操作打算年后线上进行修复。

因为今天咸鱼才开工,所以文章也就拖到了现在 😃

漏洞介绍

简单来讲,docker-runc 是一个用 Go 语言编写的 CLI 工具,它利用 Linux 的核心功能(如 cgroups 和命名空间)来创建和运行容器。

由于 runc 内部不正确处理文件描述符,导致泄漏关键的宿主机文件描述符到容器中。

容器逃逸方式:

  • 攻击1: 利用文件描述符泄漏,特权用户执行恶意容器镜像,导致 pid1 进程在宿主机挂载命名空间中拥有工作目录,从而允许对整个宿主文件系统的访问。
  • 攻击2: 在 runc exec 中存在文件描述符泄漏和工作目录验证不足,攻击者可通过符号链接将路径替换为 /proc/self/fd/7/,并绕过保护机制,最终通过访问主机文件系统实现攻击。
  • 攻击3: 利用类似 /proc/self/fd/7/../../../bin/bash 的路径作为参数,覆盖主机二进制文件,从而改进攻击1和2。攻击者可以在主机上执行目标二进制文件,获取完全访问主机的权限。

漏洞演示

这部分内容借用卡瓦邦噶的文章《CVE-2024-21626 从容器内逃逸到宿主机文件系统》

环境准备

准备一个新的 VM,需要安装的依赖有:

  • 依赖 golang 1.22 和 libseccomp-dev 来编译指定版本的 runc;
  • 依赖 build-essential 编译 runc;
  • 依赖 docker engine,指定版本的 runc;

第一步:按照官方文档安装最新版本的 docker。

第二步:替换 runc (最新版已经解决这个问题了)到旧版本,这里我们使用 v1.0.0-rc10. 编译脚本如下:

# install golang
wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
export GOPATH=~/go
go version

# install dependencies for building runc
apt update
apt install -y build-essential libseccomp-dev

# compile and install runc
cd $GOPATH
mkdir -pv src/github.com/opencontainers
cd src/github.com/opencontainers
git clone https://github.com/opencontainers/runc
cd runc

git checkout v1.0.0-rc10

export GO111MODULE=auto
make
sudo make install

安装完成旧版本的 runc 之后需要重启 docker engine:
sudo systemctl restart docker.

攻击演示

创建一个 Dockerfile:

# Sets the current working directory for this image
WORKDIR /proc/self/fd/7/`

编译这个 docker image: docker build . -t test

最后运行这个 docker image: docker run --rm -ti test

可能一次运行不会成功,多运行几次会成功。

进入 container,此时 cwd 显示

通过相对路径,我们可以回到 Host 上面的 / 了:

打开 Host 上面的文件
如果我们安装运行 htop,会发现只有自己的容器里面的进程:

htop 只显示自己容器的 pid

但是如果我们改变当前容器的 fs root: chroot . ,再次运行 htop,就可以看到所有的进程了。

chroot ps 可以显示所有的 pid

htop 也可以显示所有的 pid
但是试了下发送 signal 开 kill 进程是不行的,我猜是因为 pid namespace 仍然是对进程隔离的?

甚至可以在容器内运行docker 命令,看到所有的 container。因为有了 docker binary 的路径(和权限,因为容器进程也是 root)和 docker socket 的路径。

在容器内 docker ps

漏洞修复

目前官方已有可更新版本,可以参考以下链接升级至最新版本:runc >= 1.1.12

下载链接

下面是咸鱼在自己本地环境的操作(CentOS 7 系统)

1、先看下当前 runc 版本:

2、复制上面的链接进去,下载 runc.amd64 ,然后上传到服务器上(我选择上传到 /opt 目录下)

或者直接在服务器上 wget 也行

cd /opt && wget https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64

4、先备份原本的 runc 工具

mv /usr/bin/runc /usr/bin/runcbak

5、更新 runc

mv /opt/runc.amd64 /usr/bin/runc && chmod +x /usr/bin/runc

6、重启 docker 并检查 runc 是否更新成功

systemctl restart  docker.service 

docker version 
  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
CVE-2024-21733是一个未公开的安全漏洞(Common Vulnerabilities and Exposures,缩写为CVE),它通常指的是特定软件或系统中存在的安全弱点。由于这个漏洞的具体细节没有在公开资料中详细说明,我无法提供详细的修复步骤,因为每个漏洞修复方法都依赖于其具体性质和受影响的应用环境。 修复此类漏洞的一般流程包括: 1. **确认漏洞**:首先需要确定你的系统是否受到了该漏洞的影响,查看厂商发布的公告或更新日志。 2. **获取补丁或更新**:如果发现受威胁,尽快从官方渠道下载并安装针对此漏洞安全补丁或软件更新。 3. **分析影响**:理解漏洞如何利用,以防止类似攻击发生,并修改潜在的脆弱代码。 4. **配置防火墙和安全规则**:检查系统防火墙设置,确保只有授权流量能访问受影响的服务。 5. **审计日志**:启用更详细的日志记录以便追踪未来的异常活动。 6. **重新评估安全策略**:漏洞修复后,应该审查整个安全策略,以强化整体防御。 由于这是一个假设性的漏洞,具体的解决方案会因漏洞类型(如代码注入、权限提升等)和所用技术栈的不同而有所变化。如果你面临真实的漏洞修复任务,请咨询专业的安全团队或查阅相关文档进行操作。如果你有具体应用或系统的详情,我可以帮助你了解更针对性的防护措施。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼Linux运维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值