«PowerShell permite a los usuarios evaluar valores dentro de cadenas antes de utilizarlos», explicó el investigador. “Esto se puede hacer agregando $(
Entonces, por ejemplo, si un atacante proporciona un archivo YAML a un nodo de Kubernetes que se ejecuta en Windows con una subruta que incluye $(Start-Process cmd), kubelet lo enviará a PowerShell durante el proceso de validación de la ruta y será ejecutado con los privilegios de Windows del servicio kubelet – SISTEMA.
Esta vulnerabilidad ahora se rastrea como CVE-2023-3676 y se parchó en Kubernetes 1.28, pero también condujo al descubrimiento y corrección de dos vulnerabilidades de inyección de comandos más similares: CVE-2023-3955 y CVE-2023-3893. La falla afecta a Kubernetes en Windows en su configuración predeterminada, pero el atacante necesita obtener privilegios de aplicación a un nodo.
Cómo mitigar la vulnerabilidad de Kubernetes habilitada para YAML
«El equipo de Kubernetes decidió parchear esta clase de vulnerabilidades pasando parámetros de variables de entorno en lugar de las entradas del usuario», dijo Peled. «Al transmitir los valores de esta manera, los parámetros se tratan como cadenas; por lo tanto, PowerShell no los evaluará como expresiones».
Si no pueden actualizar a la versión parcheada inmediatamente, los administradores pueden desactivar el uso de Volume.Subpath, pero esto también paralizará una característica y funcionalidad de uso común. Otra opción es utilizar Open Policy Agent (OPA), un agente de código abierto que puede tomar acciones basadas en políticas según los datos recibidos. Los administradores pueden crear reglas para bloquear la implementación de ciertos archivos YAML utilizando el lenguaje Rego en OPA, y Akamai proporciona un ejemplo de dicha regla de bloqueo en su publicación de blog.
Peled también recomienda utilizar el control de acceso basado en roles (RBAC) para limitar la cantidad de usuarios que pueden realizar acciones en un clúster.
Actualización: inyección de comandos a través de volúmenes locales de Kubernetes
Otra vulnerabilidad encontrado por Peled tiene un seguimiento como CVE-2023-5528 y se parchó en las versiones 1.28.4, 1.27.8, 1.26.11 y 1.25.16 de Kubernetes lanzadas en noviembre de 2023. La falla es similar a CVE-2023-3676 y afecta Kubernetes en Windows en la configuración predeterminada, pero en lugar de apuntar a la función de volumen subPath, surge de la función de volúmenes locales.
Los volúmenes locales son un tipo de volúmenes admitidos en Kubernetes que permiten a los usuarios montar particiones de disco dentro de un pod, en comparación con los volúmenes hostPath que permiten a los usuarios montar directorios específicos. Un administrador de clúster puede aprovisionar espacio de almacenamiento con anticipación creando un volumen persistente y luego los usuarios pueden usar YAML al configurar un pod para realizar una reclamación de volumen persistente para reclamar parte de ese espacio de almacenamiento.
El problema es que al analizar dichas solicitudes de un archivo YAML, el servicio kubelet solía depender de una función que usaba exec.command para ejecutar un comando en el sistema con el fin de crear un enlace simbólico entre el volumen y la ubicación dentro del pod. La terminal de línea de comandos de Windows acepta la concatenación de comandos (ejecutar múltiples comandos en una sola línea) colocando los caracteres && entre los comandos.
Peled descubrió que un atacante podría colocar comandos en la definición de ruta de persistenteVolumeClaim en YAML y rodearlos con los caracteres && y estos se ejecutarían en el sistema host cuando el servicio kubelet que se ejecuta con privilegios de SISTEMA procese el reclamo. El equipo de Kubernetes solucionó la vulnerabilidad de inyección de comandos reemplazando la llamada cmd realizada por el servicio kubelet con una función en GO llamada “os.Symlink()” que realizará la misma operación de creación de enlaces simbólicos pero de forma segura.