AWS - Abusing Lambda Extensions
Lambda Extensions
Les extensions Lambda améliorent les fonctions en s'intégrant à divers outils de surveillance, d'observabilité, de sécurité et de gouvernance. Ces extensions, ajoutées via des .zip archives utilisant les couches Lambda ou incluses dans les déploiements d'images de conteneurs, fonctionnent en deux modes : interne et externe.
Les extensions internes se fusionnent avec le processus d'exécution, manipulant son démarrage en utilisant des variables d'environnement spécifiques au langage et des scripts de wrapper. Cette personnalisation s'applique à une gamme de runtimes, y compris Java Correto 8 et 11, Node.js 10 et 12, et .NET Core 3.1.
Les extensions externes fonctionnent comme des processus séparés, maintenant l'alignement des opérations avec le cycle de vie de la fonction Lambda. Elles sont compatibles avec divers runtimes comme Node.js 10 et 12, Python 3.7 et 3.8, Ruby 2.5 et 2.7, Java Corretto 8 et 11, .NET Core 3.1, et runtimes personnalisés.
Pour plus d'informations sur comment fonctionnent les extensions lambda, consultez la documentation.
Extension Externe pour la Persistance, le Vol de Requêtes et la Modification de Requêtes
Voici un résumé de la technique proposée dans cet article : https://www.clearvector.com/blog/lambda-spy/
Il a été découvert que le noyau Linux par défaut dans l'environnement d'exécution Lambda est compilé avec les appels système “process_vm_readv” et “process_vm_writev”. Et tous les processus s'exécutent avec le même ID utilisateur, même le nouveau processus créé pour l'extension externe. Cela signifie qu'une extension externe a un accès complet en lecture et écriture à la mémoire heap de Rapid, par conception.
De plus, bien que les extensions Lambda aient la capacité de s'abonner aux événements d'invocation, AWS ne révèle pas les données brutes à ces extensions. Cela garantit que les extensions ne peuvent pas accéder aux informations sensibles transmises via la requête HTTP.
Le processus Init (Rapid) surveille toutes les requêtes API à http://127.0.0.1:9001 tandis que les extensions Lambda sont initialisées et exécutées avant l'exécution de tout code runtime, mais après Rapid.
La variable AWS_LAMBDA_RUNTIME_API
indique l'adresse IP et le numéro de port de l'API Rapid aux processus runtime enfants et aux extensions supplémentaires.
En changeant la variable d'environnement AWS_LAMBDA_RUNTIME_API
à un port
auquel nous avons accès, il est possible d'intercepter toutes les actions au sein du runtime Lambda (man-in-the-middle). Cela est possible car l'extension s'exécute avec les mêmes privilèges que Rapid Init, et le noyau du système permet la modification de la mémoire des processus, permettant ainsi de changer le numéro de port.
Parce que les extensions s'exécutent avant tout code runtime, la modification de la variable d'environnement influencera le processus runtime (par exemple, Python, Java, Node, Ruby) à son démarrage. De plus, les extensions chargées après la nôtre, qui dépendent de cette variable, passeront également par notre extension. Cette configuration pourrait permettre à un malware de contourner entièrement les mesures de sécurité ou les extensions de journalisation directement dans l'environnement runtime.
L'outil lambda-spy a été créé pour effectuer cette écriture en mémoire et voler des informations sensibles des requêtes lambda, des requêtes d'autres extensions et même les modifier.
Références
Last updated