当一个容器共享宿主机 PID namespace、且以 uid 为 0 运行(没有启用 user namespace、没有添加任何额外的 capabilities)时,可以利用某些进程的 /proc/[pid]/root 符号链接实现容器逃逸。
作为 Kubernetes中各种恶意Pod构建以及利用 中【只允许hostPid】的补充。
/proc/[pid]/root 符号链接
Linux 中,每个进程都有一个对应的 /proc/[pid]/root
符号链接,它指向该进程的根文件系统(rootfs)。通过访问这个符号链接,可以获取到进程的根文件系统路径
在默认配置下,所有容器进程拥有相同的能力集,所以共享了宿主机 PID namespace 的容器能够访问其它容器进程的 rootfs。一般情况下容器中的各种用户访问不了宿主机上以非 root 用户运行的进程的rootfs,更访问不了宿主机上以 root 用户运行的进程的 rootfs,但是当使用特定用户时,就可以突破这些限制。
创建一个共享宿主机 PID namespace 的 Pod
docker pull alpine:latest
kind load docker-image --name demo alpine:latest
yaml文件
apiVersion: v1
kind: Pod
metadata:
name: demo
labels:
app: demo
spec:
hostPID: true
containers:
- name: demo
image: docker.io/library/alpine:latest
command: [ "/bin/sh", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
dnsPolicy: ClusterFirst
restartPolicy: Always