Terraform Security
Información Básica
HashiCorp Terraform es una herramienta de infraestructura como código que te permite definir tanto recursos en la nube como locales en archivos de configuración legibles por humanos que puedes versionar, reutilizar y compartir. Luego puedes utilizar un flujo de trabajo consistente para aprovisionar y gestionar toda tu infraestructura a lo largo de su ciclo de vida. Terraform puede gestionar componentes de bajo nivel como cómputo, almacenamiento y recursos de red, así como componentes de alto nivel como entradas DNS y características de SaaS.
¿Cómo funciona Terraform?
Terraform crea y gestiona recursos en plataformas en la nube y otros servicios a través de sus interfaces de programación de aplicaciones (APIs). Los proveedores permiten que Terraform funcione con prácticamente cualquier plataforma o servicio con una API accesible.
HashiCorp y la comunidad de Terraform ya han escrito más de 1700 proveedores para gestionar miles de tipos diferentes de recursos y servicios, y este número sigue creciendo. Puedes encontrar todos los proveedores públicamente disponibles en el Registro de Terraform, incluyendo Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog, y muchos más.
El flujo de trabajo central de Terraform consta de tres etapas:
Escribir: Defines recursos, que pueden estar en múltiples proveedores de nube y servicios. Por ejemplo, podrías crear una configuración para implementar una aplicación en máquinas virtuales en una red de VPC con grupos de seguridad y un balanceador de carga.
Planificar: Terraform crea un plan de ejecución que describe la infraestructura que creará, actualizará o destruirá en función de la infraestructura existente y tu configuración.
Aplicar: Con la aprobación, Terraform realiza las operaciones propuestas en el orden correcto, respetando las dependencias de recursos. Por ejemplo, si actualizas las propiedades de una VPC y cambias el número de máquinas virtuales en esa VPC, Terraform recreará la VPC antes de escalar las máquinas virtuales.
Laboratorio de Terraform
Simplemente instala Terraform en tu computadora.
Aquí tienes una guía y aquí tienes la mejor forma de descargar Terraform.
RCE en Terraform
Terraform no tiene una plataforma que exponga una página web o un servicio de red que podamos enumerar, por lo tanto, la única forma de comprometer Terraform es poder agregar/modificar archivos de configuración de Terraform.
Sin embargo, Terraform es un componente muy sensible para comprometer porque tendrá acceso privilegiado a diferentes ubicaciones para poder funcionar correctamente.
La principal forma para que un atacante pueda comprometer el sistema donde se está ejecutando Terraform es comprometer el repositorio que almacena las configuraciones de Terraform, porque en algún momento van a ser interpretadas.
De hecho, existen soluciones que ejecutan automáticamente terraform plan/apply después de que se crea un PR, como Atlantis:
Atlantis SecuritySi logras comprometer un archivo de Terraform, hay diferentes formas en las que puedes realizar RCE cuando alguien ejecuta terraform plan
o terraform apply
.
Terraform plan
Terraform plan es el comando más utilizado en Terraform y los desarrolladores/soluciones que utilizan Terraform lo llaman todo el tiempo, por lo que la forma más fácil de obtener RCE es asegurarse de envenenar un archivo de configuración de Terraform que ejecutará comandos arbitrarios en un terraform plan
.
Usando un proveedor externo
Terraform ofrece el proveedor external
que proporciona una forma de interfaz entre Terraform y programas externos. Puedes usar el origen de datos external
para ejecutar código arbitrario durante un plan
.
Inyectar en un archivo de configuración de Terraform algo como lo siguiente ejecutará un shell reverso cuando se ejecute terraform plan
:
Usando un proveedor personalizado
Un atacante podría enviar un proveedor personalizado al Registro de Terraform y luego agregarlo al código de Terraform en una rama de características (ejemplo de aquí):
El proveedor se descarga en el init
y ejecutará el código malicioso cuando se ejecute plan
.
Puedes encontrar un ejemplo en https://github.com/rung/terraform-provider-cmdexec
Usando una referencia externa
Ambas opciones mencionadas son útiles pero no muy sigilosas (la segunda es más sigilosa pero más compleja que la primera). Puedes realizar este ataque de una manera aún más sigilosa, siguiendo estas sugerencias:
En lugar de agregar el rev shell directamente en el archivo de terraform, puedes cargar un recurso externo que contenga el rev shell:
Puedes encontrar el código de rev shell en https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules
En el recurso externo, utiliza la característica ref para ocultar el código de rev shell de Terraform en una rama dentro del repositorio, algo como:
git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b
Aplicar Terraform
Se ejecutará Terraform apply para aplicar todos los cambios, también puedes abusar de él para obtener RCE inyectando un archivo Terraform malicioso con local-exec.
Solo necesitas asegurarte de que algún payload como los siguientes termine en el archivo main.tf
:
Sigue las sugerencias de la técnica anterior para realizar este ataque de una manera más sigilosa utilizando referencias externas.
Volcados de Secretos
Puedes tener valores secretos utilizados por terraform volcados ejecutando terraform apply
agregando al archivo de terraform algo como:
Abusando de los Archivos de Estado de Terraform
En caso de que tengas acceso de escritura sobre los archivos de estado de Terraform pero no puedas cambiar el código de Terraform, esta investigación ofrece algunas opciones interesantes para aprovechar el archivo:
Eliminación de recursos
Existen 2 formas de destruir recursos:
Insertar un recurso con un nombre aleatorio en el archivo de estado apuntando al recurso real a destruir
Debido a que Terraform verá que el recurso no debería existir, lo destruirá (siguiendo el ID del recurso real indicado). Ejemplo de la página anterior:
Modificar el recurso a eliminar de manera que no sea posible actualizarlo (por lo que se eliminará y recreará)
Para una instancia EC2, modificar el tipo de instancia es suficiente para hacer que Terraform la elimine y la vuelva a crear.
RCE
También es posible crear un proveedor personalizado y simplemente reemplazar uno de los proveedores en el archivo de estado de Terraform por el malicioso o agregar un recurso vacío con el proveedor malicioso. Ejemplo de la investigación original:
Reemplazar proveedor en lista negra
En caso de que te encuentres con una situación en la que hashicorp/external
esté en la lista negra, puedes volver a implementar el proveedor external
siguiendo estos pasos. Nota: Utilizamos un fork del proveedor external publicado por https://registry.terraform.io/providers/nazarewk/external/latest. También puedes publicar tu propio fork o re-implementación.
Entonces puedes usar external
como de costumbre.
Herramientas de Auditoría
tfsec: tfsec utiliza análisis estático de tu código terraform para detectar posibles configuraciones incorrectas.
terascan: Terrascan es un analizador de código estático para Infraestructura como Código.
Referencias
Last updated