AWS - Abusing Lambda Extensions
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Las extensiones de Lambda mejoran las funciones al integrarse con varias herramientas de monitoreo, observabilidad, seguridad y gobernanza. Estas extensiones, añadidas a través de .zip archives usando capas de Lambda o incluidas en despliegues de imágenes de contenedor, operan en dos modos: interno y externo.
Las extensiones internas se fusionan con el proceso de ejecución, manipulando su inicio utilizando variables de entorno específicas del lenguaje y scripts envolventes. Esta personalización se aplica a una variedad de entornos de ejecución, incluyendo Java Correto 8 y 11, Node.js 10 y 12, y .NET Core 3.1.
Las extensiones externas se ejecutan como procesos separados, manteniendo la alineación de operación con el ciclo de vida de la función Lambda. Son compatibles con varios entornos de ejecución como Node.js 10 y 12, Python 3.7 y 3.8, Ruby 2.5 y 2.7, Java Corretto 8 y 11, .NET Core 3.1, y entornos de ejecución personalizados.
Para más información sobre cómo funcionan las extensiones de lambda, consulta la documentación.
Este es un resumen de la técnica propuesta en esta publicación: https://www.clearvector.com/blog/lambda-spy/
Se encontró que el kernel de Linux por defecto en el entorno de ejecución de Lambda está compilado con llamadas al sistema “process_vm_readv” y “process_vm_writev”. Y todos los procesos se ejecutan con el mismo ID de usuario, incluso el nuevo proceso creado para la extensión externa. Esto significa que una extensión externa tiene acceso completo de lectura y escritura a la memoria heap de Rapid, por diseño.
Además, aunque las extensiones de Lambda tienen la capacidad de suscribirse a eventos de invocación, AWS no revela los datos en bruto a estas extensiones. Esto asegura que las extensiones no pueden acceder a información sensible transmitida a través de la solicitud HTTP.
El proceso Init (Rapid) monitorea todas las solicitudes de API en http://127.0.0.1:9001 mientras las extensiones de Lambda son inicializadas y ejecutadas antes de la ejecución de cualquier código de tiempo de ejecución, pero después de Rapid.
La variable AWS_LAMBDA_RUNTIME_API
indica la IP y el número de puerto de la API Rapid a los procesos de tiempo de ejecución hijo y extensiones adicionales.
Al cambiar la variable de entorno AWS_LAMBDA_RUNTIME_API
a un puerto
al que tengamos acceso, es posible interceptar todas las acciones dentro del tiempo de ejecución de Lambda (man-in-the-middle). Esto es posible porque la extensión se ejecuta con los mismos privilegios que Rapid Init, y el kernel del sistema permite la modificación de la memoria del proceso, lo que permite la alteración del número de puerto.
Debido a que las extensiones se ejecutan antes de cualquier código de tiempo de ejecución, modificar la variable de entorno influirá en el proceso de tiempo de ejecución (por ejemplo, Python, Java, Node, Ruby) a medida que se inicia. Además, las extensiones cargadas después de la nuestra, que dependen de esta variable, también se enrutarán a través de nuestra extensión. Esta configuración podría permitir que el malware eluda completamente las medidas de seguridad o las extensiones de registro directamente dentro del entorno de tiempo de ejecución.
La herramienta lambda-spy fue creada para realizar esa escritura de memoria y robar información sensible de las solicitudes de lambda, otras solicitudes de extensiones e incluso modificarlas.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)