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 Lambda layers o incluidas en despliegues de imágenes de contenedores, operan en dos modos: interno y externo.
Extensiones internas se fusionan con el proceso de runtime, manipulando su inicio usando variables de entorno específicas del lenguaje y scripts wrapper. Esta personalización se aplica a una variedad de runtimes, incluyendo Java Correto 8 y 11, Node.js 10 y 12, y .NET Core 3.1.
Extensiones externas se ejecutan como procesos separados, manteniendo la alineación operativa con el ciclo de vida de la función Lambda. Son compatibles con varios runtimes 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 runtimes personalizados.
Para más información sobre cómo funcionan las extensiones de lambda revisa 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 este post: https://www.clearvector.com/blog/lambda-spy/
Se encontró que el kernel de Linux predeterminado en el entorno de runtime de Lambda está compilado con las 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 puedan 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 se inicializan y ejecutan antes de la ejecución de cualquier código de runtime, pero después de Rapid.
La variable AWS_LAMBDA_RUNTIME_API
indica la dirección IP y el número de puerto de la API de Rapid a procesos de runtime 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 runtime 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 runtime, modificar la variable de entorno influirá en el proceso de runtime (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 evite por completo las medidas de seguridad o las extensiones de registro directamente dentro del entorno de runtime.
La herramienta lambda-spy fue creada para realizar esa escritura de memoria y robar información sensible de solicitudes de lambda, otras solicitudes de extensiones e incluso modificarlas.
Referencias
Last updated