Linux 容器(Docker、containerd、Kubernetes 等)的核心安全风险源于其共享宿主机内核的本质,隔离性弱于虚拟机,主要风险集中在容器逃逸、镜像安全、权限配置、网络、编排平台、供应链、内核漏洞七大方面。
容器逃逸(最核心高危风险)
核心本质
容器基于Linux 隔离技术实现:
- 隔离:
Namespace(PID / 挂载 / 网络 / 用户等) - 限制:
Cgroup(资源)、Capabilities、Seccomp、AppArmor/SELinux - 致命短板:所有容器共享宿主机内核
容器内的 root 是受限 root,一旦绕过隔离 / 限制,直接读写内核、访问宿主机资源,实现容器→宿主机完全控制,即为容器逃逸。
攻击者突破容器边界,获取宿主机 root 权限,进而控制整个节点与集群。
容器逃逸 五大主流分类
1. 配置错误逃逸(最常见、最易利用)
人为配置不当导致边界直接敞开,无漏洞也能逃逸。
特权容器逃逸,启动参数:
--privileged- 关闭所有容器安全限制、解除设备挂载限制
- 容器内可直接访问
/dev/sda、挂载宿主机根分区
# 逃逸操作 mount /dev/sda1 /mnt # 直接读写宿主机全盘文件危险挂载逃逸
- 挂载
/var/run/docker.sock:调用 docker API,创建特权容器、篡改宿主机镜像 / 容器 - 挂载宿主机根目录
:/host:直接遍历、修改宿主机所有文件 - 挂载
/proc/sys:篡改内核参数提权(如core_pattern注入命令)
- 挂载
高危 Capability 授予,开启
CAP_SYS_ADMIN、CAP_MODULES、CAP_SYS_MOUNT等:- 允许挂载任意文件系统、加载内核模块、修改挂载命名空间,直接突破隔离。
Cgroup v1 机制滥用(经典逃逸)利用
release_agent+ 通知触发,容器内写入恶意命令,宿主机以 root 执行。
2. 容器运行时漏洞逃逸(runc/containerd)
容器底层 runtime 代码漏洞,突破容器隔离逻辑。
CVE-2019-5736 runc 逃逸(经典标杆)
- 原理:容器内覆盖宿主机
runc二进制文件 - 危害:后续宿主机执行 runc 时,恶意代码以 host root 执行
- 影响:Docker、K8s 大范围受影响
- 原理:容器内覆盖宿主机
CVE-2024-21626 Leaky Vessels
- 组件:BuildKit、runc
- 原理:文件描述符泄露,跨容器 / 宿主机读取文件
- 场景:镜像构建、容器启动阶段触发
containerd 高权限 API 越权、沙箱绕过漏洞
3. 内核漏洞逃逸(杀伤力最强、通用)
共享内核是容器最大弱点,只要宿主机内核存在漏洞,容器内即可触发。
Dirty COW CVE-2016-5195
- 内核写时复制竞态漏洞
- 容器内篡改宿主机只读文件(/etc/passwd、sudo 等),提权逃逸
Dirty Pipe CVE-2022-0847
- Linux 管道缓冲区漏洞
- 低权限即可覆写宿主机任意文件,利用简单、成功率极高
- Leaky Vessels (CVE-2024-21626):BuildKit/runc 漏洞,镜像构建 / 启动阶段逃逸
通用内核提权栈溢出、UAF、页表滥用、设备驱动漏洞,容器内直接提权到内核态,完全接管宿主机。
4. 命名空间 & 用户隔离绕过
- User Namespace 配置缺陷错误的 UID/GID 映射、idmapping 绕过,容器内 root 映射到宿主机高权限用户。
- Mount Namespace 突破借助绑定挂载、绑定挂载复刻,跨命名空间访问宿主机挂载点。
5. 编排平台逃逸(K8s 场景专属)
- 挂载
hostPath敏感目录 hostNetwork、hostPID、hostUsers直接共享主机资源- K8s RBAC 权限过大,通过 api-server 操控节点
- 节点本地服务、kubelet 未认证接口漏洞
容器内 root 与 宿主机 root 区别
| 维度 | 容器内 root | 宿主机 root |
|---|---|---|
| 内核权限 | 受 Seccomp/Cap 限制 | 完全内核权限 |
| 访问设备 | 默认禁止访问物理设备 | 可读写所有设备 |
| 挂载能力 | 受限 | 任意挂载 |
| 影响范围 | 仅当前容器 | 整节点 / 集群 |
逃逸的本质:让容器内进程获得宿主机级别的内核 / 设备 / 文件访问权限。
高频简易逃逸手法
- 拥有
docker.sock挂载
# 拉取镜像、启动特权容器完成逃逸 docker run -it --privileged --pid=host alpine开启 CAP_SYS_ADMIN + Cgroup v1利用 release_agent 构造命令,触发宿主机执行。
内核 EXP 直接提权容器内编译 / 加载 DirtyPipe 等 exp,一键写入宿主机
/etc/crontab反弹 shell。
关键防御方案(针对性封堵逃逸)
1. 杜绝配置类逃逸(最高优先级)
- 禁止
--privileged特权容器 - 禁止挂载:
docker.sock、宿主机根、/proc、/sys - 最小化 Capabilities:删除
SYS_ADMIN、SYS_MOUNT、MODULES - 禁用
hostPID/hostNetwork/hostPath敏感字段(K8s)
2. 强化运行时隔离
- 启用Seccomp系统调用黑名单
- 启用AppArmor / SELinux强制访问控制
- 限制 Cgroup 权限,关闭不安全 Cgroup v1 特性
3. 内核与组件加固
- 定期修复 Linux 内核高危漏洞(Dirty 系列、本地提权漏洞)
- 及时升级 runc、containerd、docker、k8s 版本
- 内核加固:禁用无用设备、关闭不安全内核参数
4. 容器运行时最小权限
- 容器禁止以 root 运行,使用普通业务用户
- 开启 UserNamespace UID 映射隔离
- 限制 PID / 内存 / 进程数,防止资源耗尽辅助逃逸
5. 编排层防护
- K8s 启用PSA/PodSecurityPolicy禁止高危 Pod 配置
- 严格 RBAC、限制 ServiceAccount 权限
- 网络策略限制容器横向访问
容器镜像安全风险
- 恶意 / 漏洞镜像:含后门、挖矿、病毒;基础镜像(Ubuntu/Alpine)带高危漏洞
- 硬编码敏感信息:密码、密钥、Token 固化在镜像中
- 镜像篡改 / 投毒:仓库被入侵、中间人替换、标签劫持
- 大攻击面:臃肿镜像含多余工具、库、端口
权限与配置风险
- 默认 root 运行:容器内 root ≈ 宿主机弱 root,易提权 / 逃逸国家保密局
- Capability 滥用:默认保留
NET_RAW、SYS_CHROOT等危险能力 - 用户命名空间(User NS):容器内 root 映射外部非 root,但扩内核攻击面
- 资源限制缺失:无 CPU / 内存 / PID 限制,易 DoS 拖垮主机国家保密局
- Seccomp/AppArmor/SELinux 未启用:无系统调用 / 文件访问过滤,漏洞易被利用
网络安全风险
- 默认全通通信:Kubernetes/Docker 缺省无网络策略,横向移动极易
- 端口过度暴露:22/2375/6443 等管理端口公网开放、弱认证
- 服务暴露风险:NodePort/hostNetwork 直接绑定主机网络,扩大攻击面
- DNS 劫持 / 污染:容器 DNS 被劫持,导向恶意服务
编排平台(K8s)安全风险
- RBAC 过度授权:ServiceAccount 权限过大、匿名用户可访问 API
- Secret 明文风险:etcd 未加密、挂载为明文文件、日志泄露
- Pod 安全策略失效:PSP/PSA 宽松,允许特权、主机路径、提权
- API Server/etcd 暴露:未 TLS、弱认证、公网可访问
供应链与构建风险
- CI/CD 管道入侵:构建服务器被控,镜像植入后门
- 第三方依赖漏洞:npm/pip/apt 引入恶意 / 漏洞库
- 不安全构建:
curl | bash、使用latest标签、未签名镜像
其他关键风险
- 侧信道攻击:共享 CPU / 缓存 / 内存, Spectre/Meltdown 类漏洞跨容器窃取数据
- 资源耗尽攻击:CPU / 内存 / 磁盘 / 进程耗尽,导致宿主机宕机国家保密局
- 日志与审计缺失:无容器行为审计,攻击后无法溯源
风险速览表
| 风险类别 | 典型危害 | 关键触发点 |
|---|---|---|
| 容器逃逸 | 宿主机沦陷、集群被控 | 特权、危险挂载、内核 / 运行时漏洞 |
| 镜像漏洞 | 容器被入侵、数据泄露 | 未扫描、使用latest、含硬编码密钥 |
| 权限过大 | 易提权、易逃逸 | root 运行、危险 Capabilities、UserNS 误用 |
| 网络开放 | 横向移动、端口扫描 | 无网络策略、NodePort/hostNetwork、公网暴露 |
| K8s 配置错 | 集群权限失守 | RBAC 过宽、Secret 明文、PSA 宽松 |
| 共享内核 | 一损全损 | 内核未补丁、高危漏洞未修复 |
核心防护要点
- 禁止特权:禁用
--privileged,最小 Capabilities - 安全挂载:严禁
docker.sock、/、/proc等敏感挂载 - 最小镜像:使用 distroless/scratch,固定版本、签名、漏洞扫描
- 非 root 运行:
USER 10001,启用用户命名空间 - 启用安全机制:Seccomp/AppArmor/SELinux、资源限制
- K8s 加固:严格 RBAC、加密 Secret、启用 PSA、网络策略
- 内核及时补丁:定期更新、高危漏洞优先修复