Actualización de Apache Struts2 a versión 2.5.22 para mitigar vulnerabilidad S2-059

La vulnerabilidad de ejecución remota de código S2-059 (CVE-2019-0230) afecta a Apache Struts2 debido a fallas en el manejo de expresiones OGNL en ciertas etiquetas. Las versiones afectadas oscilan entre la 2.0.0 y la 2.5.20. Para cerrar esta brecha de seguridad crítica, es imperativo actualizar el framework a la versión 2.5.22 o superior.

1. Gestión de Dependencias Maven

En el archivo pom.xml, actualice la versión de los artefactos de Struts2 a 2.5.22. Un cambio importante en esta versión es que struts2-core ahora integra lo que antes era xwork-core, por lo que esta última dependencia debe ser eliminada para evitar conflictos de clases.

<dependencies>
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-core</artifactId>
        <version>2.5.22</version>
    </dependency>
    <!-- Si existe, eliminar la dependencia xwork-core -->
</dependencies>

2. Modificaciones en struts.xml

El archivo de configuración principal requiere tres ajustes fundamentales para ser compatible con la nueva versión.

Actualización del DOCTYPE: La definición DTD debe actualizarse para apuntar a la versión 2.5.



Configuración de Invocación Dinámica: Aunque es opcional, si la aplicación requiere el uso de barras en los nombres de las acciones o invocación dinámica, estas constantes deben habilitarse explícitamente:

<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<constant name="struts.enable.SlashesInActionNames" value="true"/>

Seguridad en Métodos Estrictos: Desde la versión 2.5, Struts habilita por defecto strict-method-invocation para prevenir la ejecución de métodos no autorizados. Si la aplicación utiliza comodiens (wildcards) en los mapeos de acciones, debe desactivarse esta bandera en el paquete o definir los métodos permitidos mediante expresiones regulares.

<package name="paqueteBase" extends="struts-default" strict-method-invocation="false">
    
    <!-- Permitir todos los métodos globalmente mediante regex -->
    <global-allowed-methods>regex:.*</global-allowed-methods>
    
    <action name="procesar_*" method="{1}" class="com.ejemplo.accion.ProcesadorAction">
        <result name="exito"/>/vistas/resultado.jsp</result>
    </action>
    
</package>

3. Ajustes en web.xml

El filtro principal de Struts ha cambiado de paquete. La ubicación antigua en org.apache.struts2.dispatcher.ng.filter ha sido deprecada. Debe actualizarse la clase del filtro eliminando el segmento .ng.

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

4. Corrección de Etiquetas en JSP

En la capa de vista, el atributo id dentro de la etiqueta iteradora (<s:iterator>) ha sido marcado como obsoleto y genera errores en tiempo de ejecución. Debe ser reemplazado por el atributo var. Se recomienda usar una búsqueda con expretiones regulares para realizar este cambio masivo.

Patrón de búsqueda: <s:iterator(.*)id=

Reemplazo: <s:iterator$1var=

Ejemplo del cambio resultante:

<!-- Código Antiguo -->
<s:iterator value="listaUsuarios" id="usuarioActual">

<!-- Código Corregido -->
<s:iterator value="listaUsuarios" var="usuarioActual">

Etiquetas: Apache Struts2 S2-059 CVE-2019-0230 Java security maven

Publicado el 9-6 15:10