Vulnérabilité dans Python qui permet d'appeler des commandes système à partir de scripts isolés

Une méthode a été publiée pour contourner les systèmes d'exécution de code isolés en Python, basée sur l'utilisation d'un bug connu de longue date apparu dans Python 2.7, identifié en 2012 et n'a pas encore été corrigé dans Python 3. Le bug permet d'utiliser des liens spécialement liés Code Python pour initier l'accès à la mémoire déjà libérée (Use-After-Free) en Python. Initialement, on supposait que l'erreur ne constituait pas une menace pour la sécurité et que ce n'est que dans de très rares cas, généralement créés artificiellement, qu'elle pouvait conduire à une fin anormale du script.

Un chercheur en sécurité sous le pseudonyme de kn32 s'est intéressé au problème et a réussi à préparer un exploit fonctionnel qui permet d'appeler n'importe quelle commande système sans avoir un accès direct à des méthodes comme os.system. L'exploit est implémenté en Python pur et fonctionne sans importer de bibliothèques externes et sans installer le gestionnaire « code.__new__ ». Parmi les hooks, seul « builtin.__id__ » est utilisé, ce qui n'est généralement pas interdit. D'un point de vue pratique, le code proposé peut être utilisé pour contourner les mécanismes d'isolation dans divers services et environnements (par exemple, dans les environnements d'apprentissage, les shells en ligne, les gestionnaires intégrés, etc.), qui permettent l'exécution de code Python, mais limitent la les appels disponibles et n'autorisent pas les méthodes d'appel telles que os.system.

Le code proposé est un analogue de l'appel os.system, qui fonctionne en exploitant une vulnérabilité de CPython. L'exploit fonctionne avec toutes les versions de Python 3 sur les systèmes dotés d'une architecture x86-64 et démontre un fonctionnement stable sur Ubuntu 22.04, même lorsque les modes de protection PIE, RELRO et CET sont activés. Le travail consiste à obtenir des informations du code Python sur l'adresse de l'une des fonctions du code exécutable CPython. Sur la base de cette adresse, l'adresse de base de CPython en mémoire et l'adresse de la fonction system() dans l'instance libc chargée en mémoire sont calculées. À la fin, une transition directe vers une adresse système spécifique est initiée avec la substitution du pointeur du premier argument vers la ligne « /bin/sh ».

Vulnérabilité dans Python qui permet d'appeler des commandes système à partir de scripts isolés


Source: opennet.ru

Ajouter un commentaire