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">