AWS - Abusing Lambda Extensions

Supportez HackTricks

Extensions Lambda

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 des couches Lambda ou incluses dans les déploiements d'images de conteneur, fonctionnent en deux modes : interne et externe.

  • Les extensions internes fusionnent avec le processus d'exécution, manipulant son démarrage à l'aide de variables d'environnement spécifiques au langage et de scripts d'enveloppe. 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 s'exécutent en tant que processus séparés, maintenant l'alignement opérationnel 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 des requêtes

Voici un résumé de la technique proposée dans ce post : https://www.clearvector.com/blog/lambda-spy/

Il a été constaté 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 en é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 pendant que les extensions Lambda sont initialisées et s'exécutent avant l'exécution de tout code d'exécution, 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 d'exécution 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 de l'exécution 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 l'altération du numéro de port.

Parce que les extensions s'exécutent avant tout code d'exécution, modifier la variable d'environnement influencera le processus d'exécution (par exemple, Python, Java, Node, Ruby) au 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 logiciel malveillant de contourner complètement les mesures de sécurité ou les extensions de journalisation directement dans l'environnement d'exécution.

L'outil lambda-spy a été créé pour effectuer cette écriture en mémoire et voler des informations sensibles des requêtes lambda, d'autres requêtes d'extensions et même les modifier.

Références

Supportez HackTricks

Last updated