没有合适的资源?快使用搜索试试~ 我知道了~
CVE-2017-1002101:突破隔离访问宿主机文件系统1
需积分: 0 1 下载量 3 浏览量
2022-08-03
16:56:38
上传
评论
收藏 267KB PDF 举报
温馨提示
试读
14页
CVE-2017-1002101:突破隔离访问宿主机文件系统1
资源详情
资源评论
资源推荐
CVE-2017-1002101:突破隔离访问宿主机⽂件系
统
简介
CVE-2017-1002101是⼀个Kubernetes的⽂件系统逃逸漏洞,允许攻击者使⽤ subPath 卷挂载来访问卷空间外的
⽂件或⽬录,CVSS 3.x评分为9.8[1]。所有 v1.3.x 、 v1.4.x 、 v1.5.x 、 v1.6.x 及低于 v1.7.14 、 v1.8.9 和
v1.9.4 版本的Kubernetes均受到影响。该漏洞由Maxim Ivanov提交[2]。
后来,Kubernetes官⽅还公布了⼀个类似效果的漏洞,编号为CVE-2017-1002102[3],CVSS 3.x评分只有5.6[3],
对此我们不再介绍,感兴趣的读者可以⾃⾏了解。
下⾯,我们⾸先给出理解该漏洞所必要的背景知识,然后对漏洞进⾏分析,接着进⾏漏洞复现实战,最后给出漏洞
的修复情况,并作总结与思考。
背景知识
符号链接
符号链接,也被称作软链接,指的是这样⼀类⽂件——它们包含了指向其他⽂件或⽬录的绝对或相对路径的引⽤。
当我们操作⼀个符号链接时,操作系统通常会将我们的操作⾃动解析为针对符号链接指向的⽂件或⽬录的操作。
在类Unix系统中, ln 命令能够创建⼀个符号链接,例如:
上述命令创建了⼀个名为 link_path 的符号链接,它指向的⽬标⽂件为 target_path 。
欲了解更多关于符号链接的内容,可以参考维基百科[5]。
SubPath
在容器内部,本地⽂件通常是⾮持久化的。对于Kubernetes来说,当容器由于某种原因终⽌运⾏并被Kubelet重启
后,⾮持久化的本地⽂件就会丢失;另外,集群中同⼀Pod内部或Pod间常常会有⽂件共享的需求。Kubernetes提
供了Volume资源⽤来解决上述问题,官⽅⽂档对Volume进⾏了详尽描述[12]。
有时,我们需要把⼀个Volume在多处使⽤。 volumeMounts.subPath 特性允许我们在挂载时指定某Volume内的
⼦路径,⽽⾮其根路径。
以经典的LAMP Pod(Linux Apache Mysql PHP)为例,采⽤ subPath 特性,同⼀Pod内的 mysql 和 php 容器可
共享同⼀Volume site-data ,但在容器内部分别挂载该Volume的不同⼦路径 mysql 和 html :
ln -s target_path link_path1
apiVersion: v1
kind: Pod
metadata:
name: my-lamp-site
spec:
containers:
1
2
3
4
5
6
控制的⻆度 字段名称
运⾏特权容器 privileged
使⽤宿主机命名空间 hostPID , hostIPC
使⽤宿主机的⽹络和端⼝ hostNetwork , hostPorts
Volume类型的使⽤ volumes
使⽤宿主机⽂件系统 allowedHostPaths
允许使⽤特定的FlexVolume驱动 allowedFlexVolumes
分配拥有Pod卷的FSGroup账号 fsGroup
以只读⽅式访问根⽂件系统 readOnlyRootFilesystem
设置容器的⽤户ID和组ID runAsUser , runAsGroup , supplementalGroups
限制权限提升为root allowPrivilegeEscalation , defaultAllowPrivilegeEscalation
Linux 权能(Capabilities) defaultAddCapabilities , requireDropCapabilities , allowedCapabilities
设置容器的SELinux上下⽂ seLinux
指定容器能挂载的Proc类型 allowedProcMountTypes
指定容器使⽤的AppArmor模板 annotations
指定容器使⽤的seccomp模板 annotations
指定容器使⽤的sysctl模板 forbiddenSysctls , allowedUnsafeSysctls
欲了解更多关于SubPath的内容,可以参考官⽅⽂档[6]。
Pod安全策略(Pod Security Policies)
Pod安全策略为Pod的创建和更新提供了细粒度的权限控制。从实现上来讲,Pod安全策略是⼀种集群级资源,⽤
于对Pod的安全敏感设定进⾏管控。
PodSecurityPolicy对象定义了⼀系列Pod运⾏必须遵从的条件,允许管理员对Pod进⾏管控,例如:
- name: mysql
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "rootpasswd"
volumeMounts:
- mountPath: /var/lib/mysql
name: site-data
subPath: mysql
- name: php
image: php:7.0-apache
volumeMounts:
- mountPath: /var/www/html
name: site-data
subPath: html
volumes:
- name: site-data
persistentVolumeClaim:
claimName: my-lamp-site-data
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
欲了解更多关于Pod安全策略的内容及如何启⽤Pod安全策略,可以参考官⽅⽂档[7]。
漏洞分析
在针对CVE-2017-1002101的分析开始之前,我们先要搞清楚⼀件事——这个漏洞本质上是「Linux符号链接特性」
与「Kubernetes⾃身代码逻辑」两部分结合的产物。符号链接引起的问题并不新鲜,这⾥它与虚拟化隔离技术碰撞
出了逃逸问题,以前还曾有过在传统主机安全领域与SUID概念碰撞出的权限提升问题等,感兴趣的读者深⼊了解⼀
下[13]。
⾔归正传。漏洞是怎么产⽣的呢?
我们⾸先来结合源码,深⼊看⼀下创建⼀个Pod的过程中与Volume有关的部分。笔者采⽤的是 v1.9.3 版本的
Kubernetes源码,git commit为 d2835416544 。
在⼀个Pod开始运⾏前,Kubernetes需要做许多事情。⾸先,Kubelet为Pod在宿主机上创建了⼀个基础⽬录:
如果跟进看 makePodDataDirs 函数,可以发现其中就包括Volumes⽬录:
接着,Kubelet等待Kubelet Volume Manager( pkg/kubelet/volumemanager )将Pod声明⽂件中声明的卷挂
载到上述Volumes⽬录下:
// in pkg/kubelet/kubelet.go syncPod function
// Make data directories for the pod
if err := kl.makePodDataDirs(pod); err != nil {
kl.recorder.Eventf(pod, v1.EventTypeWarning,
events.FailedToMakePodDataDirectories, "error making pod data directories: %v", err)
glog.Errorf("Unable to make pod data directories for pod %q: %v",
format.Pod(pod), err)
return err
}
1
2
3
4
5
6
7
// in pkg/kubelet/kubelet_pods.go
// makePodDataDirs creates the dirs for the pod datas.
func (kl *Kubelet) makePodDataDirs(pod *v1.Pod) error {
uid := pod.UID
// ...
if err := os.MkdirAll(kl.getPodVolumesDir(uid), 0750); err != nil &&
!os.IsExist(err) {
return err
}
// ...
}
1
2
3
4
5
6
7
8
9
10
剩余13页未读,继续阅读
尹子先生
- 粉丝: 20
- 资源: 324
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0