AWS - Abusing Lambda Extensions
Lambda Extensions
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.
Extensión Externa para Persistencia, Robo de Solicitudes y Modificación de Solicitudes
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 de Rapid a los procesos de tiempo de ejecución secundarios 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 comienza. 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.
References
Last updated