原文首发在:奇安信攻防社区 https://forum.butian.net/share/2638 作者:凝 前言: 我认为docker容器逃逸也算是提权的一种手法,要更好的理解容器逃逸的手法,应该知道从本质上看容器内的进程只是一个受限的普通 Linux 进程,而容器逃逸的过程我们完全可以将其理解... 前言: 我认为docker容器逃逸也算是提权的一种手法,要更好的理解容器逃逸的手法,应该知道从本质上看容器内的进程只是一个受限的普通 Linux 进程,而容器逃逸的过程我们完全可以将其理解为在一个受限进程中进行一些操作来获取未受限的完整权限 privileged 特权容器的权限其实有很多,所以也有很多不同的逃逸方式,挂载设备读写宿主机文件是特权容器最常见的逃逸方式之一 如何判断当前容器是以Privileged 特权模式启动的呢? s.fileno(), 0) os.dup2(s.fileno(), 1) os.dup2(s.fileno(), 2) os.putenv("HISTFILE", '/dev/null
,要更好的理解容器逃逸的手法,应该知道从本质上看容器内的进程只是一个受限的普通 Linux 进程,而容器逃逸的过程我们完全可以将其理解...前言:我认为docker容器逃逸也算是提权的一种手法,要更好的理解容器逃逸的手法 限制权限的进程获取更多权限,当清晰的理解了这一点,接下来的容器逃逸学习将会易如反掌容器逃逸环境搭建作者这里选择的是Ubuntu-18.04和Ubuntu22.04,推荐使用Ubuntu18.04首先安装 docker容器的环境,我们便要尝试容器逃逸Docker配置不当导致的容器逃逸这里我们再次提到NameSpace和cgroupsLinux 命名空间(NameSpace):实现文件系统、网络、进程、主机名等方面的隔离 privileged 特权容器的权限其实有很多,所以也有很多不同的逃逸方式,挂载设备读写宿主机文件是特权容器最常见的逃逸方式之一如何判断当前容器是以Privileged 特权模式启动的呢? s.fileno(), 0) os.dup2(s.fileno(), 1) os.dup2(s.fileno(), 2) os.putenv("HISTFILE", '/dev/null')
Part01 简述docker容器逃逸什么是docker? 容器是完全使用沙箱机制,相互之间不会有任何接口。什么是Docker容器逃逸? Part02 常见的逃逸方法1、配置不当,例如:开启特权模式(privileged)、挂载Docker Socket逃逸、挂载宿主机procfs逃逸、Docker Remote API未授权访问逃逸;2 2、漏洞验证containerd < 1.3.9containerd < 1.4.3当我们在docker内时如何判断当前容器是否存在风险? 成功接受到shellPart04 如何防止docker逃逸1、避免使用特权模式启动容器,或者限制容器所需的最小权限;2、避免将宿主机上的敏感文件或目录挂载到容器内部,或者使用只读模式挂载;3、避免将Docker
=0),这时候就有了逃逸的机会。 所谓容器逃逸,就是容器中的进程通过某种方式改写主机环境,从容器这个平行世界中“逃脱”,改变主世界。 在容器中它可能只是个“村长”,但由于它的 UID 与外面的“国王”相等,一旦逃逸发生,它就等同于拥有“国王”权限,可以对外发布更高权限的命令。 CVE-2019-5736: 改写 runc 容器逃逸 在 2019 年初,爆发了一个容器严重漏洞,运行 docker 的容器环境,普通用户可以通过特殊构建的镜像,运行后改写主机上的 runc,从而进一步进行入侵操作 CVE-2019-14271: 通过 docker-cp 容器逃逸 这个漏洞是指当运行 docker 的环境中调用docker cp时,如果访问的是一个恶意容器,容器中的用户就可以在主机中运行任意代码。
docker是目前主流的容器技术,今天我们来探讨一下docker逃逸的3种常见方式:内核漏洞引起的逃逸、相关程序漏洞引起的逃逸和docker配置不当引起的逃逸。 0x03 配置不当引起的逃逸 第三种逃逸方式,利用容器配置不当进行逃逸,包括remote api 未授权访问、特权模式等方式。 2、特权模式(privileged) 使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,并通过写入计划任务等方式进行逃逸 容器运行时安全:容器在运行时也会产生安全问题,包括有磁盘资源限制问题,容器逃逸问题,容器DoS攻击与流量限制问题等等。 参考资料: 1、《金融领域云原生技术与安全研究》 2、《容器时代:数万台服务器下的 Docker 深度安全实践》 3、《技术干货 | Docker 容器逃逸案例汇集》
在这篇博文中,我将向大家展示访问我们的 Kubernetes 集群的攻击者如何进行容器逃逸:运行 Pod 以获得 root 权限,将 Pod 转义到主机上,并通过不可见的 Pod 和无文件执行来持续攻击 问题 在容器逃逸期间,攻击者打破了主机和容器之间的隔离边界,最终逃逸至 Kubernetes 控制平面或工作节点的地方。 让我们进入主机命名空间 在此示例中,我们使用具有主机命名空间配置的特权 Pod 来表示容器逃逸攻击。正如我们在此处演示的那样,这在强化的 Kubernetes 环境中是可能的。 请注意,有多种方法可以执行突破,例如,攻击者也可以利用漏洞获得特权并逃出容器沙箱。 攻击者执行容器逃逸的第一个也是最简单的步骤是使用特权 Pod 规范启动一个 Pod。 在此示例中,我们使用了具有 hostPID 关联的特权容器。在现实世界中,这也可能是一个拥有自己进程命名空间的非特权容器,然后设法利用内核漏洞获得特权并突破。他们能做什么?
在这篇博文中,我将向大家展示访问我们的 Kubernetes 集群的攻击者如何进行容器逃逸:运行 Pod 以获得 root 权限,将 Pod 转义到主机上,并通过不可见的 Pod 和无文件执行来持续攻击 问题 在容器逃逸期间,攻击者打破了主机和容器之间的隔离边界,最终逃逸至 Kubernetes 控制平面或工作节点的地方。 让我们进入主机命名空间 在此示例中,我们使用具有主机命名空间配置的特权 Pod 来表示容器逃逸攻击。正如我们在此处演示的那样,这在强化的 Kubernetes 环境中是可能的。 请注意,有多种方法可以执行突破,例如,攻击者也可以利用漏洞获得特权并逃出容器沙箱。 攻击者执行容器逃逸的第一个也是最简单的步骤是使用特权 Pod 规范启动一个 Pod。 在此示例中,我们使用了具有 hostPID 关联的特权容器。在现实世界中,这也可能是一个拥有自己进程命名空间的非特权容器,然后设法利用内核漏洞获得特权并突破。他们能做什么?
---- Docker 容器逃逸案例: 1、判断是否处于docker容器里 2、配置不当引起的逃逸 Docker Remote API 未授权访问 docker.sock 挂载到容器内部 docker sudo docker -H tcp://10.1.1.211:2375 run -it -v /:/mnt nginx:latest /bin/bash 2、在容器内执行命令,将反弹shell的脚本写入到 / -name docker.sock/run/docker.sock 2、在容器查看宿主机docker信息: docker -H unix:///var/run/docker.sock info 3 函数的能力,导致容器逃逸的发生。 容器逃逸,获得root权限的shell。
Docker 枚举、特权升级和容器逃逸 (DEEPCE) 为了使其与最大数量的容器兼容,DEEPCE 是纯编写的sh,没有依赖性。 枚举都不应该触及磁盘,但是大多数漏洞利用会创建新的容器,这将导致磁盘写入,并且一些漏洞利用会覆盖 runC,这可能具有破坏性,所以要小心! 可以使用以下单行之一将 DEEPCE 下载到主机或容器上。提示:下载到/dev/shm避免接触磁盘。 容器 ID 和名称(通过反向 DNS) 容器 IP / DNS 服务器 码头工人版本 有趣的坐骑 普通文件中的密码 环境变量 密码哈希 容器中存储的常见敏感文件 同一网络上的其他容器 端口扫描其他容器, 利用特权容器在主机操作系统上创建新的 root 用户: .
0x00 前言 runc是一个遵循oci标准的用来运行容器的命令行工具。runc的使用非常灵活,可以与各种容器工具和平台集成,如Docker、Kubernetes等。 0x01 漏洞描述 由于内部文件描述符泄漏,本地威胁者可以通过多种方式实现容器逃逸: 通过使新生成的容器进程(来自runc exec)在主机文件系统命名空间中拥有一个工作目录,或诱使特权用户运行恶意镜像并允许容器进程通过 这些攻击还可用于覆盖半任意主机二进制文件,从而实现容器逃逸。
有在关注容器逃逸漏洞,最近在github上发现了一款零依赖Docker/K8s渗透工具包,集成了多个漏洞PoC/EXP,可轻松逃脱容器并接管K8s集群。 集成Docker/K8s场景特有的 逃逸、横向移动、持久化利用方式,插件化管理。 github项目地址: https://github.com/Xyntax/CDK 下面以最近发布的容器逃逸漏洞 CVE-2020-15257作为演示漏洞利用过程。 (2)通过--net=host 作为启动参数来运行一个容器。 (3)通过CDK执行exp,成功反弹shell,实现容器逃逸。
基于计算机科学领域层式思想及分类讨论的原则,我们定义「直接宿主机」概念,避免在容器逃逸问题内引入虚拟机逃逸问题; 2. 后文的组织结构如下: • 介绍容器环境检测技术 • 介绍危险配置导致的容器逃逸 • 介绍危险挂载导致的容器逃逸 • 介绍相关程序漏洞导致的容器逃逸 • 介绍内核漏洞导致的容器逃逸 二、 容器环境探测检查 2如何探测检查容器环境? 首先创建一个容器并挂载/var/run/docker.sock; 2. 在该容器内安装Docker命令行客户端; 3. s.fileno(), 0)os.dup2(s.fileno(), 1)os.dup2(s.fileno(), 2)os.putenv("HISTFILE", '/dev/null')pty.spawn
漏洞情况近期,火山信安实验室监测发现,Container Toolkit 组件存在一个高危容器逃逸漏洞(CVE-2025-23266),攻击者可利用该漏洞突破容器隔离限制,获取宿主机的系统级权限,进而执行任意代码或窃取敏感数据 0x01漏洞利用方式漏洞源于 NVIDIA Container Toolkit 在处理 GPU 设备挂载时未对容器配置实施严格校验,攻击者可利用这一缺陷通过构造恶意容器镜像或动态篡改运行时参数(如 -- device 参数),将宿主机 /dev 目录或敏感设备节点(如 /dev/mem、/dev/kvm)非法挂载至容器内部,从而绕过容器隔离机制;进一步结合 NVIDIA 内核驱动(如 nvidia-uvm (如 libnvidia-container.conf)中的关键参数(如 device.allow 或 kernel.modules.load),攻击者可强制容器以非预期的高权限模式启动,最终达成完全的容器逃逸与宿主机提权 Kubernetes 中使用 NetworkPolicy 限制逃逸容器的网络访问来源自:广州盈基信息官网
编辑 | zouyee runC社区于2024年2月1日披露了高危安全漏洞CVE-2024-21626,攻击者可以利用该漏洞越权访问宿主机文件或执行二进制程序,详细内容参见下文 CVE-2024-21626 提权漏洞 CVSS评分: CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H - 高风险 (8.6) 由于runc存在内部文件描述符泄露,本地攻击者可以通过多种方式进行容器逃逸 /bin/bash 的路径用作 process.args 二进制参数来覆盖主机二进制文件来改进攻击1、2。 利用此问题可能会导致容器逃逸到底层主机操作系统,无论是通过执行恶意映像还是使用恶意 Dockerfile 或上游映像构建映像(即使用时FROM方式) Affected Versions v1.0.0-rc93 3b)通过runc exec方向实现容器逃逸。
0X1 漏洞详情 Docker、containerd或者其他基于runc的容器运行时存在安全漏洞,攻击者可以通过特定的容器镜像或者exec操作可以获取到宿主机的runc执行时的文件句柄并修改掉runc的二进制文件 0X2影响范围:Docker版本 < 18.09.2 或者使用 runc版本 <= 1.0-rc6的环境,请自行根据厂商建议进行修复。 编辑stage2.c文件,修改shell代码,设置反弹到本地的ip和端口: ? 编译环境:docker build cve . ? 这个过程会慢一些,等待。。。 然后进入容器内: ? 到root目录下,运行run.sh脚本 ? kali下开启另一个终端进行端口监听: ? 退出容器然后再重新进入容器,漏洞被触发,shell反弹过来 ? ? 至此,漏洞复现完毕!
前言 绿盟科技研究通讯曾经发表过容器逃逸的技术文章《【云原生攻防研究】容器逃逸技术概览》[1],该文中探讨了已有的容器逃逸技术。 相比于容器引擎漏洞造成的逃逸,Linux内核漏洞危害更大、威胁更广。 本文接下来会首先介绍利用内核漏洞进行逃逸的思路,重点不在于内核漏洞的利用手法,而是在于提权过后如何进行容器的逃逸。 一、如何利用内核漏洞进行容器逃逸 为了能够更好地展示利用内核漏洞进行容器逃逸的原理,本文将以经典的内核提权漏洞CVE-2017-7308进行阐述。 下一节将从逃逸的角度给出内核漏洞的分析思路,不聚焦于漏洞利用的手段,而是主要关注内核漏洞和容器逃逸的关系。 三、分析思路 在验证漏洞利用程序可以进行本地提权后,应当如何进行容器逃逸? USER containers则是通过user映射实现的,在容器中能够以普通用户的权限执行程序。 2安全防护系统 上文提供了多种防御机制,在启用上述机制的容器系统上逃逸已经变得困难重重。
首先来说下为什么会有逃逸分析 我们都知道Java对象都是分配在在堆上的,在过往的认识中,一直是以这样的方式存在的,但是从Java7开始支持对象的栈分配和逃逸分析机制。 然后我们来说说具体什么是逃逸分析 逃逸分析是一种能有效减少对象在堆上分配和同步负载的跨函数数据流分析算法,逃逸分析通俗的说就是一个对象的指针被多个线程和方法引用时,那我们就称为这个对象发生了逃逸。 逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用。逃逸分析只能在JIT里完成,不能在静态编译时进行。 逃逸分析又分为方法逃逸和线程逃逸。 ,一个是Java虚拟机进行的逃逸分析,一个是根据逃逸分析原理去优化自己的代码 我们先来说下Java虚拟机的逃逸分析 1.堆对象变成栈对象,一个方法中的对象没有发生逃逸,那么该对象就很有可能被分配在栈上 2.同步消除,逃逸分析可以分析出某个对象是否只有一个线程访问,如果是只有一个线程访问,那么对该对象的同步操作就可以消除,就样就能大大提高并发性和性能。
随着容器化技术普及,容器逃逸攻击已成为云原生环境的核心威胁。 本文基于腾讯云容器安全服务(TCSS)的能力,系统阐述容器逃逸攻击的防御策略,通过技术解析与实战案例结合的方式,为企业提供可落地的安全建设方案。 一、容器逃逸攻击:云原生时代的隐形杀手容器逃逸攻击是指攻击者通过漏洞利用或配置缺陷,突破容器沙箱限制,获取宿主机权限的恶性行为。 限制容器特权模式 设置文件读写白名单 基线治理 导入CIS Kubernetes Benchmark模板 自动修复高风险配置项 周期性合规巡检 应急演练 模拟容器逃逸攻击场景 测试日志溯源完整性 更新防御策略库 五、未来趋势与建议随着Kubernetes 1.30引入Seccomp v2和RuntimeClass增强,容器安全呈现三大演进方向: 动态风险评估:基于机器学习的异常行为预测
从上图可以得出结论,在不考虑其他因素的情况下,如果Kata Containers内部的攻击者想要逃逸到宿主机上,他必须至少经过两次逃逸——「容器逃逸」和「虚拟机逃逸」,才能达到目的。 漏洞分析 如「简介」部分所述,从容器到宿主机的逃逸涉及三个漏洞的使用,由「容器逃逸」和「虚拟机逃逸」两部分组成。 其中,容器逃逸涉及到的漏洞是CVE-2020-2023,虚拟机逃逸涉及到的漏洞是CVE-2020-2025和CVE-2020-2026。 ; 2. 总结 纵观云计算与虚拟化技术发展可以发现,从虚拟机到容器再到安全容器,每一种技术都曾出现过逃逸情况。笔者相信,未来还会不断有新的逃逸方式出现。
介绍 最近搞了个检测 Docker 容器逃逸的脚本,目前支持以下几种方法的检测: 处于特权模式 挂载了 Docker Socket 挂载了 Procfs 挂载了宿主机根目录 开启了 Docker 远程 container-escape-check 感觉还不错的师傅们可以点个小星星 对于检测的原理可以看我写的这篇文章:https://zone.huoxian.cn/d/990 使用 在 Docker 容器中一键运行 /container-escape-check.s 注意: 这个脚本需要在 Docker 容器中运行 这里的检测方法大多是基于我自己的经验,可能会存在检测误检或者漏检的情况,如果您发现了这种情况,欢迎提 Issue 由于有的逃逸方法需要根据目标 Docker 的版本去判断,这里我暂时还没想到从容器内部获取 Docker 版本的方法,因此脚本暂时还不支持这块儿的检测。 ---- 往期推荐 漏洞复现 | DirtyPipe CVE-2022-0847 Linux 内核提权漏洞复现 云安全 | 容器基础设施所面临的风险学习 云安全 | AWS S3 对象存储攻防 原文链接