
Detecta y corrige Apache Commons Text vulnerable en artefactos JAR/WAR de Java; identifica clases y analiza el bytecode para encontrar sitios de llamada de CVE-2022-42889 (Text4Shell).
Haz clic para encontrar:
CVE-2022-42889 puede representar una amenaza grave para una amplia gama de aplicaciones basadas en Java. Las preguntas importantes que un desarrollador puede plantearse en este contexto son:
commons-text¿El código publicado incluye commons-text? ¿Qué versión de la librería está incluida? Responder a estas preguntas puede no ser inmediato debido a dos factores:
Dependencias transitivas: aunque commons-text puede no estar en la lista de dependencias directas del proyecto, puede ser utilizado indirectamente por alguna otra dependencia.
El código de esta librería puede no aparecer directamente como un archivo separado, sino estar empaquetado en algún otro archivo jar de código.
JFrog está publicando una herramienta para ayudar a resolver este problema: scan_commons_text_versions. La herramienta busca el código de clase de StringLookupFactory (independientemente de los nombres de los archivos .jar y del contenido de los archivos pom.xml), e intenta identificar las versiones de los objetos para informar si la versión incluida de commons-text es vulnerable.
commons-text?La pregunta es relevante en los casos en los que el desarrollador quiera verificar si las llamadas a commons-text en la base de código pueden pasar datos potencialmente controlados por un atacante. Si bien la forma más segura de corregir la vulnerabilidad, como se analiza en los avisos de seguridad, es aplicar los parches adecuados, controlar y verificar el impacto potencial bajo el supuesto de un commons-text sin parchear puede ser valioso en muchas situaciones.
scan_commons_text_calls_jar.py, que localiza las llamadas a las funciones vulnerables en archivos .jar compilados e informa de los hallazgos como nombre de clase y nombres de método en los que aparece cada llamada.
commons-text vulnerables en mi sistema, ¿cómo puedo deshabilitar rápidamente el comportamiento peligroso?Actualizar sigue siendo la mejor solución: esta solución está pensada para un parcheo en caliente rápido.
En el contexto de la vulnerabilidad CVE-2022-42889, la clase org/apache/commons/text/lookup/ScriptStringLookup en commons-text permite la ejecución de scripts que pueden estar incrustados en una cadena recibida de una fuente controlada por un atacante a través de ${script}. Por lo tanto, las invocaciones de la función ScriptStringLookup.lookup indican que la funcionalidad está activada.
Proporcionamos una herramienta, Text4ShellPatch, que permite parchear esta llamada específica para que la funcionalidad de ejecución de scripts no pueda utilizarse. Después de aplicar el parche, la librería siempre ejecutará un script que devuelve un mensaje de advertencia (en lugar del código potencialmente controlado por un atacante).
De manera similar, las búsquedas DNS y URL pueden cargar contenido no confiable si son controladas por un atacante a través de ${dns} y ${url}; por lo tanto, sus respectivas búsquedas DnsStringLookup y UrlStringLookup pueden deshabilitarse mediante un parche para que devuelvan un mensaje de advertencia,
El parche se puede aplicar a un archivo jar específico, solo para la búsqueda script o para script, dns y url para una mejor protección en caso de que no esté destinado a usarse en la aplicación,
Se genera una copia de seguridad en la misma ubicación que el jar original antes de que sea reemplazado por el parche. El nombre del archivo de copia de seguridad sigue el siguiente patrón: <original_jar_name>_YYYY.MM.DD_HH.mm.ss.orig.jar donde YYYY, MM, DD son respectivamente el año, el mes y el día, y HH, mm, ss son respectivamente la hora, los minutos y los segundos.
También es posible localizar versiones vulnerables de commons-text y parchearlas automáticamente, como se responde en la siguiente pregunta.
commons-text vulnerables?Dos de nuestras herramientas ofrecen conjuntamente la capacidad de escanear y parchear los archivos jar commons-text vulnerables.
En este repositorio de GitHub hay un script bash de ejemplo con el nombre scan_and_patch.sh. Básicamente, utiliza el script scan_commons_text_versions.py para encontrar, bajo una root-folder específica, los archivos jar commons-text vulnerables con una versión vulnerable y ejecutar la herramienta Text4ShellPatch contra ellos de la siguiente manera.

scan_commons_text_versions.pypython scan_commons_text_versions.py root-folder [-quiet] [-exclude folder1 folder2 ..]
La herramienta escaneará root_folder recursivamente en busca de archivos .jar y .war; en cada archivo localizado, la herramienta busca una StringLookupFactory.class (recursivamente en cada archivo .jar). Si se encuentra al menos una de las clases, la herramienta intenta identificar su versión (incluyendo algunas variaciones encontradas en parches y parches retroportados) para informar si el código es vulnerable.
Con la opción -quiet, solo se imprimen las conclusiones sobre la versión, y los demás mensajes (archivos no encontrados, archivos que no pudieron abrirse, archivos protegidos por contraseña) se silencian.
Las carpetas que aparecen después de -exclude (opcional) se omiten.
scan_commons_text_calls_jar.pyLa herramienta requiere Python 3 y las siguientes librerías de terceros: jawa, tqdm, easyargs, colorama
pip install -r requirements.txt
El caso de uso predeterminado:
python scan_commons_text_calls_jar.py root-folder
escaneará recursivamente todos los archivos .jar en root-folder y, para cada uno, imprimirá las ubicaciones (nombre de clase y nombre de método) de las llamadas a los métodos lookup/replace/replaceIn de StringSubstitutor/StringLookup.
La herramienta puede configurarse para casos de uso adicionales mediante los siguientes parámetros de línea de comandos.
| Parámetro | Valor predeterminado | Uso |
|---|---|---|
--class_regex | (.*StringSubstitutor|.*StringLookup) | Expresión regular para el nombre de clase requerido |
--method_regex | (lookup|replace|replaceIn) | Expresión regular para el nombre de método requerido |
--quickmatch_string | (StringLookup|StringSubstitutor) | Precondición para el análisis de archivos: los archivos .jar que no contengan la expresión regular especificada serán ignorados |
--class_existence | No establecido | Cuando no está establecido, busca llamadas a class::method según lo especificado por las expresiones regulares. Cuando está establecido, --method_regex se ignora y la herramienta buscará la existencia de las clases especificadas por --class_regex en el jar. |
--no_quickmatch | No establecido | Cuando está establecido, el valor de --quickmatch_string se ignora y se analizan todos los archivos jar |
--caller_block | .*org/apache/commons/text | Si la clase que llama coincide con esta expresión regular, no se mostrará |
text_4_shell_patchjava -jar Text4ShellPatch.jar TARGET_JAR [PATCHING_MODE]
Where TARGET_JAR is the application to patch and PATCHING_MODE is
0 (default): Patch Script lookup
1: Patch Script + DNS + URL lookups
[Note: The original Jar will be kept in the same folder with the .orig.jar extension]
La herramienta buscará la clase org/apache/commons/text/lookup/ScriptStringLookup en el jar commons-text proporcionado y reemplazará el contenido de la función lookup() por un mensaje de advertencia y retornará de la función. Por lo tanto, el eval no existirá en la nueva clase ScriptStringLookup.
También puede parchear las clases DnsStringLookup y URLStringLookup y deshabilitar la función lookup() cuando la opción PATCHING_MODE se establece en 1.
Durante el proceso se genera un archivo de copia de seguridad en la misma ruta con la extensión .orig.jar.
Text4ShellPatch puede editarse y compilarse con Maven con el simple comando:
mvn clean assembly:single. Se creará un archivo Text4ShellPatch.jar en la carpeta target/.